// Coleção de números
var M_NUMEROS = '0123456789';

// Retorna n caracteres a esquerda de uma string.
function left(onde, quantos) {
if(quantos >= onde.length) return(onde); else
return(onde.substr(0, quantos)); }

// Retorna n caracteres a direita de uma string.
function right(onde, quantos) {
if(quantos >= onde.length) return(onde); else
return(onde.substr(onde.length - quantos, quantos)); }


// Remove espaços a esquerda do texto
function lTrim(palavra) {
if(palavra.length == 0) {
	return(palavra);
} else {
	if(palavra.substr(0, 1) == ' ') {
		return(lTrim(palavra.substr(1, palavra.length - 1)));
	} else {
		return(palavra);		
		}
	}
}

// Remove espaços a direita do texto
function rTrim(palavra) {
if(palavra.length == 0) {
	return(palavra);
} else {
	if(palavra.substr(palavra.length - 1, 1) == ' ') {
		return(rTrim(palavra.substr(0, palavra.length - 1)));
	} else {
		return(palavra);
		}
	}
}

// Faz o trim: remove espaços a esquerda e a direita do texto
function trim(palavra) {
return(lTrim(rTrim(palavra)));
}

function IsValid(Source)
{
	var I=0;			//CONTADOR DE USO GERAL
	var Texto="";		//VALOR A SER TESTADO
	var Lista="";		//LISTA DE VALORES VALIDOS
	
	Texto=Source;
	Lista="0123456789-";
	for (I=0;I<Lista.length;I++)
	{//CAMINHA EM CADA CARACTERE DO FILTRO
		if (Lista.indexOf(Texto.charAt(I),0)==-1)
		{//ACHOU UM CARACTERE INVALIDO
			return(false);
		}//if
	}//for
	return(true);
}


function IsNumber(Source)
{
	var I=0;			//CONTADOR DE USO GERAL
	var Texto="";		//VALOR A SER TESTADO
	var Lista="";		//LISTA DE VALORES VALIDOS
	
	Texto=Source;
	Lista="0123456789";
	for (I=0;I<Lista.length;I++)
	{//CAMINHA EM CADA CARACTERE DO FILTRO
		if (Lista.indexOf(Texto.charAt(I),0)==-1)
		{//ACHOU UM CARACTERE INVALIDO
			return(false);
		}//if
	}//for
	return(true);
}


// Verifica se um email é aparentemente válido, possuindo '@' e '.'
function validaEmail(stremail){ 
if (stremail=="")
  return false;
else{  
	var posAtSign = stremail.indexOf('@', 0);
	if (posAtSign == -1)
		return false; 
	else {
		if (stremail.indexOf('.', posAtSign) == -1)
			return false;
		else
			return true;
		 }
    }
}

//Verifica se um CEP é aparentemente válido, em um formato 99999-999
function validaCEP(strCEP){ 

if (strCEP=="")
 return false;
else{  
	if (strCEP.length != 9)
		return false;
	else{
		var posAtSign = strCEP.indexOf('-', 0);
		if (posAtSign != 5)
			return false; 
		else 
			return true;
		}
   }
}


//Verifica se um CPF está no formato 999999999-99
function validaCPF(strCPF){ 

if (strCPF=="")
 return false;
else{  
	if (strCPF.length != 12)
		return false;
	else{
		var posAtSign = strCPF.indexOf('-', 0);
		if (posAtSign != 9)
			return false; 
		else 
			return true;
		}
   }
}

