// JavaScript Document
/**
 * @author Márcio d'Ávila
 * @version 1.01, 2004
 *
 * PROTÓTIPOS:
 * método String.lpad(int pSize, char pCharPad)
 * método String.trim()
 *
 * String unformatNumber(String pNum)
 * String formatCpfCnpj(String pCpfCnpj, boolean pUseSepar, boolean pIsCnpj)
 * String dvCpfCnpj(String pEfetivo, boolean pIsCnpj)
 * boolean isCpf(String pCpf)
 * boolean isCnpj(String pCnpj)
 * boolean isCpfCnpj(String pCpfCnpj)
 */


NUM_DIGITOS_CPF  = 11;
NUM_DIGITOS_CNPJ = 14;
NUM_DGT_CNPJ_BASE = 8;


/**
 * Adiciona método lpad() à classe String.
 * Preenche a String à esquerda com o caractere fornecido,
 * até que ela atinja o tamanho especificado.
 */
String.prototype.lpad = function(pSize, pCharPad)
{
	var str = this;
	var dif = pSize - str.length;
	var ch = String(pCharPad).charAt(0);
	for (; dif>0; dif--) str = ch + str;
	return (str);
} //String.lpad


/**
 * Adiciona método trim() à classe String.
 * Elimina brancos no início e fim da String.
 */
String.prototype.trim = function()
{
	return this.replace(/^\s*/, "").replace(/\s*$/, "");
} //String.trim


/**
 * Elimina caracteres de formatação e zeros à esquerda da string
 * de número fornecida.
 * @param String pNum
 * 	String de número fornecida para ser desformatada.
 * @return String de número desformatada.
 */
function unformatNumber(pNum)
{
	return String(pNum).replace(/\D/g, "").replace(/^0+/, "");
} //unformatNumber


/**
 * Formata a string fornecida como CNPJ ou CPF, adicionando zeros
 * à esquerda se necessário e caracteres separadores, conforme solicitado.
 * @param String pCpfCnpj
 * 	String fornecida para ser formatada.
 * @param boolean pUseSepar
 * 	Indica se devem ser usados caracteres separadores (. - /).
 * @param boolean pIsCnpj
 * 	Indica se a string fornecida é um CNPJ.
 * 	Caso contrário, é CPF. Default = false (CPF).
 * @return String de CPF ou CNPJ devidamente formatada.
 */
function formatCpfCnpj(pCpfCnpj, pUseSepar, pIsCnpj)
{
	if (pIsCnpj==null) pIsCnpj = false;
	if (pUseSepar==null) pUseSepar = true;
	var maxDigitos = pIsCnpj? NUM_DIGITOS_CNPJ: NUM_DIGITOS_CPF;
	var numero = unformatNumber(pCpfCnpj);

	numero = numero.lpad(maxDigitos, '0');
	if (!pUseSepar) return numero;

	if (pIsCnpj)
	{
		reCnpj = /(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})$/;
		numero = numero.replace(reCnpj, "$1.$2.$3/$4-$5");
	}
	else
	{
		reCpf  = /(\d{3})(\d{3})(\d{3})(\d{2})$/;
		numero = numero.replace(reCpf, "$1.$2.$3-$4");
	}
	return numero;
} //formatCpfCnpj


/**
 * Calcula os 2 dígitos verificadores para o número-efetivo pEfetivo de
 * CNPJ (12 dígitos) ou CPF (9 dígitos) fornecido. pIsCnpj é booleano e
 * informa se o número-efetivo fornecido é CNPJ (default = false).
 * @param String pEfetivo
 * 	String do número-efetivo (SEM dígitos verificadores) de CNPJ ou CPF.
 * @param boolean pIsCnpj
 * 	Indica se a string fornecida é de um CNPJ.
 * 	Caso contrário, é CPF. Default = false (CPF).
 * @return String com os dois dígitos verificadores.
 */
