/**********************************************************************
 1.5 (20/nov/03)
   - Aumento de compatibilidade para diferentes tipos de input
 1.6 (20/dez/03)
   - Modificacao da referencia do parametros de "indice (0,1...)" para "this" 
     para identificar o formulario
   - Adicão do Tipo "Comparar" para comparar 2 campos iguais
   - Ajustado bug do type "password" do Tipo notnull 
   
 1.7 (29/Set/04)
   - Criação dos tipo:
      -> Senha: para obrigar o usuário a digitar, pelo menos 6 caracteres;
	  -> Dia:   somente permitir que o usuário digite valores entre 1 e 31,somente aceita dados numéricos e não aceita valores nulos;
	  -> Mes:   somente permitir que o usuário digite valores entre 1 e 12, somente aceita dados numéricos e não aceita valores nulos;
	  -> Ano:   somente permitir que o usuário digite valores entre 1900 e 2000,somente aceita dados numéricos e não aceita valores nulos;
	  
 1.8 (19/10/04)
   - Criação do teste para validação de campos do tipo textarea   
   
**********************************************************************
*** Modo de uso
**********************************************************************

   1) Copie e inclua este "js" no arquivo. 
      Ex: <script language="javascript" src="validador_universal.js"></script>

   2) Nas tags de form (input,select,etc.), adicione a propriedade ID.
      Exemplo: <input type=text id="">

   3) Dentro desta propriedade você deve colocar a sintaxe:

      id="Tipo|Mensagem_de_erro"

      Onde

      Tipo é a espécie de validação do campo.
     
      		notnull  -   Campo não pode ser vazio (Em multiples, só coloque em um)
            numerico -   Campo só deve ter números
      		email    -   Campo deve ser e-mail válido
            cep      -   Campo deve ser um cep válido (33930300 ou 33930-300)
            data     -   Campos deve ser uma sintaxe de data válida (dd/mm/aaaa)
      		cpf 	   -   Campo deve ser um CPF válido
      		cnpf     -   Campo deve ser um CGC/CNPJ válido
      		comparar -   Campo e Campo2 devem ser iguais
                         Exemplo: id="Tipo|Mensagem_de_erro|Campo2" 
      		regexp   -   Campo que é validado de acordo com
      				       uma expressão regular que é acrescentada
      				       no final                         
                         Exemplo: id="Tipo|Mensagem_de_erro|Expressao_Regular"  
      		
            TO DO:
            url      -   Campo deve ser uma URL válida
            
      Mensagem_de_erro é a mensagem de erro que irá aparecer no popup.
      
            Exemplo: "Por favor, preencha o nome"
      
   4) Chame a função "validador_universal(this)" no onsubmit do formulario
	   
      Exemplo: <form name="form1" osubmit="return(validador_universal(this))">
							
*******************************************************************************/
function validador_universal(param_formulario) {

	var tipo10, formulario, propriedades, num_elementos, str_regexp;

	//Instancia o formulario passado como indice
	formulario = param_formulario;

	//Pega o numero de elementos dentro do formulario
	num_elementos = formulario.length;

	//Passa por cada elemento...
	for (i = 0; i < num_elementos; i++) {

		//Separa em uma matriz, o conteudo do tipo
		propriedades = formulario.elements[i].id.split("|");
		
		//Verifica o tipo da validação
		switch (propriedades[0]) {
			
			
			
			case "notnull":

				if ((formulario.elements[i].type == "text") || 
                (formulario.elements[i].type == "password")) {
            
                  if (formulario.elements[i].value == "") {
      					alert(propriedades[1]);
      					formulario.elements[i].focus();
      					return false;
      				 }//if
                   
            } else if (formulario.elements[i].type == "radio") {
            
                  //alert(formulario.elements[i].type);
                  var checado = false;
                  var tamanho_radio = eval("formulario." + formulario.elements[i].name + ".length");
                  
                  for (j=0;j<=tamanho_radio-1;j++) {
      					if (eval("formulario."+formulario.elements[i].name+"["+j+"].checked")) {
                        checado = true;
                     }//if
      				}//for
                  
                  if (!checado) {
      					   //formulario.elements[i].focus(); não aceita
                        alert(propriedades[1]);
      					   return false;
                  }//if
            
            } else if (formulario.elements[i].type.indexOf("select") >= 0) {
            
                  if (formulario.elements[i].options[formulario.elements[i].selectedIndex].value == "") {
      					alert(propriedades[1]);
      					formulario.elements[i].focus();
      					return false;
      				 }//if
                   
            }//if
				
			break;

			case "numerico":

				str_regexp = /^\d+$/i;
 			    if (!str_regexp.test(formulario.elements[i].value)) {
					alert(propriedades[1]);
					formulario.elements[i].focus();
					return false;
				}//if
				
			break;
				
			case "dia":
				
				str_regexp = /^\d+$/i;
				if ((formulario.elements[i].value == "")||(formulario.elements[i].value.length < 2)||(!str_regexp.test(formulario.elements[i].value))||(parseInt(formulario.elements[i].value) < 1) || (parseInt(formulario.elements[i].value) > 31)) {
					alert(propriedades[1]);
					formulario.elements[i].focus();
					return false;
										
				}//if
            
			break;
			
	        case "mes":
			
              str_regexp = /^\d+$/i;
				if ((formulario.elements[i].value == "")||(formulario.elements[i].value.length < 2)||(!str_regexp.test(formulario.elements[i].value))||(parseInt(formulario.elements[i].value) < 1) || (parseInt(formulario.elements[i].value) > 12)) {
					alert(propriedades[1]);
					formulario.elements[i].focus();
					return false;
										
				}//if
            		
			break;
			
	        case "ano":
			
               str_regexp = /^\d+$/i;
				if ((formulario.elements[i].value == "") || (formulario.elements[i].value.length < 4) ||(!str_regexp.test(formulario.elements[i].value))||(parseInt(formulario.elements[i].value) < 1900) || (parseInt(formulario.elements[i].value) > 1999)) {
					alert(propriedades[1]);
					formulario.elements[i].focus();
					return false;
										
				}//if*/
            
		    break;
													
													
		    case "email":

				str_regexp = /^[a-z0-9](\.?\w)*(\-?\w)*@[a-z0-9]+(\.[a-z0-9]+)*(\.[a-z0-9]{2,4})$/i;

				if (!str_regexp.test(formulario.elements[i].value)) {
					alert(propriedades[1]);
					formulario.elements[i].focus();
					return false;
				}//if

				break;

			case "data":

				str_regexp = /^\d{2}\/\d{2}\/\d{2}$/;

				if (!str_regexp.test(formulario.elements[i].value)) {
					alert(propriedades[1]);
					formulario.elements[i].focus();
					return false;
				}//if

				break;
				
				
				case "telefone":

				str_regexp = /^\d{2}\/\d{2}\/\d{2}$/;

				str_regexp = /^\d+$/i;
				if(formulario.elements[i].value != ""){
					if(parseInt(formulario.elements[i].value.length) > 9){
					if (!str_regexp.test(formulario.elements[i].value)){
						alert(propriedades[1]);
						formulario.elements[i].focus();
						return false;
					}
					} else {
						alert(propriedades[1]);
						formulario.elements[i].focus();
						return false;
						}
					
				}//if

				break;
				
            case "senha":
			
			str_regexp = /^\d+$/i;
 				
				if ((!str_regexp.test(formulario.elements[i].value)) || (parseInt(formulario.elements[i].value.length) < 6)) {
 						alert(propriedades[1]);
    					formulario.elements[i].focus();
    					return false;
    				}//if
			break;
					
			case "cep":

            if (formulario.elements[i].value.length == 8) {

    				str_regexp = /^\d{8}$/;
    
    				if (!str_regexp.test(formulario.elements[i].value)) {
    					alert(propriedades[1]);
    					formulario.elements[i].focus();
    					return false;
    				}//if

            } else {
                        
    				str_regexp = /^\d{5}-\d{3}$/;
    
    				if (!str_regexp.test(formulario.elements[i].value)) {
    					alert(propriedades[1]);
    					formulario.elements[i].focus();
    					return false;
    				}//if

            }

				break;

			case "cpf":

				//if (!checa_cpf(formulario.elements[i].value)) {
			if( formulario.elements[i].value != "12345678909" || formulario.elements[i].value != "99999999999"){
				if (!checaCPF(formulario.elements[i].value)) {
					alert(propriedades[1]);
					formulario.elements[i].focus();
					return false;
				}//if
			} else{
				
									alert(propriedades[1]);
					formulario.elements[i].focus();
					return false;
				
				}

				break;

			case "cnpj":

				if (!checa_cnpj(formulario.elements[i].value)) {
					alert(propriedades[1]);
					formulario.elements[i].focus();
					return false;
				}//if

				break;

			case "comparar":
        
				//Tem que fazer a comparação entre selects também....
       if ((param_formulario.DSC_SENHA.value.length) != (param_formulario._DSC_SENHA.value.length))
        {
         alert(propriedades[1]);
         param_formulario._DSC_SENHA.focus();
         return (false);
         }
				break;

			case "regexp":

				str_regexp = new RegExp(propriedades[2]);

				if (!str_regexp.test(formulario.elements[i].value)) {
					alert(propriedades[1]);
					formulario.elements[i].focus();
					return false;
				}//if

				break;
				
		}//switch

	}//for

  return true;
  
}//function