// Verifica se uma data é válida segundo dd/MM/yyyy
function validaData(data) { 
var dia = 1;
var mes = 1;
var ano = 1900;
var barra1 = 0; 
var barra2 = 0;
data = replace(data, ' ', '');
barra1 = inStr(1, data, '/');
if((barra1 < 2)||(barra1 > 3)) return(false);	//dia inválido
dia = trim(data.substr(0, barra1 - 1));
if(!(validaNumero(dia))) return(false);			//dia não-numérico
barra2 = inStr(barra1 + 1, data, '/');
if((barra2 < 4)||(barra2 > (barra1 + 3))||(barra2 != (data.length - 4))) return(false);	//mês inválido
mes = trim(data.substr(barra1, barra2 - barra1 - 1));
if(!(validaNumero(mes))) return(false);			//mês não-numérico
if((mes < 1)||(mes > 12)) return(false);		//mês fora do intervalo permitido
ano = trim(data.substr(barra2, 4));
if((!(validaNumero(ano))) || (ano < 1900)) return(false);			//ano não numérico
if((dia < 1)||(dia > diasMes(mes, ano))) return(false);	//dia fora do intervalo permitido
return(true); }


function DataValida(data) {
	var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/;
	var month, day, year;
	var matchArray = data.match(datePat); // is the format ok?
	if (matchArray == null) {
	alert("Data não está num formato valido(dd/mm/aaaa).")
	return false;
	}
	month = matchArray[3]; // parse date into variables
	day = matchArray[1];
	year = matchArray[4];
	if (year <1800)
	{
	alert("Este não é um ano válido");
	return false;
	}
	if (month < 1 || month > 12) { // check month range
	alert("Mês deve estar entre 1 e 12.");
	return false;
	}
	if (day < 1 || day > 31) {
	alert("Dia deve estar entre 1 e 31.");
	return false;
	}
	if ((month==4 || month==6 || month==9 || month==11) && day==31) {
	alert("O Mês "+month+" não tem 31 dias!")
	return false
	}
	if (month == 2) { // validacao especial pra fevereiro
	var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
	if (day>29 || (day==29 && !isleap)) {
	alert("Fevereiro " + year + " não tem " + day + " dias!");
	return false;
	   }
	}
	return true;  // data valida
}




// Retorna o número de dias de um mês de um determinado ano
function diasMes(qmes, qano) {
var mes = 0;
var ano = 0;
mes = qmes;
ano = qano;
if(mes == 2) {
    if(((ano % 4) != 0)||(((ano % 100) == 0)&&((ano % 400) != 0))) {
      return(28);
    } else {
      return(29); }
  } else {
    if(mes < 8) { 
      return(30 + (mes % 2));
    } else { 
      return(31 - (mes % 2)); } } }

// Retorna o dia de uma data, se ela for válida,
// ou zero se inválida.
function day(data) {
if(validaData(data)) {
  return(lTrimChar(data.substr(0, inStr(1, data, '/') - 1), '0'));
} else {
  return(0); } }

// Retorna o ano de uma data, se ela for válida,
// ou zero se inválida.
function year(data) {
if(validaData(data)) {
  return(lTrimChar(data.substr(inStr(inStr(1, data, '/') + 1, data, '/'), inStr(inStr(1, data, '/') + 1, data, '/')), '0'));
} else {
  return(0); } }

// Retorna o mês de uma data, se ela for válida,
// ou zero se inválida.
function month(data) {
if(validaData(data)) {
  return(lTrimChar(data.substr(inStr(1, data, '/'), inStr(inStr(1, data, '/') + 1, data, '/') - 1 - inStr(1, data, '/')), '0'));
} else {
  return(0); } }

// Retorna o maior de dois números.
function greater(num1, num2) {
if(num1 > num2) { return(num1); } else { return(num2); } }

// Retorna o menor de dois números.
function leaster(num1, num2) {
if(num1 < num2) { return(num1); } else { return(num2); } }

// Retorna TRUE se a data1 for menor ou igual a data2 e FALSE
// se for maior. O terceiro é o que deve ser retornado caso
// sejam iguais.
function dateCompare(data1, data2, seigual) {
if(!(validaData(data1))) return(false);
if(!(validaData(data2))) return(false);
if(parseInt(year(data1))  < parseInt(year(data2)))  return(true);
if(parseInt(year(data1))  > parseInt(year(data2)))  return(false);
if(parseInt(month(data1)) < parseInt(month(data2))) return(true);
if(parseInt(month(data1)) > parseInt(month(data2))) return(false);
if(parseInt(day(data1))   < parseInt(day(data2)))   return(true);
if(parseInt(day(data1))   > parseInt(day(data2)))   return(false);
return(seigual); }

