/*******************************************************
 * 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*$/, "");
} 
/************************************************************************
* Método que recebe como parametro um email informado, e valida se esse *
* email esta correto ou não, retorna true ou false.                     *
*************************************************************************/
function ValidaEmail(email)
{
	var reEmail = /^[\w-]+(\.[\w-]+)*@(([A-Za-z\d][A-Za-z\d-]{0,61}[A-Za-z\d]\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/;
	if (reEmail.test(email)) 
	{
		return true;
	} else if (email != null && email != "") 
	{
		return false;
	}
}
/***********************************************************
 * 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);
} 
/*******************************************************************
 * 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+/, "");
} 
/**************************************************************
* Verifica se o valor passado por parametro so contem numero  *
* @param string num											  *
* String de numero fornecida para verificacao				  *
* @return true caso esteja tudo ok, ou false caso exista letra*
**************************************************************/
function verificaSeContemLetra(num)
{
	var retorno = String(num).replace(/^\d+$/,"SIM");
	if(retorno == "SIM")
	{
		return(false);
	}
	else
	{
		return(true);
	}	
}	
/*************************************************************************
 * 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;
} 
function removeCaracters(valor)
{
	valor =	valor.replace("-","");
	valor = valor.replace(".","");
	valor = valor.replace(".","");
	
	return  valor;
}
/***************************************************************************
 * 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.					   *
 ***************************************************************************/
//constantes usadas nos dois métodos para validacao do cpf
NUM_DIGITOS_CPF  = 11;
NUM_DIGITOS_CNPJ = 14;
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;
} 
/************************************************************************
 * 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)
{
	pCpf = removeCaracters(pCpf);
	var numero = formatCpfCnpj(pCpf, false, false);
	var base = numero.substring(0, numero.length - 2);
	var digitos = dvCpfCnpj(base, false);
	var algUnico, i;
	
	if(verificaSeContemLetra(pCpf))
	{
	  return(false); 
	}
	// 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);
} 
 /************************************************************************
* Método para verificar se a data informada é valida, recebe como parametro
/* o valor do campo data re                    *
*************************************************************************/
function verifica_data(data) 
{ 
	dia = (data.substring(0,2)); 
    mes = (data.substring(3,5)); 
    ano = (data.substring(6,10)); 

    // verifica o dia valido para cada mes 
    if ((dia < 01)||(dia < 01 || dia > 30) && (  mes == 04 || mes == 06 || mes == 09 || mes == 11 ) || dia > 31) 
    { 
		return false;
	} 
	// verifica se o mes e valido 
    if (mes < 01 || mes > 12 ) 
    { 
		return false;
	} 
	// verifica se e ano bissexto 
    if (mes == 2 && ( dia < 01 || dia > 29 || ( dia > 28 && (parseInt(ano / 4) != ano / 4)))) 
    { 
		return false;
    } 
	return true;
 } 