function checa_cnpj(param_cnpj) {

      var Parcela;
      var Quociente;
      var Resto;
      var Soma;
      var Fator;
      var I;
      var C1;
      var C2;
      var dv1;
      var dv2;
      
      //Verificação dos dois digitos finais em relação ao número completo
      C1 = parseInt(param_cnpj.substring(12, 13));  //13º caracter = primeiro dígito verificador
      C2 = parseInt(param_cnpj.substring(13, 14));  //14º caracter = segundo dígito verificador
      
      //Verificação do primeiro dígito (C1)
      Soma = 0;
      Parcela = 0;
      Fator = 0;
      
      for(I=1; I<=12; I++) {
      
        if(I < 9) {
      Fator = I + 1;
        } else {    
      Fator = I - 7;
        }//if
      
        Parcela = Fator * parseInt(param_cnpj.substring(12 - I, 12 - I + 1));
      
        Soma = Soma + Parcela;
      
      }//for
      
      dv1 = (Soma % 11);
      dv1 = 11 - dv1;
      
      if(dv1 > 9) {
        dv1 = 0;
      }//if
      
      if(C1 != dv1) {
        return false;
      }//if
      
      //Verificação do segundo dígito (C2)
      Soma = 0;
      Parcela = 0;
      Fator = 0;
      
      for(I=1; I<=13; I++) {
      
         if(I < 9) {
            Fator = I + 1;
         } else {
           Fator = I - 7;
         }//if
      
         Parcela = Fator * parseInt(param_cnpj.substring(13 - I, 13 - I + 1));
      
         Soma = Soma + Parcela;
      
      }//for
      
      dv2 = (Soma % 11);
      dv2 = 11 - dv2;
      
      if(dv2 > 9) {
        dv2 = 0;
      }//if
      
      if(C2 != dv2) {
        return false;
      } //if
      
      return true;

}//function

