/*
 Usar aqui os seguintes padrôes:

- Nome das Funções: 	 [Ação] + [Diferenciador]

	[Ação]
		- Usar um verbo no infinitivo com a inicial minúscula;
		- Nome de ações recomendados: Formatar, Inserir, Remover, Abrir, Fechar, Ativar, Desativar, Calcular, Validar, Imprimir, Ocultar,  Mostrar, Mascarar, Montar;
		- Seguir o padrão das funções aqui já existentes;
	[Diferenciador]
		-Nome do objeto ou caracteristica que sofrerá a ação, com a inicial Maiúcula.

- Nome de Objetos:
	Usar inicial maiúscula e nas palavras alternadas a inicial maiúscula
	ex: CampoValor

- Nome de variáveis:
	Usar nomes com inicial minúscula e nas palavras alternadas a inicial maiúsculo
	ex: qtdeCaracteres, nrParcelas

 */

/** calcularDVCNPJ
  - Descrição: Calcula o digito verificador para o CNPJ
  - Evento: Usado em funções
  - Dependência: Não
  - Exibe alerta :Não
  -Exemplo: calcularDVCNPJ(valor)

  @param string  base
  base é o valor do campo CNPJ (deve ser informado sem a máscara e com tamanho completo)
  @return string
  retorna o digito verificador
  **/
function calcularDVCNPJ(base) {

    var result = "";
    var i, j, k, soma, dv;
    var cicloPeso = 8;
    var maxDigitos = 14;
    var calculado = String('00000000000000'+base)
    var tam = calculado.length;

    calculado = calculado.substr(tam-maxDigitos,tam);

    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;
}



/** ValidarCNPJ
  - Descrição: Valida o CNPJ e exibe o alerta
  - Evento: onBlur
  - Dependência: MascararCampoBlur e ValidarMascara
  - Exibe alerta :Sim
  -Exemplo: onBlur="ValidarCNPJ(this);" Pode-se usar dentro de outra função que depende da validação

 @param Object CampoV
 Campo que deverá ser validado
  @return bool
  **/
function validarCNPJ(CampoV, bMensagem) {
    if (CampoV.value != "") {
        var valor;
        var ordem;
        var tam;
        var base;
        var digitos = "";
        var i;
        var algUnico;
        //---------------------------------------------------------------------------------------------------------------------------------------------------------
        //Ajustes - Desmascarar e completar os zeros a esquerda
        valor = removerMascara(CampoV.value);
        tam = String('00000000000000'+valor).length;
        valor = String('00000000000000'+valor).substr(tam-14,tam);

        //Fim dos Ajustes
        //---------------------------------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------------------------------------------------------------
        //Primeira Validação - Expressão Regular
        CampoV.value = valor;
        mascararCampoBlur(CampoV,'##.###.###/####-##'); //ReMascara o campo do formulário garantia quando o valor for colado sem a máscara

        if (!validarMascara(CampoV,'##.###.###/####-##')){
	    if(bMensagem){
		CampoV.value="";
		alert("CNPJ inválido.");
		CampoV.focus();
	    }
            return false;
        }
        //Fim da Primeira Validação
        //---------------------------------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------------------------------------------------------------
        //Segunda Validação - Validação da Base + ordem + Digito verificador
        base	= valor.substring(0, 8); //Monta a base
        ordem 	= valor.substring(8, 12); //Monta a ordem
        digitos = calcularDVCNPJ(base + ordem); //Calcula o DV

        if (valor != base + ordem + digitos) {
	   if(bMensagem){
		CampoV.value="";
		alert("CNPJ inválido.");
		CampoV.focus();
	    }
            return false;
        }

        //Fim da Segunda Validação
        //---------------------------------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------------------------------------------------------------
        //Terceira validação - Algoritmo Único

        algUnico = valor.charAt(0) != '0';
        for (i = 1; i < 8; i++) {
            algUnico = algUnico && (valor.charAt(i-1) == valor.charAt(i));
        }

        if (algUnico) {
	    if(bMensagem){
		CampoV.value="";
		alert("CNPJ inválido.");
		CampoV.focus();
	    }
            return false;
        }

        //Fim da Terceira Validação
        //---------------------------------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------------------------------------------------------------
        //Quarta validação
        /* 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 (ordem == "0000") {
            if(bMensagem){
		CampoV.value="";
		alert("CNPJ inválido.");
		CampoV.focus();
	    }
            return false;
        }

        if ((base == "00000000" || parseInt(ordem, 10) <= 300 || base.substring(0, 3) != "000") == false){
            if(bMensagem){
		CampoV.value="";
		alert("CNPJ inválido.");
		CampoV.focus();
	    }
            return false;
        }

        //Fim da Quarta Validação
        //---------------------------------------------------------------------------------------------------------------------------------------------------------
        return true;
    }
    return true;
}