/* =============================================================================
   
                   Biblioteca de Validação de Formulários
   
   Autor:   Luiz Antonio B. Silva [labs@dathaweb.com.br]
   Empresa: Dathaweb Sistemas Interativos  
            Belo Horizonte - MG 
            (31)3441-8226
     
   Versão:  1.0 
   Data:    05/11/2002
   
   Esta biblioteca tenta centralizar todas as rotinas de validação de 
   formulários. Novas funções deverão ser incluídas quando necessárias.
   
   Exemplo de uso:
   
   <span>Nome:</span>
   <input req="true" label="Nome" checkFor="data" type="text" name="NOME">
   
   req="true"          ==> verifica se o campo não possui valor;
   label="blah"	       ==> nome que aparecerá na mensagem de erro, se houver;
   checkFor="param"	   ==> executa verificação especial. "param" pode ser:
                         - "data" : faz validação de data;
                         - "cpf"  : faz validação de CNPF;
                         - "cnpj" : validação de CNPJ (ainda não implementado);
                         - "email": validação de email (ainda não implementado);
                         - "senha": Validação de senha;
                         
    No caso da validação de senha, outros parâmetros devem ser definidos:
    confirm_id="blah"  ==> id do input de confirmação. ID e não NAME!
    min_len="8"        ==> opcional. Tamanho mínimo da senha.

    Na tag <form> colocar
    onSubmit="return Validate(this)"
        
                                                       //-- By Labs 11/2002 --//
============================================================================= */


function Validate(){

  var Msg = "";
  var n = 0;
  
  // Tags que serão validadas:
  var TagArr = new Array();
  TagArr[0] = document.getElementsByTagName("input"); 
  TagArr[1] = document.getElementsByTagName("select"); 
  TagArr[2] = document.getElementsByTagName("textarea"); 
  
  // São obrigatórios?
  for (tag = 0; tag < TagArr.length; tag++){
       for (i = 0; i < TagArr[tag].length; i++){
            if (TagArr[tag][i].getAttribute("req") && !TagArr[tag][i].value){
                if (Msg != "") Msg += ", ";
                Msg += TagArr[tag][i].getAttribute("label");
                n++;
            }
       }  
  }

  // Se tem obrigatório vazio, reclama:
  if (Msg != ""){
      if (n > 1) alert("Atenção! Os campos " + Msg + " são de preenchimento obrigatório.");
      else alert("Atenção! O campo " + Msg + " é de preenchimento obrigatório.");
      return false;
  }
  
  // Verificações especiais:
  for (tag = 0; tag < TagArr.length; tag++){
       for (i = 0; i < TagArr[tag].length; i++){
            checkFor = TagArr[tag][i].getAttribute("checkFor");
            val = TagArr[tag][i].value;
            switch (checkFor){
                case "data"  : if (!checkData(val)){
                                    TagArr[tag][i].focus();
                                    return false;
                               }
                               break;
            
                case "cpf"   : if (!checkCPF(val)){
                                   alert("CNPF inválido!");
                                   TagArr[tag][i].focus();
                                   return false;
                               }
                               break;
            
                case "cnpj"  : checkCNPJ(val);
                               break;
            
                case "email" : checkEMail(val);
                               break;
                               
                case "senha" : var confirm = TagArr[tag][i].getAttribute("confirm_id");
                               if (confirm){
							       confirm = document.getElementById(confirm).value;
                                   min_len = TagArr[tag][i].getAttribute("min_len"); 
                                   if (!checkSenha(TagArr[tag][i].value, confirm, min_len)){
                                       TagArr[tag][i].focus();
                                       return false;
                                   }
                               } else alert("Defina o atributo 'confirm_id' no input de senha, para fazer a validação de senhas.");
                               break;  
            }
       }
  } 
  return true;
}


// à implementar:
function checkCNPJ(CNPJ){return true;}
function checkEMail(email){return true;}


//=========================== Validação de CNPF ==============================//
                                                       //-- By Labs 11/2002 --//

/* extractNum(val);
      Limpa tudo o que não for número do valor informado.
*/
function extractNum(val){
  var result = '';
  for (i = 0; i <= val.length; i++){
       if (!isNaN(val.substr(i, 1)))
           result += val.substr(i, 1);
  }
  return result;
}

