﻿/*
  Visando acabar com as diferenças dos navegadores foi criado essa função.
  Ela retorna a tecla digitada pelo usuário.
*/
function PegarCodigoTecla(e) {
 if (!e) e = window.event;
 if (e) {
     if (e.keyCode) return e.keyCode;      
     else if (e.which) return e.which; // Netscape 4.?  
     else if (e.charCode) return e.charCode; // Mozilla 
 }
}

function MudarTeclaDigitada(e,tecla) {
  if (!e) e = window.event;
  if (e) {
      if (window.event) //IE       
        if (tecla == 0)
          e.returnValue = null;     
        else
          e.returnValue = tecla;
      else //Firefox       
        e.preventDefault();
  }
}

function NaoEhCodTeclasEspeciais(code) {
  return (code != 44) && (code != 8) && (code != 9) && (code != 35) && (code != 36) && (code != 37) && (code != 38) && (code != 39) && (code != 40);
}


function OnKeyPressNumeros(e) {
  var code = PegarCodigoTecla(e);
  //48 = '0', 57 = '9', 44 = ',', 46 = '.'
  if (((code < 48) || (code > 57)) && NaoEhCodTeclasEspeciais(code)) {
    MudarTeclaDigitada(e,0);
  }
}

function OnKeyPressFloat(e,comp) {
  var code = PegarCodigoTecla(e);
 
  if (((code == 44) || (code == 46)) && (comp.value.indexOf(String.fromCharCode(44)) > -1)) {
    MudarTeclaDigitada(e,0);
    code = 0;
  }
  
  //48 = '0', 57 = '9', 44 = ',', 46 = '.'
  if (((code < 48) || (code > 57) || (code == 46)) && NaoEhCodTeclasEspeciais(code)) {
    MudarTeclaDigitada(e,0);
  }
}

/**
 * Verifica se o email é válido
 * @param String mail
 *      String contendo o email.
 * @return Boolean true se o email é válido, false caso contrário.
 */
function EmailEhValido(mail) {
  var er = new RegExp(/^[A-Za-z0-9_\-\.]+@[A-Za-z0-9_\-\.]{2,}\.[A-Za-z0-9]{2,}(\.[A-Za-z0-9])?/);
  if (typeof(mail) == "string") {
        if (er.test(mail)) { 
          return true; 
        }
  }
  else if(typeof(mail) == "object") {
    if(er.test(mail.value)){ 
      return true; 
    }
  }
  else {
    return false;
  }
}

/**
 * Verifica se a data é válida
 * @param String digData
 *      String contendo a data no formato dd/mm/yyyy.
 * @return Boolean true se a data é válida, false caso contrário.
 */
function DataEhValida(digData) 
{
    var bissexto = 0;
    var data = digData; 
    var tam = data.length;
    if (tam == 10) 
    {
        var dia = parseInt(data.substr(0,2),10);
        var mes = data.substr(3,2);
        var ano = parseInt(data.substr(6,4),10);
        
        if ((ano > 1900)||(ano < 2100))
        {
            if ( (
                 (mes == '01') || (mes == '03') || (mes == '05') || (mes == '07') || (mes == '08') ||
                 (mes == '10') || (mes == '12')
                ) && (dia <= 31) ) {
                return true;
            }
            else if (((mes == '04') || (mes == '06') || (mes == '09') || (mes == '11')) && (dia <= 30)) {           
              return true;
            }
            else if (mes == '02') {
                    /* Validando ano Bissexto / fevereiro / dia */ 
                    if ((ano % 4 == 0) || (ano % 100 == 0) || (ano % 400 == 0)) 
                    { 
                        bissexto = 1; 
                    } 
                    if ((bissexto == 1) && (dia <= 29)) 
                    { 
                        return true;                 
                    } 
                    if ((bissexto != 1) && (dia <= 28)) 
                    { 
                        return true; 
                    }            
            }
        }
    }
    return false;
}

/*
  Verifica se a primeira data é menor que a segunda
*/
function CampararDatas(data1,data2) {
  return ( parseInt( data2.split( "/" )[2].toString() + data2.split( "/" )[1].toString() + data2.split( "/" )[0].toString() ) < parseInt( data1.split( "/" )[2].toString() + data1.split( "/" )[1].toString() + data1.split( "/" )[0].toString() ) )
}

function MascararData(data) {
    if ((data.length == 2 ) || (data.length == 5 )) data += "/";
    return data;
}

function OnKeyPressData(comp,e) {
    var code = PegarCodigoTecla(e);
    
    if ( ((code < 48) || (code > 57)) && NaoEhCodTeclasEspeciais(code)) {
      MudarTeclaDigitada(e,0);
    }
    
    comp.value = MascararData(comp.value);
}


/* VERIFICADOR DE CPF E CNPJ */

var NUM_DIGITOS_CPF  = 11;
var NUM_DIGITOS_CNPJ = 14;
var NUM_DGT_CNPJ_BASE = 8;

/**
 * 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 CpfEhValido(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 CnpjEhValido(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
