/*
 * Nome:         IsCNPJ
 * Autor:        7COMm/Fábrica de Softwares - Thiago Rosa
 * Data:         24/05/2002
 * Descricao:    Verifica se é um número de CNPJ válido. 
 *               Verificamos se o CNPJ digitado está correto, de acordo com seus
 *                       dígitos verificadores
 * Entrada:      intNumeroCNPJ - CNPJ a ser testado sem a formatacao de / e -
 * Saída:        true (válido) ou false (inválido)
 * Funções Uti.: TrocaListaCaracterPorString() e CalculaDigitoMod11()

 * Autor:        7COMm/Fábrica de softwares - Renato C. Castelo
 * Data:         13/11/2002
 * Descrição:    Adequação ao novo padrão e testes.
 */
function IsCNPJ(intNumeroCNPJ) {
    var intDigitoCNPJ;
    
    //retira os caracteres '.','/' e '-' da string
    intNumeroCNPJ = TrocaListaCaracterPorString(intNumeroCNPJ, "\./\-", "", "i")
    //separa o dígito verificador
    intDigitoCNPJ = intNumeroCNPJ.substr(intNumeroCNPJ.length-2);				
    //separa o número sem dígito verificador
    intNumeroCNPJ = intNumeroCNPJ.substring(0, intNumeroCNPJ.length-2);
    
    //calcula o dígito verificador e verifica se é igual ao recebido
    return (CalculaDigitoMod11(intNumeroCNPJ, 2) == intDigitoCNPJ)
}

/*
 * Nome:        TrocaListaCaracterPorString
 * Autor:       7COMm/Fábrica de softwares - Juliana Ferris
 * Data:        08/01/2002
 * Descrição:   Dentro da string 'strDado' troca todas as ocorrências de cada 
 *                      caracter informado na 'strListaCaracter' pela string 
 *                      'strPor'
 * Entrada:     strDado - string que será verificada
 *              strListaCaracter - lista de caracteres que serão substituídos
 *              strPor - string que será colocada no local de cada caracter de
 *                      'strListaCaracter'
 *              strCaseSensitive - apenas informar 'i' (minúsculo) ou 'vazio'
 *                      quando i não é case sensitive
 *                      quando vazio é case sensitive
 * Saída:       String strDado após substituir cada caracter de strListaCaracter
 *                      por strPor
 * Exemplo:     TrocaListaCaracterPorString( "testeTESTE", "te", "", "i" )
 *                      ==> sS
 *              TrocaListaCaracterPorString( "testeTESTE", "te", "", "" )
 *                      ==> sTESTE
 * Observação:  1.) No strListaCaracter para trabalhar com a lista de caracteres
 *                      abaixo é necessário colocar a barra invertida (\) na
 *                      frente de cada caracter.
 *                      \  |  [  ]  (  )  .  ?  $  +  * -
 *              Ex.: TrocaListaCaracterPorString( "1.234,56", "\.,", "", "" )
 *                      ==> 123456
 *              Ex.: TrocaListaCaracterPorString( "1.23+45", "\.\+", "", "" )
 *                      ==> 12345
 *              2.) No strListaCaracter podemos utilizar a lista de caracteres
 *                      especiais abaixo.
 *                      \f   Form Feed
 *                      \n   Line Feed
 *                      \r   Carriage Return
 *                      \t   Tabulação Horizontal
 *                      \v   Tabulação Vertical
 *                      \r\n é o 'enter' em alguns editores de texto
 *              3.) Quando queremos trocar todos os caracteres da string
 *                      (strDado) EXCETO aqueles informados na lista 
 *                      (strListaCaracter) basta iniciar a lista com o caracter
 *                      ^ sem a barra invertida na frente.
 *              Ex.: TrocaListaCaracterPorString( "1.2/3-4", "^01234", "",
 *                      "" ) ==> 1234
 *              Ex.: TrocaListaCaracterPorString( "1^2-3", "^\^\-", "", "" )
 *                      ==> ^-
 
 * Autor:       7COMm/Fábrica de softwares - Renato C. Castelo
 * Data:        12/11/2002
 * Descrição:   Adequação ao novo padrão e testes.
 */
function TrocaListaCaracterPorString (strDado, strListaCaracter, strPor, strCaseSensitive) {
    var strExpressao;
    /* 
     * Expressão regular onde:
     * new RegExp - declaração da expressão
     * [...] - procura por cada caracter da lista 'strListaCaracter'
     * g - procura em toda a string (global)
     * strIgnoreCase - se 'i' procura sem diferenciar maiúsculas e minúsculas
     */
    strExpressao = new RegExp("[" + strListaCaracter + "]", "g" + strCaseSensitive) ;
    return strDado.replace(strExpressao, strPor);
}

/*
 * Nome:        CalculaDigitoMod11
 * Autor:       7COMm/Fábrica de Softwares - Autor: Desconhecido 
 * Data:        Data: ??/??/????    
 * Descrição:   Calcula os Dígitos de Controle Módulo 11 para o número 
 *              informado
 * Entrada:     intNumero - número para o qual será gerado o digito
 *              intTipo - Indicador do tipo de documento no intNumero
 *                1 -> CPF    [999.999.999-99]
 *                2 -> CNPJ   [99.999.999/9999-99]
 *                3 -> Conta Corrente e Agencia da CAIXA
 *                4 -> Habilitação / Bloqueto
 * Saída:       Dígitos de Controle Módulo 11 
 * Observação:  O intNumero deve conter apenas caracter de 0 à 9
 
 * Autor:       7COMm/Fábrica de Softwares - Autor: Juliana Ferris
 * Data:        10/01/2002
 * Descrição:   Revisão de Padrões e Testes
 
 * Autor:       7COMm/Fábrica de Softwares - Autor: Fernando Vieira
 * Data:        15/01/2002
 * Descrição:   Revisão de Padrões e Testes
 */
function CalculaDigitoMod11 (intNumero, intTipo) {
    var intLimiteMult;         // Limite de Multiplos
    var intTamDigito;          // Tamanho do digito verificador
    var intCont1, intCont2;    // Contadores Auxiliares
    var intSoma, intMult;      // Variável auxiliar para os calculos
    var strTipo;               // Para transformar o intTipo para string 
                               // evitando assim problemas na utilizaçào do 
                               // swicth

    strTipo = intTipo.toString();

    // Verifica qual é o tipo de documento
    switch (strTipo) {
        case "1" :    // CPF   999.999.999-99
            intLimiteMult = 12;
            intTamDigito = 2;
            break;
        case "2" :    // CNPJ  99.999.999/9999-99
            intLimiteMult = 9;
            intTamDigito = 2;
            break;
        case "3" :    // Conta Corrente e Agencia da CAIXA
            intLimiteMult = 9;
            intTamDigito = 1;
            break;
        case "4" :    // Habilitação / Bloqueto
            intLimiteMult = 9;
            intTamDigito = 1;
            break;
    }

    // Gera o digito verificador
    for(intCount2 = 1; intCount2 <= intTamDigito; intCount2++) {
        intSoma = 0;
        intMult = 2;

        for(intCount1 = intNumero.length - 1; intCount1 >= 0; intCount1--) {
            intSoma+= (intMult * parseInt(intNumero.charAt(intCount1)));
            if ( ++intMult > intLimiteMult ) {
                intMult = 2;
            }
        }

        intNumero += ((intSoma * 10) % 11) % 10;
    }

    // Retorna apenas os digitos
    return intNumero.substr( intNumero.length - intTamDigito, intTamDigito );
}
