/*
Biblioteca de funções genéricas
===============================*/

//-------------------------------
//Estruturas de dados de uso geral
//-------------------------------

function DataClass(dia, mes, ano) {
        this.dia= dia;
        this.mes= mes;
        this.ano= ano;
}

diasDoMes = new Array(13);
diasDoMes[1] = 31;
diasDoMes[2] = 29;
diasDoMes[3] = 31;
diasDoMes[4] = 30;
diasDoMes[5] = 31;
diasDoMes[6] = 30;
diasDoMes[7] = 31;
diasDoMes[8] = 31;
diasDoMes[9] = 30;
diasDoMes[10] = 31;
diasDoMes[11] = 30;
diasDoMes[12] = 31;

diasDaSemana = new Array(7);
diasDaSemana[0] = "domingo";
diasDaSemana[1] = "segunda-feira";
diasDaSemana[2] = "terça-feira";
diasDaSemana[3] = "quarta-feira";
diasDaSemana[4] = "quinta-feira";
diasDaSemana[5] = "sexta-feira";
diasDaSemana[6] = "sábado";

meses = new Array(12);
meses[0] = "Janeiro";
meses[1] = "Fevereiro";
meses[2] = "Março";
meses[3] = "Abril";
meses[4] = "Maio";
meses[5] = "Junho";
meses[6] = "Julho";
meses[7] = "Agosto";
meses[8] = "Setembro";
meses[9] = "Outubro";
meses[10] = "Novembro";
meses[11] = "Dezembro";

var today= new Date();
var thisYear= today.getFullYear();
var thisMonth= today.getMonth();
var thisDay= today.getDate();
var thisWeekDay= diasDaSemana[today.getDay()];
var thisMonthName= meses[thisMonth];

//-------------------------------
function isEmpty (s){
        return ((s == null) || (s == ""))
}
//-------------------------------
function isDigit (c){
        return ((c >= "0") && (c <= "9"))
}
//-------------------------------
function isIntegerInRange (s, a, b)
{
        return ((s >= a) && (s <= b));
}

//=============================================================
// Funções para operações com datas
//=============================================================
//-------------------------------
function isMes(s) {
        return isIntegerInRange(s, 1, 12);
}
//-------------------------------
function isDia(s) {
        return isIntegerInRange(s, 1, 31);
}
//-------------------------------
function isAno(s) {
        if((s < 1900) || (s > 9999)) return false;
        return true;
}
//-------------------------------
function diasInFevereiro (ano){
    return (((ano % 4 == 0) && ((!(ano % 100 == 0)) || (ano % 400 == 0))) ? 29 : 28 );
}

//-------------------------------
// Função que separa os componentes (dia, mes e ano) de um string de data
// Formatos possíveis:
//                ddmmaaaa, d/m/aaaa, dd/m/aaaa, d/mm/aaaa, dd/mm/aaaa
function splitDate(dtStr) {
        var aDate= new DataClass();
		var arrayStrDt= dtStr.split("/");
		if(arrayStrDt.length > 0) {
			aDate.dia= parseInt(arrayStrDt[0], 10);
			aDate.mes= parseInt(arrayStrDt[1], 10);
			aDate.ano= parseInt(arrayStrDt[2], 10);
		}
        return aDate;
}
//-------------------------------
//Argumentos são INTEIROS representando o dia, mes e ano
//a serem validados
function validaData (dia, mes, ano) {
        if ((dia == 0) || (mes == 0) || (ano == 0)) return false;
        if (!(isAno(ano) && isMes(mes) && isDia(dia))) return false;
        if (dia > diasDoMes[mes]) return false;
        if ((mes == 2) && (dia > diasInFevereiro(ano))) return false;
        return true;
}

//--------------------------------
//Argumento é uma caixa de texto
//cujo conteúdo deve ser uma data
function validaCxDt(caixa) {
	return validaTxtDt(caixa.value);
}

//--------------------------------
//Argumento é um texto
//cujo conteúdo deve ser uma data
function validaTxtDt(dtStr) {
	var date= new DataClass();
	date= splitDate(dtStr);
	if(!validaData(date.dia, date.mes, date.ano))
		return false;
	return true;
}

