//*
//** Validação de Campos de Formulários
//** Desenvolvido por Rodrigo Herman
//**
//** Para usar:
//** 1. Crie o formuário
//** 2. Insera as seguintes linhas abaixo :

//**	<script language="JavaScript1.2" src="validator.js"></script>


//********************************************************************
// Função    		: validaEmail
// Objetivo  		: Validar o EMAIL
// Parâmetro 		: strEmail
// Retorno   		: Verdadeiro para EMAIL válido e Falso para EMAIL inválido
// Pré-Requisito 	: 
//********************************************************************
function validaEmail(strEmail){
	if ( (trimJS(strEmail)).length==0){
		return true
	}

	var checkTLD=1;
	var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;
	var emailPat=/^(.+)@(.+)$/;
	var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";
	var validChars="\[^\\s" + specialChars + "\]";
	var quotedUser="(\"[^\"]*\")";
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
	var atom=validChars + '+';
	var word="(" + atom + "|" + quotedUser + ")";
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
	var matchArray=strEmail.match(emailPat);
	if (matchArray==null) {
		return false;
	}
	var user=matchArray[1];
	var domain=matchArray[2];
	for (i=0; i<user.length; i++) {
		if (user.charCodeAt(i)>127) {
			return false;
	   }
	}
	for (i=0; i<domain.length; i++) {
		if (domain.charCodeAt(i)>127) {
			return false;
	   }
	}
	if (user.match(userPat)==null) {
		return false;
	}
	var IPArray=domain.match(ipDomainPat);
	if (IPArray!=null) {
		for (var i=1;i<=4;i++) {
			if (IPArray[i]>255) {
				return false;
		   }
		}
		return true;
	}
	var atomPat=new RegExp("^" + atom + "$");
	var domArr=domain.split(".");
	var len=domArr.length;
	for (i=0;i<len;i++) {
		if (domArr[i].search(atomPat)==-1) {
			return false;
	   }
	}
	if (checkTLD && domArr[domArr.length-1].length!=2 && domArr[domArr.length-1].search(knownDomsPat)==-1) {
		return false;
	}
	if (len<2) {
		return false;
	}
	return true;
}

//********************************************************************
// Função    		: validaHorario
// Objetivo  		: Validar a HORA e MINUTO
// Parâmetro 		: strHorario (Formato: HH:MM)
// Retorno   		: Verdadeiro para HORÁRIO válido e Falso para HORÁRIO inválido
// Pré-Requisito 	: 
//********************************************************************
function validaHorario(strHorario){
	if ( (trimJS(strHorario)).length==0){
		return true
	}
	
	if ( (trimJS(strHorario)).length != 5){
		return false;
	}

	var hora, minuto, doispontos;

	hora = strHorario.substring(0,2);
	minuto = strHorario.substring(3,5);
	doispontos = strHorario.substring(2,3);

	if (doispontos != ":") {
		return false;
	}
	if ((hora == "") || (minuto == "")){
		return false;
	}
	if ( isNaN(hora) || (hora < 0) || (hora > 23)) {
		return false;
	}
	if (isNaN(minuto) || (minuto < 0) || (minuto > 59) ) {
		return false;
	}
	return true;
}

//********************************************************************
// Função    		: validaData
// Objetivo  		: Validar a DATA
// Parâmetro 		: strData (Formato: DD/MM/AAAA)
// Retorno   		: Verdadeiro para DATA válida e Falso para DATA inválida
// Pré-Requisito 	: Função anoBissexto
//********************************************************************
function validaData(strData){
	if ( (trimJS(strData)).length == 0){
		return true
	}

	var dia, mes, ano, barra1, barra2;

	dia = strData.substring(0,2);
	mes = strData.substring(3,5);
	ano = strData.substring(6,10);
	barra1 = strData.substring(2,3);
	barra2 = strData.substring(5,6);

	if ((barra1 != "/") || (barra2 != "/")) {
		return false;
	}
	if ( isNaN(dia) || isNaN(mes) || isNaN(ano)){
		return false;
	}
	if ( (ano < 1900) || (ano > 2020) ) {
		return false;
	}
	if ( (mes<1) || (mes>12) ) {
		return false;
	}
	if (mes == 2) {
		if ((dia == 29) && (anoBissexto(ano) == false)){
			return false;
		}
		else
			if ((dia == 30) || (dia == 31)){
				return false;
			}
	}
	else
		if ((mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12) && (dia > 31 || dia< 1)){
			return false;
		}
		else if ((mes == 4 || mes == 6 || mes == 9 || mes == 11) && (dia > 30 || dia < 1)) {
			return false;
		}
	return true;
} 


