/**
 * @author Originally from: http://www.construindoseusite.com.br/javascript/scripts/js_validacao_cpf_imp.htm
 */
function checkCPF(sCPF) {
    var CPF = sCPF.replace(/\D+/g, '');
    
    if (CPF==null || CPF.length!=11)
        return false;
    
    var i;
    var sameChar = true;
    var firstChar = CPF.charAt(0);
    for (i=1; i<CPF.length; i++) {
        if (firstChar!=CPF.charAt(i)) {
            sameChar=false;
            break;
        }
    }
    if (sameChar)
        return false;
    
    // Aqui começa a checagem do CPF
    var POSICAO, I, SOMA, DV, DV_INFORMADO;
    var DIGITO = new Array(10);
    DV_INFORMADO = CPF.substr(9, 2); // Retira os dois últimos dígitos do número informado

    // Desemembra o número do CPF na array DIGITO
    for (I=0; I<=8; I++) {
        DIGITO[I] = CPF.substr( I, 1);
    }

    // Calcula o valor do 10º dígito da verificação
    POSICAO = 10;
    SOMA = 0;
    for (I=0; I<=8; I++) {
        SOMA = SOMA + DIGITO[I] * POSICAO;
        POSICAO = POSICAO - 1;
    }
    DIGITO[9] = SOMA % 11;
    if (DIGITO[9] < 2) {
        DIGITO[9] = 0;
    }
    else{
        DIGITO[9] = 11 - DIGITO[9];
    }

    // Calcula o valor do 11º dígito da verificação
    POSICAO = 11;
    SOMA = 0;
    for (I=0; I<=9; I++) {
        SOMA = SOMA + DIGITO[I] * POSICAO;
        POSICAO = POSICAO - 1;
    }
    DIGITO[10] = SOMA % 11;
    if (DIGITO[10] < 2) {
        DIGITO[10] = 0;
    }
    else {
        DIGITO[10] = 11 - DIGITO[10];
    }

    // Verifica se os valores dos dígitos verificadores conferem
    DV = DIGITO[9] * 10 + DIGITO[10];
    return (DV == DV_INFORMADO);
}

/**
 * @author Originally from: http://www.pcforum.com.br/cgi/yabb/YaBB.cgi?board=cgi;action=display;num=1090001360
 */
function checkCNPJ(sCNPJ) {
    if (sCNPJ==null)
        return false;
    
    var numeros, digitos, soma, i, resultado, pos, tamanho, digitos_iguais;
    var cnpj = sCNPJ.replace(/\D+/g, '');
    
    digitos_iguais = 1;
    if (cnpj.length != 14)
        return false;

    for (i = 0; i < cnpj.length - 1; i++)
        if (cnpj.charAt(i) != cnpj.charAt(i + 1))
    {
        digitos_iguais = 0;
        break;
    }
    if (digitos_iguais)
        return false;
  
    tamanho = cnpj.length - 2
    numeros = cnpj.substring(0,tamanho);
    digitos = cnpj.substring(tamanho);
    soma = 0;
    pos = tamanho - 7;
    for (i = tamanho; i >= 1; i--)
    {
        soma += numeros.charAt(tamanho - i) * pos--;
        if (pos < 2)
            pos = 9;
    }
    resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
    if (resultado != digitos.charAt(0))
    {
        return false;
    }

    tamanho = tamanho + 1;
    numeros = cnpj.substring(0,tamanho);
    soma = 0;
    pos = tamanho - 7;
    for (i = tamanho; i >= 1; i--)
    {
        soma += numeros.charAt(tamanho - i) * pos--;
        if (pos < 2)
            pos = 9;
    }
    resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
    if (resultado != digitos.charAt(1)){
        return false;
    }
    return true;
}

//http://www.numberingplans.com/?page=analysis&sub=imeinr
//http://en.wikipedia.org/wiki/IMEI
function checkIMEI(sIMEI) {
    if (sIMEI==null)
        return false;
    
    var imei = sIMEI.replace(/\D+/g, '');
    
    if (imei.length != 15)
        return false;
    
    var len = imei.length;
    digit = Number(imei.charAt(len-1));
    
    var same = true;
    var n = 0;
    var idx = 13;
    for (var i=7; i>0; i--) {
        var d1 = Number(imei.charAt(idx--));
        var dd = d1*2;
        if (dd>=10)
            dd-=9;
        var d2 = Number(imei.charAt(idx--));
        if (d1!=d2)
            same=false;
        n += dd+d2;
    }
    if (same)
        return false;
    
    var v = (n % 10);
    if (v>0)
        v=10-v;
    
    return v==digit;
}
