/**
* @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)
*/
var NUM_DIGITOS_CPF = 11;
var NUM_DIGITOS_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 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 true 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; itrue 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; itrue 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