//********************************************************************
// Função    		: validaDataIntervalo
// Objetivo  		: Valida intervalos entre duas datas
// Parâmetro 		: strData (Formato: DD/MM/AAAA)
// Retorno   		: True se a primeira data é menor que a segunda. False caso contrário.
// Pré-Requisito 	: Função anoBissexto
//********************************************************************
function validaDataIntervalo(strData1, strData2, logicOp){

	if (!validaData(strData1) || !validaData(strData2)){
		return false;
	}

	if (logicOp == null || logicOp == ""){
		logicOp = "<";
	}

	strData1 = strData1.substring(6,10) + strData1.substring(3,5) + strData1.substring(0,2);
	strData2 = strData2.substring(6,10) + strData2.substring(3,5) + strData2.substring(0,2);

	if (eval(strData1 + " " + logicOp + " " + strData2)){
		return true;
	}

	return false;
}


//********************************************************************
// Função    		: diaDif
// Objetivo  		: Calcula a diferença de dias entre duas datas
// Parâmetro 		: strData1 (Formato: DD/MM/AAAA), strData2 (Formato: DD/MM/AAAA)
// Retorno   		: intervalo de dias
// Pré-Requisito 	: Função validaData
//********************************************************************
function diaDif(strData1, strData2){

	if (!validaData(strData1) || !validaData(strData2)){
		return 0;
	}

	// transforma data1 em variável tipo data
	var arrData1 = strData1.split("/");
	var strDia1 = arrData1[0];
	var strMes1 = arrData1[1];
	var strAno1 = arrData1[2];
	var dtmData1 = new Date(strAno1, strMes1, strDia1);

	// transforma data2 em variável tipo data
	var arrData2 = strData2.split("/");
	var strDia2 = arrData2[0];
	var strMes2 = arrData2[1];
	var strAno2 = arrData2[2];
	var dtmData2 = new Date(strAno2, strMes2, strDia2);

	var intDiferenca = dtmData1.getTime() - dtmData2.getTime();
	var intDiferenca = Math.floor(intDiferenca / (1000 * 60 * 60 * 24));

	return intDiferenca;
}


//********************************************************************
// Função    		: validaMoeda
// Objetivo  		: Verifica se a moeda é valida
// Parâmetro 		: strMoeda (Formato: 100,00)
// Retorno   		: Verdadeiro para MOEDA no formato e Falso para MOEDA fora do formato
// Pré-Requisito 	: nenhum
//********************************************************************
function validaMoeda(strMoeda){
	if ( (trimJS(strMoeda)).length==0){
		return true
	}

	var moeda="0123456789,.";
	var virgula = false;
	for (var i=0;i<strMoeda.length;i++){
		temp=strMoeda.substring(i,i+1);
		if ((virgula) && (temp==",")){
			return false;
		}
		if (temp==","){
			virgula=true;	
		}
		if (moeda.indexOf(temp)==-1){
			return false;
		}
	}
	return true;
}


//********************************************************************
// Função    		: validaNumero (Inteiro)
// Objetivo  		: Verifica se um conjunto de caracteres são dígitos numéricos.
// Parâmetro 		: Conjunto de caracteres.
// Retorno   		: True se o conjunto for um número, False se o conjunto não for número. 
// Pré-Requisito 	: nenhum 
//********************************************************************  
function validaNumero (strNumero) {
    if ( (trimJS(strNumero)).length == 0){
		return true
    }

    var i;

    for (i = 0; i < strNumero.length; i++)    {   
        var c = strNumero.charAt(i);
        if (isNaN(c)) return false;
    }
    return true;
}




//********************************************************************
// Função    		: apenasNumeros
// Objetivo  		: Verifica se a tecla que foi digitada é um dígito numérico.
// Parâmetro 		: O objeto event do javascript.
// Retorno			: True se for tecla numérica, False se não for numérica.
// Pré-Requisito	: nenhum
//********************************************************************
function validaInteiroPress()
{
        var BACKSPACE = 8;
        var key;
        var tecla;

        if(navigator.appName.indexOf("Netscape")!= -1) {
          tecla= event.which;
        }
        else{
          tecla= event.keyCode;
        }

        key = String.fromCharCode(tecla);

        if ( (tecla == BACKSPACE) || (tecla == 13) ){
          //return true;
          event.returnValue = true;
          return;
        }
        else{
        	//return ( (key >= "0") && (key <= "9") ); 
        	event.returnValue = (key >= "0") && (key <= "9");
        	return;
        }
} 



//********************************************************************
// Função    		: apenasNumeros
// Objetivo  		: Verifica se o campo digitado numérico.
// Parâmetro 		: O objeto event do javascript.
// Retorno			: True se for tecla numérica, False se não for numérica.
// Pré-Requisito	: nenhum
//********************************************************************
function validaInteiroBlur(obj)
{
	if (obj == null){
		alert("Campo inválido!");
		return false;
	}
	
	if (!validaNumero(obj.value)){
		alert("Valor númerico inválido!");
		obj.value = "";
		obj.focus();
		return false;
	}
	else{
		return true;
	}	
} 



