/*  SSWin - AJAX Framework
    www.cebinet.com.br
    silviosa@sswin.com.br
    Junho/2008
    ====================== */

var sjsValidCpfCnpj= {
// Objeto para validação dos códigos de CPF e CNPJ

    validar: function(dadoInformado){

        // preparar
        var dado=dadoInformado;
        var fmt='erro'; var dadoFmt=''; var msg='';

        // remover eventual formatação, ficando somente com algarismos
        var ix; var w='';
        for (ix = 0; ix < dado.length; ix++) { var dig=dado.charAt(ix); if(dig>=0 && dig<=9){ w+=dig; } }
        dado=w;

        // escapa quando for vazio
        if(dado.length==0){
            msg='O campo informado não contém dígitos numéricos';
            return { retCode: false, formato: fmt, dadoFormatado: dadoFmt, erro: msg };
        }

        // descobre se é cpf ou cnpj, pelo tamanho
        fmt='cpf';
        if(dado.length>11) fmt='cnpj';
        if(dado.length>15) fmt='erro';

        // ajusta o tamanho da string
        var m=(fmt=='cpf' ? 11 : 14); var w=''; var x=m-dado.length; var i=0;
        for(i=0; i<x; i++) { w+='0'} dado=w+dado;

        // separa o código em suas partes
        var partes=new Array();
        if(fmt=='cpf'){ partes[0]=dado.substr(0,9); partes[1]=dado.substr(9,2); }
        else if(fmt='cnpj'){ partes[0]=dado.substr(0,8); partes[1]=dado.substr(8,4); partes[2]=dado.substr(12,2); }
        else { partes[0]=dado; }

        // faz a validação
        if(fmt=='cpf') var ret=this.digitoCpf(partes); else var ret=this.digitoCnpj(partes);
        if(ret.retCode==false){ return { retCode: false, formato: fmt, dadoFormatado: dadoFmt, erro: ret.erro }; }

        // formata o código
        if(fmt=='cpf'){
            dadoFmt=partes[0].substr(0,3)+'.'+partes[0].substr(3,3)+'.'+partes[0].substr(6,3);
            dadoFmt+='-'+partes[1];
        } else {
            dadoFmt=partes[0].substr(0,2)+'.'+partes[0].substr(2,3)+'.'+partes[0].substr(5,3);
            dadoFmt+='/'+partes[1];
            dadoFmt+='-'+partes[2];
        }

        // ok!
        return { retCode: true, formato: fmt, dadoFormatado: dadoFmt };
        return { retCode: false, formato: fmt, dadoFormatado: dadoFmt, erro: msg };

    },

    digitoCnpj: function(partes) {

        // prepara
        var wnr=partes[0]+partes[1];
        var nr=new Array(); var i=0;
        for(i=0; i<wnr.length; i++){ nr[nr.length]=wnr.substr(i,1); }

        // calcula o primeiro digito verificador
        var mlt=new Array();
        mlt[0]=5; mlt[1]=4; mlt[2]=3; mlt[3]=2; mlt[4]=9;  mlt[5]=8;
        mlt[6]=7; mlt[7]=6; mlt[8]=5; mlt[9]=4; mlt[10]=3; mlt[11]=2;
        var soma=0; var i=0; for(i=0; i<12; i++){ soma+=nr[i]*mlt[i]; }
        var resto = (soma % 11);
        if(resto==0 || resto==1) { var dv1=0 } else {var dv1= (11-resto) }

        // calcula o segundo digito verificador
        nr[nr.length]=dv1;
        var mlt=new Array();
        mlt[0]=6; mlt[1]=5; mlt[2]=4; mlt[3]=3; mlt[4]=2;  mlt[5]=9;
        mlt[6]=8; mlt[7]=7; mlt[8]=6; mlt[9]=5; mlt[10]=4; mlt[11]=3; mlt[12]=2;
        var soma=0; var i=0; for(i=0; i<13; i++){ soma+=nr[i]*mlt[i]; }
        var resto = (soma % 11);
        if(resto==0 || resto==1) { var dv2=0 } else {var dv2= (11-resto) }

        // confere
        if((''+dv1+dv2)!=partes[2]) return { retCode: false, erro: 'Dígito verificador não confere' };

        // OK!
        return { retCode: true }

    },

    digitoCpf: function(partes) {

        // prepara
        var nr=new Array(); var i=0;
        for(i=0; i<partes[0].length; i++){ nr[nr.length]=partes[0].substr(i,1); }
        var mlt=new Array();
        mlt[0]=10; mlt[1]=9; mlt[2]=8; mlt[3]=7; mlt[4]=6; mlt[5]=5; mlt[6]=4; mlt[7]=3; mlt[8]=2;

        // faz a soma das multiplicações
        // pega o resto da divisão das multiplicações por 11
        // tira o resto de 11
        // se o resultado for 10 ou 11, o dígito 1 é 0
        // se o dígito 10 for diferente do calculado, o CPF está errado
        var soma=0; var i=0; for(i=0; i<9; i++){ soma+=nr[i]*mlt[i]; }
        var resto = (soma % 11); var dv1 = 11 - resto; if(dv1 >= 10) dv1 = 0;
        if(partes[1].substr(0,1)!=dv1) return { retCode: false, erro: 'Primeiro dígito verificador não confere' };

        // faz as multiplicações para o segundo dígito
        // pega o resto da divisão das multiplicações por 11
        // tira o resto de 11
        // se o resultado for 10 ou 11, o dígito será 0
        // verifica se o número digitado é igual ao calculado
        nr[nr.length]=partes[1].substr(0,1);
        var soma=0; var i=0; for(i=0; i<9; i++){ soma+=nr[i+1]*mlt[i]; }
        var resto = (soma % 11); var dv2 = 11 - resto; if (dv2 >= 10) dv2 = 0;
        if (partes[1].substr(1,1)!=dv2) return { retCode: false, erro: 'Segundo dígito verificador não confere' };

        // OK !
        return { retCode: true }

    }

} ;