function dvCpfCnpj(pEfetivo, pIsCnpj)
{
	if (pIsCnpj==null) pIsCnpj = false;
	var i, j, k, soma, dv;
	var cicloPeso = pIsCnpj? NUM_DGT_CNPJ_BASE: NUM_DIGITOS_CPF;
	var maxDigitos = pIsCnpj? NUM_DIGITOS_CNPJ: NUM_DIGITOS_CPF;
	var calculado = formatCpfCnpj(pEfetivo, false, pIsCnpj);
	calculado = calculado.substring(2, maxDigitos);
	var result = "";

	for (j = 1; j <= 2; j++)
	{
		k = 2;
		soma = 0;
		for (i = calculado.length-1; i >= 0; i--)
		{
			soma += (calculado.charAt(i) - '0') * k;
			k = (k-1) % cicloPeso + 2;
		}
		dv = 11 - soma % 11;
		if (dv > 9) dv = 0;
		calculado += dv;
		result += dv
	}

	return result;
} //dvCpfCnpj


/**
 * Testa se a String pCpf fornecida é um CPF válido.
 * Qualquer formatação que não seja algarismos é desconsiderada.
 * @param String pCpf
 * 	String fornecida para ser testada.
 * @return <code>true</code> se a String fornecida for um CPF válido.
 */
function isCpf(pCpf)
{
	var numero = formatCpfCnpj(pCpf, false, false);
	var base = numero.substring(0, numero.length - 2);
	var digitos = dvCpfCnpj(base, false);
	var algUnico, i;

	// Valida dígitos verificadores
	if (numero != base + digitos) return false;

	/* Não serão considerados válidos os seguintes CPF:
	 * 000.000.000-00, 111.111.111-11, 222.222.222-22, 333.333.333-33, 444.444.444-44,
	 * 555.555.555-55, 666.666.666-66, 777.777.777-77, 888.888.888-88, 999.999.999-99.
	 */
	algUnico = true;
	for (i=1; i<NUM_DIGITOS_CPF; i++)
	{
		algUnico = algUnico && (numero.charAt(i-1) == numero.charAt(i));
	}
	return (!algUnico);
} //isCpf


/**
 * Testa se a String pCnpj fornecida é um CNPJ válido.
 * Qualquer formatação que não seja algarismos é desconsiderada.
 * @param String pCnpj
 * 	String fornecida para ser testada.
 * @return <code>true</code> se a String fornecida for um CNPJ válido.
 */
function isCnpj(pCnpj)
{
	var numero = formatCpfCnpj(pCnpj, false, true);
	var base = numero.substring(0, NUM_DGT_CNPJ_BASE);
	var ordem = numero.substring(NUM_DGT_CNPJ_BASE, 12);
	var digitos = dvCpfCnpj(base + ordem, true);
	var algUnico;

	// Valida dígitos verificadores
	if (numero != base + ordem + digitos) return false;

	/* Não serão considerados válidos os CNPJ com os seguintes números BÁSICOS:
	 * 11.111.111, 22.222.222, 33.333.333, 44.444.444, 55.555.555,
	 * 66.666.666, 77.777.777, 88.888.888, 99.999.999.
	 */
	algUnico = numero.charAt(0) != '0';
	for (i=1; i<NUM_DGT_CNPJ_BASE; i++)
	{
		algUnico = algUnico && (numero.charAt(i-1) == numero.charAt(i));
	}
	if (algUnico) return false;

	/* Não será considerado válido CNPJ com número de ORDEM igual a 0000.
	 * Não será considerado válido CNPJ com número de ORDEM maior do que 0300
	 * e com as três primeiras posições do número BÁSICO com 000 (zeros).
	 * Esta crítica não será feita quando o no BÁSICO do CNPJ for igual a 00.000.000.
	 */
	if (ordem == "0000") return false;
	return (base == "00000000"
		|| parseInt(ordem, 10) <= 300 || base.substring(0, 3) != "000");
} //isCnpj