//Recebe dois strings representando datas
//Retorna um valor negativo se data2 maior do que data1,
//um valor positivo se data1 for maior do que data2 ou
//zero se as datas forem iguais

function dateComp(data1, data2) {
        var dc1= new DataClass();
        var dc2= new DataClass();
        dc1= splitDate(data1);
        dc2= splitDate(data2);
        var d1= new Date(dc1.ano, (dc1.mes - 1), dc1.dia);
        var d2= new Date(dc2.ano, (dc2.mes - 1), dc2.dia);
        return d1.getTime() - d2.getTime();
}

//--------------------------------
// Retorna uma data que representa
// a data fornecida como argumento
// avançada o número de dias fornecido

function advanceDate(aDate, days) {
	var msPerDay= 24 * 60 * 60 * 1000 ; // Number of milliseconds per day 
	var msAdvance= days * msPerDay;
	var newDate= new Date();
	newDate.setTime(aDate.getTime() + msAdvance);
	return newDate;
}

//-------------------------------------------------
// Retorna uma data que representa
// a data fornecida como argumento (formato String)
// avançada o número de dias fornecido

function advanceDtStr(aDateStr, days) {
	var dt= new DataClass();
	dt= splitDate(aDateStr);
	if(!validaTxtDt(aDateStr)) {
		alert("Data inválida");
		return;
	}
	if(isNaN(parseInt(days, 10))) {
		alert("Nr. dias para avançar inválido.");
		return;
	}
	var dtStr= dt.ano + "/" + dt.mes + "/" + dt.dia;

	var aDate= new Date(dtStr);
	var advcDate= advanceDate(aDate, days);
	return advcDate.getDate() + "/" + (1 + advcDate.getMonth()) + "/" + advcDate.getYear();
}

//=============================================================
// Funções para operações com Strings
//=============================================================
//ADICIONA UM MÉTODO TRIM AO OBJETO STRING
String.prototype.trim = function()
	{
    	return this.replace( /(^\s*)|(\s*$)/g , "");
	}

//=================================
// Funções para validar CPF e CNPJ
//=================================

//--------------------------------
//Argumento é um campo
//cujo conteúdo deve ser um CPF válido
function validaCPF(fieldCPF) {
	var cpf= new String(fieldCPF.value);
	
	cpf= cpf.replace(/[.-]/g, '');
	if(cpf.length != 11)
		return false;

	dv = 0;
	for(i=0; i < 9; i++)
		dv+= cpf.charAt(i) * (10-i);
	dv = 11 - (dv % 11);
	if(dv > 9) dv= 0;

	if (cpf.charAt(9) != dv)
		return false;

	dv*= 2;

	for(i=0; i < 9; i++)
		dv+= cpf.charAt(i) * (11-i);
	dv = 11 - (dv % 11);
	if(dv > 9) dv= 0;

	if(cpf.charAt(10) != dv)
		return false;

	return true;
}

function isCNPJ(fieldCNPJ) {
	var cnpj= new String(fieldCNPJ.value);
	
	cnpj= cnpj.replace(/[./-]/g, '');
	if(cnpj.length != 14)
		return false;

	var dig1=0;
	var dig2=0;
	var x;
	var Mult1 = '543298765432';
	var Mult2 = '6543298765432';

	for(x=0; x<=11; x++)
		dig1 = dig1 + ( parseInt(cnpj.slice(x,x+1), 10) * parseInt(Mult1.slice(x,x+1), 10) );
	for(x=0; x<=12; x++)
		dig2 = dig2 + ( parseInt(cnpj.slice(x, x+1), 10) * parseInt(Mult2.slice(x,x+1), 10) );

	dig1 = (dig1 * 10)%11;
	dig2 = (dig2 * 10)%11;
		
	if (dig1 == 10) dig1 = 0;
	if (dig2 == 10) dig2 = 0;

	if (dig1 != parseInt(cnpj.slice(12, 13), 10))
		return false;
	if (dig2 != parseInt(cnpj.slice(13, 14), 10))
		return false;

	return true;
}