function checa_cpf(param_cpf) {

	x = 0;
	soma = 0;
	dig1 = 0;
	dig2 = 0;
	texto = "";
	param_cpf1="";
	len = param_cpf.length; x = len -1;

	for (var i=0; i <= len - 3; i++) {
		y = param_cpf.substring(i,i+1);
		soma = soma + ( y * x);
		x = x - 1;
		texto = texto + y;
	}//for
   
	dig1 = 11 - (soma % 11);
	
   if (dig1 == 10) dig1=0 ;
	
   if (dig1 == 11) dig1=0 ;
	
   param_cpf1 = param_cpf.substring(0,len - 2) + dig1 ;
	
   x = 11; soma=0;
	
   for (var i=0; i <= len - 2; i++) {

		soma = soma + (param_cpf1.substring(i,i+1) * x);

		x = x - 1;

	}//for
   
	dig2= 11 - (soma % 11);
	
   if (dig2 == 10) dig2=0;
	
   if (dig2 == 11) dig2=0;
	
   //alert ("Digito Verificador : " + dig1 + "" + dig2);
	if ((dig1 + "" + dig2) == param_cpf.substring(len,len-2)) {
		return true;
	}//if
   
	return false;
   
}//function

function pfValidaCPF_H_CGC(msCPF_CGC, msMSG){
	
	if (!(checa(limpa_cnpj(msCPF_CGC.value), msMSG))){
		return false;
	}
	else{ 
		return true; 
	}
}