/**
 * Testa se a String pCpfCnpj fornecida é um CPF ou CNPJ válido.
 * Se a String tiver uma quantidade de dígitos igual ou inferior
 * a 11, valida como CPF. Se for maior que 11, valida como CNPJ.
 * Qualquer formatação que não seja algarismos é desconsiderada.
 * @param String pCpfCnpj
 * 	String fornecida para ser testada.
 * @return <code>true</code> se a String fornecida for um CPF ou CNPJ válido.
 */
function isCpfCnpj(pCpfCnpj)
{
	var numero = pCpfCnpj.replace(/\D/g, "");
	if (numero.length > NUM_DIGITOS_CPF)
		return isCnpj(pCpfCnpj)
	else
		return isCpf(pCpfCnpj);
} //isCpfCnpj



/**
 *   Validação de formulários
 *   Baseado em diversos scripts disponibilizados sem discriminação de licença
 *   ou crédito aos autores   
 *   Organizado e Adaptadado por Ubiratã Carvalho Nogueira - 2006/2007       
 */ 

    //Genericas
    function trimAll(sString) {
    	while (sString.substring(0,1) == ' '){
    		sString = sString.substring(1, sString.length);}
    	while (sString.substring(sString.length-1, sString.length) == ' '){
    		sString = sString.substring(0,sString.length-1);}
    	return sString;
    }
    
    //Formatação
    function fmt_data(campo, teclapres){
       var tecla = teclapres.keyCode;
       var vr = new String(campo.value);
       vr 	= vr.replace("/","");
       vr 	= vr.replace("/","");
       vr 	= vr.replace("/","");
       tam 	= vr.length + 1 ;
       if (tecla != 9 && tecla != 8){
          if (tam > 2 && tam < 5)
             campo.value = vr.substr(0,2) + '/' + vr.substr(2, tam);
          if (tam >= 5 && tam < 10)
             campo.value = vr.substr(0,2) + '/' + vr.substr(2,2) + '/' + vr.substr(4,tam-4);
    
      }
    }
    
    function fmt_hora(campo,teclapres){
     var tecla = teclapres.keyCode;
     var vr = new String(campo.value);
     vr = vr.replace(":", "");
     tam = vr.length;
     if (tecla != 9 && tecla != 8){
       if(tam >= 2){
        campo.value = vr.substr(0, 2) + ':' + vr.substr(2, 4); }
       else{
        campo.value = vr;
       }
     }
     return campo.value;
    }       

    function fmt_cep(campo,teclapres){
       var tecla = teclapres.keyCode;
       var vr = new String(campo.value);
       vr 	= vr.replace(".", "");
       vr 	= vr.replace(".", "");
       vr 	= vr.replace("-", "");
       tam 	= vr.length + 1 ;
       if (tecla != 9 && tecla != 8){
          if (tam > 5 && tam < 8)
             campo.value = vr.substr(0,5) + '-' + vr.substr(5, tam-5);
          }
    }   
    
    //Validação
    function val_hora(campo,titulo){
       var Hora = '';
       var Minuto = '';
       var mFlag = true;
       
       if(campo.value != ''){
          if(campo.value.length != 5) mFlag = false;
          Hora = campo.value.substr(0, 2);
          Minuto = campo.value.substr(3, 5);
          Hora = parseInt(Hora);
          Minuto = parseInt(Minuto);
          if((Hora > 23) ||(Minuto > 59)) mFlag = false;          
          if(!mFlag){                         
             alert('Hora Inválida no campo ' + titulo.toUpperCase() + '!');
             campo.focus();
             campo.value='';
             return mFlag                                                           
          }
       }
      return mFlag;
    }
    
    function val_data(campo,titulo){
    	var vData = campo.value;
      var mFlag = true;
      
      if(vData != ''){
        if (vData==0) mFlag = false;
      	var Parte=vData.split("/"); 
      	Ano=Parte[2];
      	Mes=Parte[1];
      	Dia=Parte[0];
      	if (Parte.join("").length != 8) mFlag = false;
      	if (isNaN(Parte.join(""))) mFlag = false;
      	if (Ano < 1500) mFlag = false;
      	Data1 = new Date(Ano,Mes-1,Dia);
      	if (Mes < 1 || Mes > 12) mFlag = false;
      	if (Dia < 1 || Dia > 31) mFlag = false;
      	if (Dia > 30 || (Dia > 28 && Mes == 02 )){
       		D = Data1.getDate();
       		if (D < Dia)mFlag = false;
        }               
        if(!mFlag){            
          alert('Data Inválida no campo ' + titulo.toUpperCase() + '!');
          campo.focus();
          campo.value='';
          return mFlag;                                                                
        } 
      }
      return mFlag;
    }    	
    
    function val_cep(campo,titulo) {
      var mFlag = true;      
      var strCEP = campo.value;
      
      if (strCEP.length != 8 ) mFlag = false;
    	//if (strCEP.charAt(5) != "-") mFlag = false;
    		if(document.layers && parseInt(navigator.appVersion) == 4){
    			x = strCEP.substring(0,5);
    			x += strCEP.substring(6,9);
    			strCEP = x;	
    		}
        else{
    			strCEP = strCEP.replace("-","");
    		}
    	var nonNumbers = /\D/;
    	if (nonNumbers.test(strCEP)) mFlag = false;      
      
      if(!mFlag){            
          alert('O CEP digitado no campo ' + titulo.toUpperCase() + 'é inválido!');
          campo.focus();
          campo.value='';
          return mFlag;                                                                
      }     	
      return mFlag;
    }

    
    function allValidChars(email,titulo){
      var parsed = true;
      var validchars = "abcdefghijklmnopqrstuvwxyz0123456789@.-_";
      for (var i=0; i < email.length; i++) {
        var letter = email.charAt(i).toLowerCase();
        if (validchars.indexOf(letter) != -1)
          continue;
        parsed = false;
        break;
      }
      return parsed;
    }
    
    function val_email(campo,titulo) {
        
      var email = campo.value;        
      var mFlag = true;
      
      if(email != ''){       
        email=email.replace(/^\s*|\s*$/g,"");

        if (!allValidChars(email)) {
            mFlag = false;
        }
        if (email.indexOf("@") < 1) {
            mFlag = false;
        } else if (email.lastIndexOf(".") <= email.indexOf("@")) {
            mFlag = false;
        } else if (email.indexOf("@") == email.length) {
            mFlag = false;
        }
    	  if(!mFlag){            
          alert('O endereço de e-mail no campo ' + titulo.toUpperCase() + ' é inválido!');
          campo.focus();          
          return mFlag;                                                                
        } 
      }
      return mFlag;
    }
    
    
    function val_inteiros(campo,titulo){
      var strCampo = campo.value;
      var validchars = "0123456789";
      var mFlag = true;
       
      for (var i=0; i < strCampo.length; i++) {
        var letter = strCampo.charAt(i).toLowerCase();
        if (validchars.indexOf(letter) != -1) continue;
        mFlag = false;
        break;
      }
  	  if(!mFlag){            
        alert('O campo ' + titulo.toUpperCase() + ' só aceita números inteiros!');
        campo.focus();          
        return mFlag;                                                                
      }                  
      return mFlag;
    }
    
    
    function val_cnpj(campo,titulo) {
      
      var mFlag = true;      
      
      if(campo.value!= '' && campo.value != '00.000.000/0000-00')
        {          
          var strCNPJ = unformatNumber(campo.value);          
          if(!isCnpj(strCNPJ)) mFlag = false;           
        }
       else
        {
           mFlag = false
        }

      if(!mFlag){            
          alert('O CNPJ digitado no campo ' + titulo.toUpperCase() + ' é inválido!');
          campo.focus();
          campo.value='';
          return mFlag;                                                                
      }
             
      return mFlag;

    }
    
    function val_cpf(campo,titulo) {
      
      var mFlag = true;      

      if(campo.value!= '' && campo.value != '000.000.000-00')
        {                
          var strCPF = unformatNumber(campo.value);
          if(!isCpf(strCPF)) mFlag = false; 
        }
       else
        {
           mFlag = false
        }

      if(!mFlag){            
          alert('O CPF digitado no campo ' + titulo.toUpperCase() + ' é inválido!');
          campo.focus();
          campo.value='';
          return mFlag;                                                                
        }  
              
      return mFlag;

    }

    function fncValidaGrupoCheckbox(strPrefixo,intContador,strTituloCampo){
      var intCheckBoxes = document.getElementById(intContador).value;
      var intChecked    = 0;
      
      for(idx=0;intCheckBoxes>idx;idx++){
        if(document.getElementById(strPrefixo+idx).checked) intChecked++;               
      };
      
      if(intChecked==0){ 
        alert('Selecione pelo menos um item no quadro '+ strTituloCampo.toUpperCase() +' para prosseguir!'); 
        return false;       
      }
      else{
        return true;
      };
    }

	 //Validação do formulário
        
    function fncValida(campos){
      
      var mFlag = true;
      var arr_campos = campos.split(';');
      
      principal: for(x=0; x<arr_campos.length; x++){
        arr_itens  = arr_campos[x].split(',');        
        
        var requerido = arr_itens[0];
        var nome      = arr_itens[1];
        var titulo    = arr_itens[2];
        var tipo      = arr_itens[3];
        var conteudo  = arr_itens[4];
        var minimo    = arr_itens[5];
        var maximo    = arr_itens[6];
        
        var element = document.getElementById(nome);
        
        
          switch(tipo){
            
            case 'text':
              
              if(requerido=='s' && (trimAll(element.value).length < minimo || element.value=='')) mFlag = false;
              if(requerido=='n' && (trimAll(element.value).length < minimo && element.value!='')) mFlag = false;
                            
              if(!mFlag){
                alert('O campo '+ titulo.toUpperCase() +' está em branco ou incompleto [minimo de '+ minimo +' caracteres]!\nCorrija este problema para prosseguir.');
                element.focus();
                break principal;
              };
                      
              if(maximo!='' && trimAll(element.value).length > maximo){
                mFlag = false;
                alert('O campo '+ titulo.toUpperCase() +' permite somente '+ maximo +' caracteres!\nCorrija este problema para prosseguir.');
                element.focus();
                break principal;
              };
              
              break;
            
            case 'select':
                    
              if(element.value=='null' || element.value=='' || element.value=='-'){
                alert('Selecione uma opção no campo '+ titulo.toUpperCase() +' para prosseguir');
                element.focus();              
                mFlag = false;
                break principal;
              }        
              break;
          }
        
        
        switch(conteudo){
          
          case 'inteiro':
            if(!val_inteiros(element,titulo)){
              mFlag = false;
              break principal
            };
            break;
              
          case 'data':
            if(!val_data(element,titulo)){
              mFlag = false;
              break principal;
            }            
            break;
            
          case 'hora':
            if(!val_hora(element,titulo)){
              mFlag = false;
              break principal;
            }            
            break;
          
          case 'email':
            if(!val_email(element,titulo)){ 
              mFlag = false;
              break principal;
            }
            break;
          
          case 'cep':
            if(!val_inteiros(element,titulo)){
              mFlag = false;
              break principal;
            }
            else if(!val_cep(element,titulo)){ 
              mFlag = false;
              break principal;
            }
            break;
          
          case 'cnpj':
            if(!val_cnpj(element,titulo)){ 
              mFlag = false;
              break principal;
            }
            break;
            
          case 'cpf':
            if(!val_cpf(element,titulo)){ 
              mFlag = false;
              break principal;
            }
            break;                                           
                                 
        }       
      }
      return mFlag;
    }