//********************************************************************
// Função    		: trimJS
// Objetivo  		: Tira espaços em branco do início e do final da string. Também elimina
//					  espaços duplos					
// Programador		: Equipe de Desenvolvimento WEB
//********************************************************************  
function trimJS(str)	{
	str=str.replace(/\s+/g," "); // elimina sequências de espaços
	// (\t\r\n ) por um espaço em branco
	str=str.replace(/^ /,""); //inicio de linha
	str=str.replace(/ $/,""); //fim de linha

	return str;
}


//  Fim -->

/*** 
* Descrição.: formata um campo do formulário de 
* acordo com a máscara informada... 
* Parâmetros: - objForm (o Objeto Form) 
* - strField (string contendo o nome 
* do textbox) 
* - sMask (mascara que define o 
* formato que o dado será apresentado, 
* usando o algarismo "9" para 
* definir números e o símbolo "!" para 
* qualquer caracter... 
* - evtKeyPress (evento) 
* Uso.......: <input type="textbox" 
* name="xxx"..... 
* onkeypress="return txtBoxFormat(document.rcfDownload, 'str_cep', '99999-999', event);"> 
* Observação: As máscaras podem ser representadas como os exemplos abaixo: 
* CEP -> 99.999-999 
* CPF -> 999.999.999-99 
* CNPJ -> 99.999.999/9999-99 
* Data -> 99/99/9999 
* Tel Resid -> (99) 999-9999 
* Tel Cel -> (99) 9999-9999 
* Processo -> 99.999999999/999-99 
* C/C -> 999999-! 
* E por aí vai... 
***/

function txtBoxFormat(objForm, strField, sMask, evtKeyPress) {
     var i, nCount, sValue, fldLen, mskLen,bolMask, sCod, nTecla;
	
	 if (window.navigator.appName == "Netscape") {
	 	if (evtKeyPress.type == "keypress") {
			brw = "NN kp";
			nTecla = evtKeyPress.which;
		} else if (evtKeyPress.type == "keyup") {
			brw = "NN ku";
			nTecla = evtKeyPress.keyCode;
		}
	 } else {
	 	brw = "IE";
	 	nTecla = evtKeyPress.keyCode;
	 }

//	alert("--->"+brw+"--->"+nTecla);

	sValue = objForm[strField].value;

	// Limpa todos os caracteres de formatação que
	// já estiverem no campo.
	sValue = sValue.toString().replace( "-", "" );
	sValue = sValue.toString().replace( "-", "" );
	sValue = sValue.toString().replace( ".", "" );
	sValue = sValue.toString().replace( ".", "" );
	sValue = sValue.toString().replace( "/", "" );
	sValue = sValue.toString().replace( "/", "" );
	sValue = sValue.toString().replace( "(", "" );
	sValue = sValue.toString().replace( "(", "" );
	sValue = sValue.toString().replace( ")", "" );
	sValue = sValue.toString().replace( ")", "" );
	sValue = sValue.toString().replace( " ", "" );
	sValue = sValue.toString().replace( " ", "" );
	fldLen = sValue.length;
	mskLen = sMask.length;
	
	i = 0;
	nCount = 0;
	sCod = "";
	mskLen = fldLen;
	
	while (i <= mskLen) {
	   bolMask = ((sMask.charAt(i) == "-") || (sMask.charAt(i) == ".") || (sMask.charAt(i) == "/"))
	   bolMask = bolMask || ((sMask.charAt(i) == "(") || (sMask.charAt(i) == ")") || (sMask.charAt(i) == " "))
	
	   if (bolMask) {
		 sCod += sMask.charAt(i);
		 mskLen++; }
	   else {
		 sCod += sValue.charAt(nCount);
		 nCount++;
	   }
	
	   i++;
	}
	
	objForm[strField].value = sCod;
	
	if (nTecla != 8) { // backspace
	   if (sMask.charAt(i-1) == "9") { // apenas números...
//         return ((nTecla > 47) && (nTecla < 58));  // números de 0 a 9
			   if (((nTecla > 47) && (nTecla < 58))||((nTecla > 95) && (nTecla < 106))) {
//					alert("numero");
					return true;
			   } else {
//					alert("letra");
					//objForm[strField].value = objForm[strField].value.substring(0,objForm[strField].value.length-1);
					return false;
			   }
	   } else { // qualquer caracter...
         return true;
       }
	 } else {
       return true;
     }

     
	 
	 

   }
   
   //AUTO-TAB
	var isNN = (navigator.appName.indexOf("Netscape")!=-1);
	function autoTab(form_input,len, e)
	{
		var keyCode = (isNN) ? e.which : e.keyCode; 
		var filter = (isNN) ? [0,8,9] : [0,8,9,16,17,18,37,38,39,40,46];
		var Carac_digitados = 0;
		//alert("Form:" + form_input.value.length + "len" + len);
		if(form_input.value.length >= len && !containsElement(filter,keyCode))
		{
	    	form_input.value = form_input.value.slice(0, len);
			//alert("Form:" + form_input.value.length + "len" + len);  // form_input.value.length + ", " + form_input.value.length + ";"
			form_input.form[(getIndex(form_input)+1) % form_input.form.length].focus();
			//alert(form_input.value.length);
		}
	
		function containsElement(arr, ele)
		{
			var found = false, index = 0;
			while(!found && index < arr.length)
			if(arr[index] == ele)
			found = true;
			else
			index++;
			return found;
		}
	
		function getIndex(form_input)
		{
			var index = -1, i = 0, found = false;
			while (i < form_input.form.length && index == -1)
			if (form_input.form[i] == form_input)index = i;
			else i++;
			return index;
		}
		return true;
	}
	