// Retorna o número de dias de diferença entre duas datas.
// Retorna zero se alguma data não for válida.
function dateDiff(dataini,datafim) {
var iano = 0;
var imes = 0;
var idia = 0;
var fano = 0;
var fmes = 0;
var fdia = 0;
if((validaData(dataini))&&(validaData(datafim))) {
  iano = parseFloat(year (dataini));
  imes = parseFloat(month(dataini));
  idia = parseFloat(day  (dataini));
  fano = parseFloat(year (datafim));
  fmes = parseFloat(month(datafim));
  fdia = parseFloat(day  (datafim));
  if(dateCompare(dataini, datafim, true) && dateCompare(datafim, dataini, true)) { 
    return(0);
  } else {
    if(dateCompare(dataini, datafim)) {
      idia++;
      if(idia > diasMes(imes, iano)) {
        imes++;
        idia = 1;
        if(imes > 12) {
          iano++;
          imes = 1; } }
      return(dateDiff(idia + '/' + imes + '/' + iano, fdia + '/' + fmes + '/' + fano) + 1);
    } else {
      idia--;
      if(idia < 0) {
        imes--;
        if(imes < 0) {
          iano--;
          imes = 12; }
        idia = diasMes(imes, iano); }
      return(dateDiff(idia + '/' + imes + '/' + iano, fdia + '/' + fmes + '/' + fano) - 1); } }
} else {
  return(0); } }

// Retorna verdadeiro, se verdadeira a condição, e falso,
// se a condição for falsa.
function iIf(condicao, verdadeiro, falso) {
if(condicao) { return(verdadeiro); } else { return(falso); } }

// Retorna n caracteres a esquerda de uma string.
function left(onde, quantos) {
if(quantos >= onde.length) return(onde); else
return(onde.substr(0, quantos)); }

// Retorna n caracteres a direita de uma string.
function right(onde, quantos) {
if(quantos >= onde.length) return(onde); else
return(onde.substr(onde.length - quantos, quantos)); }

// Retorna o número de caracteres de uma string.
function len(onde) {
return(onde.length); }


// Converte para string
function cStr(valor) {
return('' + valor);
}


// Retorna o índice relativo a um texto específico numa combo
function qualOpcaoCombo(combo, texto) {
for(var i = 1; i<combo.length; i++) if(combo.item(i).text == texto) return(i);
return(0);
}

function dateAdd(myDate,days) {
	var dat = new Date(myDate.substring(6,10),
					myDate.substring(3,5)-1,
                    myDate.substring(0,2));
    
    return new Date(dat.getTime() + days*24*60*60*1000);
}

//Retorna a diferença de dias entre a data1 e a data2
function dateDiff2(data1,data2){
   var d, r, t1, t2, t3; 
   var yr1,mo1,dy1,yr2,mo2,dy2,vetData1,vetData2 ;        //Declare variables.
   var MinMilli = 1000 * 60         //Initialize variables.
   var HrMilli = MinMilli * 60
   var DyMilli = HrMilli * 24
   var vetData;
   
   //Separo em dia mes e ano a primeira data
   vetData1 = data1.split("/");
   yr1 = vetData1[2]; 
   mo1 = vetData1[1];
   dy1 = vetData1[0];
   
   //Separo em dia mes e ano a segunda data
   vetData2 = data2.split("/");
   yr2 = vetData2[2]; 
   mo2 = vetData2[1];
   dy2 = vetData2[0];   
   
   t1 = Date.UTC(yr1, mo1 - 1, dy1);    //Get milliseconds since 1/1/1970. 
   t2 = Date.UTC(yr2, mo2 - 1, dy2);    //Get milliseconds since 1/1/1970. 
   
   if (t2 >= t1) 
      t3 = t2 - t1;
   else
      t3 = t1 - t2;
   r = Math.round(t3 / DyMilli);
   return(r);                       //Return difference.
}