function pfValidaCPF_CGC(msCPF_CGC, msMSG){
	
	if (!(checa(limpa_cnpj(msCPF_CGC.value), msMSG))){
		msCPF_CGC.focus();
		return false;
	}
	else{ 
		return true; 
	}
}

function pfValidaCPF(msCPF_CGC, msMSG){
	
	if (!(checaCPF(limpa_cnpj(msCPF_CGC.value), msMSG))){
		msCPF_CGC.focus();
		return false;
	}
	else{ 
		return true; 
	}
}

function troca(stexto,sprocura,stroca){
	for (c=0;c<stexto.length;c++)
	{
		stexto = stexto.replace(sprocura,stroca)
	}
	return stexto;
}


function limpa_cnpj(cnpj){
	var sretorno;
	sretorno = cnpj;
	sretorno = troca(sretorno,".","");
	sretorno = troca(sretorno,"-","");
	sretorno = troca(sretorno,"/","");
	sretorno = troca(sretorno," ","");
	return sretorno;
}
function checa(msCPF_CGC, msMSG){
	if ((msCPF_CGC.length != 14) && (msCPF_CGC.length !=11)){
		alert(msMSG);
		return false;
	}
			  
	if ((!(modulo(msCPF_CGC.substring(0,msCPF_CGC.length - 2)).toString()+modulo(msCPF_CGC.substring(0,msCPF_CGC.length - 1)).toString() == msCPF_CGC.substring(msCPF_CGC.length - 2,msCPF_CGC.length))) && (modulo_cic(msCPF_CGC.substring(0,msCPF_CGC.length - 2)) + "" + modulo_cic(msCPF_CGC.substring(0,msCPF_CGC.length - 1)) != msCPF_CGC.substring(msCPF_CGC.length - 2,msCPF_CGC.length))){
		alert(msMSG);
		return false;
	}
	return true;
}
function checaCPF(msCPF_CGC){
	if ((msCPF_CGC.length !=11)){
		//alert(msMSG);
		return false;
	}
			  
	if ((!(modulo(msCPF_CGC.substring(0,msCPF_CGC.length - 2)).toString()+modulo(msCPF_CGC.substring(0,msCPF_CGC.length - 1)).toString() == msCPF_CGC.substring(msCPF_CGC.length - 2,msCPF_CGC.length))) && (modulo_cic(msCPF_CGC.substring(0,msCPF_CGC.length - 2)) + "" + modulo_cic(msCPF_CGC.substring(0,msCPF_CGC.length - 1)) != msCPF_CGC.substring(msCPF_CGC.length - 2,msCPF_CGC.length))){
		//alert(msMSG);
		return false;
	}
	return true;
}

function modulo(msCPF_CGC){
	soma=0;
	ind=2;
				
	for(pos=msCPF_CGC.length-1;pos>-1;pos=pos-1){
		soma = soma + (parseInt(msCPF_CGC.charAt(pos)) * ind);
		ind++;
			      
		if(msCPF_CGC.length>11){ 
			if(ind>9) ind=2; 
        }
	}
				
	resto = soma - (Math.floor(soma / 11) * 11);
					 
	if(resto < 2){ 
		return 0; 
	}
	else{ 
		return (11 - resto); 
	}
}

function modulo_cic(msCPF_CGC){
   	soma=0;
	ind=2;

	for(pos=msCPF_CGC.length-1;pos>-1;pos=pos-1){
		 soma = soma + (parseInt(msCPF_CGC.charAt(pos)) * ind);
		 ind++;
					 
		 if(msCPF_CGC.length>11){	
		    if(ind>9) ind=2; 
		 }
	}				
				
	resto = soma - (Math.floor(soma / 11) * 11);
					  
	if(resto < 2){	
		return 0; 
	}
	else{ 
		return 11 - resto;
	}
}

