/**********************************************************************
****** VALIDADOR UNIVERSAL 1.5
****** Data de criação: 02/01/2001
****** Ultima modificação: 26/11/2002
****** Autor: Wanderson Santos (wanderson@bhtec.com.br)
**********************************************************************
>> Atenção: Só funciona em Internet Explorer 4.0 ou maior <<
**********************************************************************

**********************************************************************
*** Histórico de uso
**********************************************************************
20/nov/03 - Telemig Celular
05/dez/03 - Díveo
20/dez/03 - BHShopping
29/Set/04 - Bhs2004(Alterações Realizadas por Alberto Rezende(alberto@bhtec.com.br))
19/Out/04 - Painel de Obras Copasa (Alterações Realizadas por Alberto Rezende(alberto@bhtec.com.br))
27/06/2007 - Sérgio Henrique - sergiohv@yahoo.com
23/07/2007 - Sérgio Henrique - sergiohv@yahoo.com

**********************************************************************
*** Histórico de versões
**********************************************************************
 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   

 1.9 (27/06/2007)
   - Alteração na formatação data de 2 para 4 digitos
     str_regexp = /^\d{2}\/\d{2}\/\d{    -->   4   <---}$/;
 2.0 (27/06/2007)
   - obrigatoriedade nos campos textarea que contenham notnull, cujo titulo do mesmo seja igual a 'textarea'
 2.1 (23/7/2007)
 	- validação do campo hora
     
**********************************************************************
*** 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)
						 para campos textarea - inserir a propriedade title="textarea", e utilizar o mesmo conceito 
						 já apresentado para notnull 
            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)
            hora     -   Campos deve ser uma sintaxe de data válida (HH:MM)			
      		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
			numero real - 
      				       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 tipo, 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].title == "textarea") 
			 {
                  if (formulario.elements[i].value == "") {
      					alert(propriedades[1]);
      					formulario.elements[i].focus();
      					return false;
      				 }//if
                   
            } 
// alteração feita aqui			
			else  
			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
                   
            }else if (formulario.elements[i].type == "file") {
                      if (formulario.elements[i].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 "telefone":
//str_regexp = /^\d{2}:\d{2}$/;\/\
				str_regexp = /\d{4}-\d{4}$/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 == "")||(!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 == "")||(!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 == "")||(!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":
			// alterado para 4 digitos, conforme indicacao anterior  
				str_regexp = /^\d{2}\/\d{2}\/\d{4}$/;
				if (!str_regexp.test(formulario.elements[i].value)) {
					alert(propriedades[1]);
					formulario.elements[i].focus();
					return false;
				}//if

				break;
			case "hora":
			// alterado para 4 digitos, conforme indicacao anterior  
				//str_regexp = /^\d{2}:\d{2}$/;
//				if (!str_regexp.test(formulario.elements[i].value)) {
				if (!validaHora(formulario.elements[i].value))
				{
					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)) {
					alert(propriedades[1]);
					formulario.elements[i].focus();
					return false;
				}//if

				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.senha.value.length) != (param_formulario.senha1.value.length) && (param_formulario.senha.value) != (param_formulario.senha1.value) )
        {
         alert(propriedades[1]);
         param_formulario.senha1.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

//Formata número tipo moeda usando o evento onKeyDown 
function Limpar(valor, validos) { 
// retira caracteres invalidos da string 
var result = ""; 
var aux; 
for (var i=0; i < valor.length; i++) { 
aux = validos.indexOf(valor.substring(i, i+1)); 
if (aux>=0) { 
result += aux; 
} 
} 
return result; 
} 


// validar hora 
// função retirada no artigo http://forum.imasters.com.br/index.php?showtopic=197426 de Thiago Ferreira
function retiraCaracter(string, caracter) {
    var i = 0;
    var final = '';
    while (i < string.length) {
        if (string.charAt(i) == caracter) {
            final += string.substr(0, i);
            string = string.substr(i+1, string.length - (i+1));
            i = 0;
        }
        else {
            i++;
        }
    }
    return final + string;
}

// função retirada do artigo http://forum.imasters.com.br/index.php?showtopic=197428 de Thiago Ferreira
function validaHora(horario) 
{
    var hora, min;
    if (!(horario.match(/^[0-9]{2,2}[:]{0,1}[0-9]{2,2}$/))) {
        return false;
    }
    horario = retiraCaracter(horario, ':');
    hora = parseInt(horario.substr(0,2));
    min = parseInt(horario.substr(2,2));
    if ((hora < 0) || (hora >24)) {
        return false;
    }
    if ((min < 0) || (min >59)) {
        return false;
    }
	return true; // alterada por sérgio henrique 
}




//Formata número tipo moeda usando o evento onKeyDown 

function Formata(campo,tammax,teclapres,decimal) { 
var tecla = teclapres.keyCode; 
TestaNumero(campo);
vr = Limpar(campo.value,"0123456789"); 
tam = vr.length; 
dec=decimal 

if (tam < tammax && tecla != 8){ tam = vr.length + 1 ; } 

if (tecla == 8 ) 
{ tam = tam - 1 ; } 

if ( tecla == 8 || tecla >= 48 && tecla <= 57 || tecla >= 96 && tecla <= 105 ) 
{ 

if ( tam <= dec ) 
{ campo.value = vr ; } 

if ( (tam > dec) && (tam <= 5) ){ 
campo.value = vr.substr( 0, tam - 2 ) + "," + vr.substr( tam - dec, tam ) ; } 
if ( (tam >= 6) && (tam <= 8) ){ 
campo.value = vr.substr( 0, tam - 5 ) + "." + vr.substr( tam - 5, 3 ) + "," + vr.substr( tam - dec, tam ) ; 
} 
if ( (tam >= 9) && (tam <= 11) ){ 
campo.value = vr.substr( 0, tam - 8 ) + "." + vr.substr( tam - 8, 3 ) + "." + vr.substr( tam - 5, 3 ) + "," + vr.substr( tam - dec, tam ) ; } 
if ( (tam >= 12) && (tam <= 14) ){ 
campo.value = vr.substr( 0, tam - 11 ) + "." + vr.substr( tam - 11, 3 ) + "." + vr.substr( tam - 8, 3 ) + "." + vr.substr( tam - 5, 3 ) + "," + vr.substr( tam - dec, tam ) ; } 
if ( (tam >= 15) && (tam <= 17) ){ 
campo.value = vr.substr( 0, tam - 14 ) + "." + vr.substr( tam - 14, 3 ) + "." + vr.substr( tam - 11, 3 ) + "." + vr.substr( tam - 8, 3 ) + "." + vr.substr( tam - 5, 3 ) + "," + vr.substr( tam - 2, tam ) ;} 
} 

} 

// OUTRAS FUNÇÕES ONKEY



//=============================================================================================\\
// funcoes de configuracoes 
// FORMA DE UTILIZAR 	
//  onBlur="isDate(this)" onKeyPress="return Tecla(event);" onKeyUp="DataMask(this)"
function DataMask(campo)
{
	var digits="0123456789/";
	var temp;
	var a;
	for (var i=0;i<campo.value.length;i++)
	{
		temp=campo.value.substring(i,i+1);
		if (digits.indexOf(temp)==-1)
		{
			campo.value=campo.value.substring(0,(campo.value.length-1))
		}
		else
		{
			var texto=""
			if ((campo.value.length==2)||(campo.value.length==5))
			{
				if ( campo.value.length == 5 )
					texto=campo.value + "/20"
				else	
					texto=campo.value + "/"
					
				campo.value=texto
			}		
		}
	}
}

function HoraMask(campo)
{
	var digits="0123456789:";
	var temp;
	var a;
	for (var i=0;i<campo.value.length;i++)
	{
		temp=campo.value.substring(i,i+1);
		if (digits.indexOf(temp)==-1)
		{
			campo.value=campo.value.substring(0,(campo.value.length-1))
		}
		else
		{
			var texto=""
			if ((campo.value.length==2))
			{
				texto=campo.value + ":"
				campo.value=texto
			}		
		}
	}
}

function Tecla(e)
	{
	if (document.all) // Internet Explorer
		var tecla = event.keyCode;
	else if(document.layers) // Nestcape
		var tecla = e.which;
		if (tecla > 47 && tecla < 59) // numeros de 0 a 9
			return true;
		else
			{
				if (tecla != 8) // backspace
					event.keyCode = 0;
					//return false;
				else
					return true;
			}
     }


// VALIDAR HORA FORMATO 24 HORAS
function CheckTime(str)
{
hora=str.value
if (hora=='') {return}
if (hora.length>5) {alert("entre com uma hora correta(8 caracteres)");return}
//if (hora.length!=5) {alert("Introducir HH:MM:SS");return}
a=hora.charAt(0) //<=2
b=hora.charAt(1) //<4
c=hora.charAt(2) //:
d=hora.charAt(3) //<=5
//e=hora.charAt(5) //:
//f=hora.charAt(6) //<=5
if ((a==2 && b>3) || (a>2)) {alert("Entre com a Hora entre 0 e 23");return}
if (d>5) {alert("Entre com os minutos entre 00 e 59");return}
//if (f>5) {alert("El valor que introdujo en los segundos no corresponde");return}
//if (c!=':' || e!=':') {alert("Introduzca el caracter ':' para separar la hora, los minutos y los segundos");return}
if (c!=':' ) {alert("Entre com a hora, minutos válidos ");return}
}



function valida_numeros(s)
{
	var i; 
	var dif = 0;
	for (i = 0; i < s.length; i++)
	{
		var c = s.charAt(i);
		if (!((c >= "0") && (c <= "9")))
		{
			dif = 1;
		}
	}
	if (dif == 1)
	{
		return false;
	}
	return true;
}
//=============================================================================================\\
function FormataData(obj, teclapres) {  //onKeyUp="FormataData(this,event)"
	var tecla = teclapres.keyCode;
	vr = obj.value;
	vr = vr.replace( "/", "" );
	tam = vr.length + 1;
	vr = vr.replace( "/", "" );
	vr = vr.replace( "/", "" );      
        if(tecla != 9 && tecla != 8) //
         {
	  if (tam > 2 && tam < 5)
	   obj.value = vr.substr( 0, 2 ) + '/' + vr.substr( 2, tam );
	  if ( tam >= 5 && tam <= 10 )
	   obj.value = vr.substr( 0, 2 ) + '/' + vr.substr( 2, 2 ) + '/' + vr.substr( 4, 4 ); 
       }
        if(tam==2 & obj.value>3)
         {
          ant=vr.substr(0,1);
          obj.value="0"+ant+"/";
         }
        if(tam==4 & vr.substr(2,1)>1)
         {
          ant=vr.substr(0,2)+"/0"+vr.substr(2,1)+"/";
          obj.value=ant;
         }
	if(tecla == 111 || tecla == 191 )
         {
          if(tam == 2)
           {
            ant=vr.substr(0,1);
            obj.value="0"+ant+"/";
           }
          if(tam == 5)
           {
            ant=vr.substr(0,2)+"/0"+vr.substr(2,1)+"/";
            obj.value=ant;
           }      
         }

}
//=============================================================================================\\
function FormataCep(obj,teclapres)//0000-0000 // onKeyUp="FormataCep(this,event)"
{
 var tecla = teclapres.keyCode;
 vr = obj.value
 tam = vr.length;
 if(tam==5)
  {
   obj.value = obj.value + '-'
  }
}
//=============================================================================================\\
function isDate(obj) //onblur="isDate(this)"
{
 vr=obj.value;
 if (vr == "")
  {
   return false;
  }
   vr = vr.replace( "/", "" );
   vr = vr.replace( "/", "" );
   vr = vr.replace( "/", "" ); 
   d  = Number(vr.substr(0,2));
   m  = Number(vr.substr(2,2));
   a  = Number(vr.substr(4,4));
   if((isNaN(d))||(isNaN(m))||(isNaN(a))||(d<1)||(d>31)||(m<1)||(m>12)||(a<1800)||(a>2200))
    {
     alert("Preenchimento incorreto da data!! Preencha no formato 'dd/mm/aaaa'. Digite somente números.");
     obj.select();
     obj.focus();
     return false;
    }
}
//=============================================================================================\\
function TestaNumero(obj)// onblur="TestaNumero(this)"
{
 vr = obj.value;
 tam = vr.length; 
 vr = vr.replace( "-", "" ); 
 vr = vr.replace( ".", "" );
 vr = vr.replace( ",", "" );
 if(isNaN(vr) && tam>0)
  {
  alert('O valor digitado tem que ser numérico.');
  obj.focus();
   obj.select();
	obj.value = ""
   return false;
  }
}
//=============================================================================================\\
function FormataTel(obj,teclapres)//00-0000-0000 // onKeyUp="FormataTel(this,event)"
{
 var tecla = teclapres.keyCode;
 vr = obj.value
 tam = vr.length;
 if(tam==4)
  {
   obj.value = obj.value + '-'
  }
}

//=============================================================================================\\
<!-- POUPP
	function OpenPoupoup(theURL,winName,features) { //v2.0
		window.open(theURL,winName,features);
}
//-->

