/**
 *
 * 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 pEfective, boolean pIsCnpj)
 * boolean isCpf(String pCpf)
 * boolean isCnpj(String pCnpj)
 * boolean isCpfCnpj(String pCpfCnpj)
 */

var NUM_DIGITS_CPF  = 11;
var NUM_DIGITS_CNPJ = 14;
var NUM_DGT_CNPJ_BASE = 8;


/**
 * Adiciona mï¿½todo lpad() ï¿½ classe String.
 * Preenche a String ï¿½ esquerda com o caractere fornecido,
 * atï¿½ que ela atinja o lengthanho 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.prototype.mask = function(m) {
    var m, l = (m = m.split("")).length, s = this.split(""), j = 0, h = "";
    for(var i = -1; ++i < l;)
        if(m[i] != "#"){
            if(m[i] == "\\" && (h += m[++i])) continue;
            h += m[i];
            i + 1 == l && (s[j - 1] += h, h = "");
        }
        else{
            if(!s[j] && !(h = "")) break;
            (s[j] = h + s[j++]) && (h = "");
        }
    return s.join("") + h;
};

String.prototype.digits = function() {
	return this.replace(/\D/g, "");
};


String.prototype.clean = function() {
	var vr = new String(this);
	
	vr = vr.replace ("(", ""); 
	vr = vr.replace (")", ""); 
	vr = vr.replace (" ", ""); 
	vr = vr.replace ("-", ""); 
	vr = vr.replace ("*", ""); 
	vr = vr.replace (".", ""); 
	
	return vr ;
};


/**
 * 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*$/, "");
} 


/**
 * 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+/, "");
} 


/**
 * 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_DIGITS_CNPJ: NUM_DIGITS_CPF;
	var number = unformatNumber(pCpfCnpj);

	number = number.lpad(maxDigitos, '0');
	if (!pUseSepar) return number;

	if (pIsCnpj)
	{
		reCnpj = /(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})$/;
		number = number.replace(reCnpj, "$1.$2.$3/$4-$5");
	}
	else
	{
		reCpf  = /(\d{3})(\d{3})(\d{3})(\d{2})$/;
		number = number.replace(reCpf, "$1.$2.$3-$4");
	}
	return number;
} 


/**
 * Calcula os 2 dï¿½gitos verificadores para o nï¿½mero-efetivo pEfective 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 pEfective
 *      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(pEfective, pIsCnpj)
{
	if (pIsCnpj==null) pIsCnpj = false;
	var i, j, k, sum, dv;
	var cicloPeso = pIsCnpj? NUM_DGT_CNPJ_BASE: NUM_DIGITS_CPF;
	var maxDigitos = pIsCnpj? NUM_DIGITS_CNPJ: NUM_DIGITS_CPF;
	var calculated = formatCpfCnpj(pEfective, false, pIsCnpj);
	calculated = calculated.substring(2, maxDigitos);
	var result = "";

	for (j = 1; j <= 2; j++)
	{
		k = 2;
		sum = 0;
		for (i = calculated.length-1; i >= 0; i--)
		{
			sum += (calculated.charAt(i) - '0') * k;
			k = (k-1) % cicloPeso + 2;
		}
		dv = 11 - sum % 11;
		if (dv > 9) dv = 0;
		calculated += dv;
		result += dv;
	}

	return result;
} 


/**
 * 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 number = formatCpfCnpj(pCpf, false, false);
	var base = number.substring(0, number.length - 2);
	var digits = dvCpfCnpj(base, false);
	var algUnique, i;

	// Valida dï¿½gitos verificadores
	if (number != base + digits) 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.
	 */
	algUnique = true;
	for (i=1; i<NUM_DIGITS_CPF; i++)
	{
		algUnique = algUnique && (number.charAt(i-1) == number.charAt(i));
	}
	return (!algUnique);
} //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 number = formatCpfCnpj(pCnpj, false, true);
	var base = number.substring(0, NUM_DGT_CNPJ_BASE);
	var order = number.substring(NUM_DGT_CNPJ_BASE, 12);
	var digits = dvCpfCnpj(base + order, true);
	var algUnique;
	// Valida dï¿½gitos verificadores
	if (number != base + order + digits) 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.
	 */
	algUnique = number.charAt(0) != '0';
	for (i=1; i<NUM_DGT_CNPJ_BASE; i++)
	{
		algUnique = algUnique && (number.charAt(i-1) == number.charAt(i));
	}
	if (algUnique) 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 (order == "0000") return false;
	return (base == "00000000"
		|| parseInt(order, 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 number = pCpfCnpj.replace(/\D/g, "");
	if (number.length > NUM_DIGITS_CPF)
		return isCnpj(pCpfCnpj)
	else
		return isCpf(pCpfCnpj);
} 

function maskCNPJ(field, keypress){

	field.value = field.value.digits().mask('##.###.###/####-##');
}

function maskPhone(field, keypress){
		
	field.value = field.value.digits().clean().clean().clean().mask('(##) ####-####');
	
}

function maskCEP(field, keypress){

	field.value = field.value.digits().clean().clean().mask('#####-###');	

}

function maskCPF(field, keypress){

	field.value = field.value.digits().clean().clean().clean().clean().mask('###.###.###-##');
	
}

function checkMail(field){
	if (field.value == "")	
		return;

	var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	if  (!(filter.test(field.value)))
		alert('Endereço de e-mail inválido. Por favor verifique.');
}

function checkCnpj(field) {
	if (field.value == "")	
		return;
	
 	if (!isCnpj(field.value))
 		alert('Número de CNPJ inválido. Por favor verifique.');
	
}