function valida_CPF(obj){
 s = obj.value;
     // Limpa todos os caracteres de formatação que
     // já estiverem no campo.
     s = s.toString().replace( "-", "" );
     s = s.toString().replace( "-", "" );
     s = s.toString().replace( ".", "" );
     s = s.toString().replace( ".", "" );
     s = s.toString().replace( "/", "" );
     s = s.toString().replace( "/", "" );
     s = s.toString().replace( "(", "" );
     s = s.toString().replace( "(", "" );
     s = s.toString().replace( ")", "" );
     s = s.toString().replace( ")", "" );
     s = s.toString().replace( " ", "" );
     s = s.toString().replace( " ", "" );
 if (isNaN(s)) {
  return false;
 }
 if (s.length > 11) {
	return false;
 }
 if (s == "11111111111" || s == "22222222222" || s == "33333333333" || s == "44444444444" || s == "55555555555" || s == "66666666666" || s == "77777777777" || s == "88888888888" || s == "99999999999" || s == "00000000000") {
	 return false;
 }
 var i;
 var c = s.substr(0,9);
 var dv = s.substr(9,2);
 var d1 = 0;
 for (i = 0; i < 9; i++) {
  d1 += c.charAt(i)*(10-i);
 }
 if (d1 == 0){
  return false;
 }         
    d1 = 11 - (d1 % 11);
    if (d1 > 9) d1 = 0;         
 if (dv.charAt(0) != d1) {
  return false;         
 }
 d1 *= 2;
 for (i = 0; i < 9; i++) {
  d1 += c.charAt(i)*(11-i);
 }
 d1 = 11 - (d1 % 11);
 if (d1 > 9) d1 = 0;
 if (dv.charAt(1) != d1) {
     return false;
 }
 return true;
}

function valida_CGC(obj){
 s = obj.value;
      // Limpa todos os caracteres de formatação que
     // já estiverem no campo.
     s = s.toString().replace( "-", "" );
     s = s.toString().replace( "-", "" );
     s = s.toString().replace( ".", "" );
     s = s.toString().replace( ".", "" );
     s = s.toString().replace( "/", "" );
     s = s.toString().replace( "/", "" );
     s = s.toString().replace( "(", "" );
     s = s.toString().replace( "(", "" );
     s = s.toString().replace( ")", "" );
     s = s.toString().replace( ")", "" );
     s = s.toString().replace( " ", "" );
     s = s.toString().replace( " ", "" );
 if (isNaN(s)) {
  return false;
 }

 if (s.length > 14) {
	return false;
 }
 if (s == "11111111111111" || s == "22222222222222" || s == "33333333333333" || s == "44444444444444" || s == "55555555555555" || s == "66666666666666" || s == "77777777777777" || s == "88888888888888" || s == "99999999999999" || s == "00000000000000") {
	 return false;
 }

 var i;
 var c = s.substr(0,12);
 var dv = s.substr(12,2);
 var d1 = 0;
 for (i = 0; i <12; i++){
  d1 += c.charAt(11-i)*(2+(i % 8));
 }
 if (d1 == 0) 
  return false;
 d1 = 11 - (d1 % 11);
 if (d1 > 9) d1 = 0;
 if (dv.charAt(0) != d1){
  return false;
 }
 d1 *= 2;
 for (i = 0; i < 12; i++){
  d1 += c.charAt(11-i)*(2+((i+1) % 8));
 }
 d1 = 11 - (d1 % 11);
 if (d1 > 9) 
  d1 = 0;
 if (dv.charAt(1) != d1){
  return false;
 }
 return true;
}