/* =============================================================================

                   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:
                         - "cep"  : faz validação de cep;
						             - "fone" : faz validação de telefone;
                         - "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;
                         - "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.


                                                       //-- By Labs 11/2002 --//

==== Histórico
   - 11/12/2002: alteração para o uso de RegEx

============================================================================= */

// Máscaras:
var reCEP   = new RegExp("^\\d{5}(\\-?\\d{3})?$");
var reFone  = new RegExp("\\(\\d{2,3}\\) \\d{3,4}(\\-?\\d{3,4})?$");
//var reCNPF  = new RegExp("^\\d{3}\\.\\d{3}\\.\\d{3}\\-\\d{2}?$");
//var reCNPJ  = new RegExp("^\\d{2}\\.\\d{3}\\.\\d{3}\\/\\d{4}\\-\\d{2}?$");
var reEmail = new RegExp("^.*@.*\\..*(\\.\\w+)?$");


function Validate(actn){

  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 "fone"  :  if (!reFone.test(val)){
				                   alert("Formato de telefone inválido!\n Use '(xx) xxxx-xxxx'");
                                   TagArr[tag][i].focus();
                                   return false;
                               }
                               break;

                case "cep"   : if (!reCep.test(val)){
				                   alert("Formato de CEP inválido!\n Use 'xxxxx-xxx'.");
                                   TagArr[tag][i].focus();
                                   return false;
                               }
                               break;

                case "email" : if (!reEmail.test(val)){
				                   alert("Formato de E-mail inválido!");
                                   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;
            }
       }
  }
  var frm = document.getElementById('frm_form');
  if (frm == null){
      frm = document.getElementById('frm');
  }

  if (frm == 'undefined'){
      alert('Formulário "frm" não encontrado.');
  }

  if (actn) frm.action = actn;
  frm.submit();
  //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){alert('oi');
  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;
}