/* checkCPF(CNPF);
      A função retornará true ou false para o CNPF informado.
*/
function checkCPF(CNPF){    
  sValor = extractNum(CNPF);
  if (sValor == '' || isNaN(sValor) || sValor.length != 11) return false;

  soma = (sValor.substr(0,1) * 10) + 
         (sValor.substr(1,1) * 9)  +
         (sValor.substr(2,1) * 8)  + 
         (sValor.substr(3,1) * 7)  +
         (sValor.substr(4,1) * 6)  + 
         (sValor.substr(5,1) * 5)  + 
         (sValor.substr(6,1) * 4)  + 
         (sValor.substr(7,1) * 3)  + 
         (sValor.substr(8,1) * 2);
  dv1 = (soma % 11);
  if (dv1 == 0 || dv1 == 1) 
       dv1 = 0;
  else dv1 = 11 - dv1;
  
  soma = (sValor.substr(0,1) * 11) + 
         (sValor.substr(1,1) * 10) + 
         (sValor.substr(2,1) * 9)  + 
         (sValor.substr(3,1) * 8)  + 
         (sValor.substr(4,1) * 7)  + 
         (sValor.substr(5,1) * 6)  + 
         (sValor.substr(6,1) * 5)  + 
         (sValor.substr(7,1) * 4)  + 
         (sValor.substr(8,1) * 3)  + 
         (dv1 * 2);
  dv2 = (soma % 11);
  if (dv2 == 0 || dv2 == 1) 
       dv2 = 0;
  else dv2 = 11 - dv2;
  
  if (sValor.substr(9,1) != dv1 || sValor.substr(10,1) != dv2)
      return false;
      
  return true;
}

//=========================== Validação de Data ==============================//
                                                       //-- By Labs 11/2002 --//

/* checkData(data):
       Verifica a data sequencialmente.
*/
function checkData(data){
  var msg = "Atenção! Data inválida:\n";
  if (data.length != 10){
    alert(msg + "A data deve ser informada no padrão DD/MM/YYYY."); 
    return false;
  }
  
  // Dia:
  var strDia = data.substr(0, 2);
  var dia = parseInt(strDia, 10);
  if (dia > 31 || dia < 1 || isNaN(dia) || dia == '' || dia != strDia){
       alert(msg + "O dia informado está incorreto."); 
    return false;
  }
  
  // Ano:
  var strAno = data.substr(6, 4);
  var ano = parseInt(strAno, 10);
  if (ano < 0 || isNaN(ano) || ano == '' || ano != strAno){
       alert(msg + "O ano informado está incorreto."); 
       return false;
  }
  
  // Mês:
  var strMes = data.substr(3, 2);
  var mes = parseInt(strMes, 10); 
  if (mes > 12 || mes < 1 || isNaN(mes) || mes == '' || mes != strMes){
      alert(msg + "O mês informado está incorreto."); 
      return false;
  }    
  
  switch (mes){
      case 2 : if (((ano % 400) == 0) || ((ano % 4) == 0 && (ano % 100) != 0)) n = 29;
               else n = 28;
               break;
          
      case 1 :; case 3 :; case 5:;
      case 7 :; case 8 :; case 10:;
      case 12: n = 31;
               break;
       
      default : n = 30;
  }
  
  if (dia > n){
      alert(msg + "O mês informado tem apenas " + n + " dias.");
      return false;
  } 
  return true;
}



//=================== Validação de Senha e Confirmação =======================//
                                                       //-- By Labs 11/2002 --//

/* checkSenha(senha, confirm, min_len):
       Verifica se a senha e a confirmação são iguais. Opcionalmente pode-se
       garantir um tamanho mínimo para a senha.
*/
function checkSenha(senha, confirm, min_len){
  if (min_len){
      if (senha.length < parseInt(min_len, 10)){
          alert("Atenção! Senha inválida.\n A senha deve ter no mínimo " + min_len + " caracteres.");
          return false;
      }
  }

  if (senha != confirm){
      alert("Atenção!\n A senha e a confirmação não conferem.");
      return false;
  }
  return true;
}


