// JAVASCRIPT - ROTINAS DE VALIDAÇÃO DE FORMULÁRIO
// AUTOR: Roger de Almeida Haroldo (rogerdealmeida@yahoo.com.br)
// Licença de uso: GPL Versão 2.0
// Valida a obrigatoriedade de conteúdo de um formulário.
// IMPORTANTE: SEJA PROFISSIONAL - DÊ CRÉDITO AO AUTOR E SE FIZER MODIFICAÇÕES E ENVIE-ME AS ALTERAÇÕES.

// Variáveis globais
var er_data     = /^((0[1-9]|[12]\d)\-(0[1-9]|1[0-2])|30\-(0[13-9]|1[0-2])|31\-(0[13578]|1[02]))\-\d{4}$/;
var er_email    = /^[\w-]+(\.[\w-]+)*@(([A-Za-z\d][A-Za-z\d-]{0,61}[A-Za-z\d]\.)+[A-Za-z]{2,6}|\[\d{1,3}(\.\d{1,3}){3}\])$/;
var er_fone     = /^\d{2}\-\d{4}\-\d{4}$/;
var er_cep      = /^\d{5}\-\d{3}$/;
var er_cpf      = /^\d{3}\.\d{3}\.\d{3}\-\d{2}$/;
var er_pis      = /^\d{3}\.\d{5}\.\d{2}\.\d{1}$/;
var er_ano      = /^\d{4}$/;
var er_chs      = /^\d{2}$/;
var er_inteiro  = /^\d+$/;
var er_ctps     = /^\d{7}\/\d{5}\-[A-Za-z]{2}$/;
var er_decimal_semsinal = /^((\d+)(\,\d*)?|\,\d+)$/;
var er_decimal_comsinal = /^[+-]?((\d+)(\,\d*)?|\,\d+)$/;
var vet_mes     = new Array('JANEIRO','FEVEREIRO','MARÇO','ABRIL','MAIO','JUNHO','JULHO','AGOSTO','SETEMBRO','OUTUBRO','NOVEMBRO','DEZEMBRO');
var hoje = new Date();
var g_erros;
var g_adver;


// Envia o formulário pelo método POST (a variável request deve ser declarada antes deste arquivo
function EnviaPost(url,formulario) {
    function FormataForm(f) { // Formata formulário para ser enviado com post
        function Dec2Hex(Dec) { // função que gera um número hexacedimal
            var hexChars = "0123456789ABCDEF";
            var a = Dec % 16;
            var b = (Dec - a)/16;
            hex = "" + hexChars.charAt(b) + hexChars.charAt(a);
            return hex;
        }

        var send = new Array();
        var elementos = f.elements;

        for(var i = 0; i < elementos.length; i++) {
            var e = elementos[i];
            if(!e.name)
                continue;

            var nVal = "";

            for(var x = 0; x < e.value.length; x++) {
                codeA = e.value.charCodeAt(x);
                codeA = Dec2Hex(codeA);
                nVal += "%" + codeA;
            }

            var tipo = e.type.toLowerCase();
            if(tipo != "checkbox" && tipo != "radio") {
                send[send.length] = e.name + "=" + nVal;
            } else {
                if(e.checked) {
                    send[send.length] = e.name + "=" + nVal;
                }
            }

        }
        return send.join("&");
    }

    function RespostaAjax() {
        if (request.readyState == 4) {
            return request;
        }
    }

    var form_formatado = FormataForm(formulario);
    request.open('POST', url, false);
    request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    request.send(form_formatado);
    return RespostaAjax();
}


// Função que varre todos os elementos de um formulário e marca os rótulos para correção do usuário
// Além disso, retorna:
// 0 - ok (elementos com conteúdos compatíveis)
// 1 - erros (elementos obrigatórios com conteúdo incompatível)
// 2 - advertências (elementos não obrigatório mas sem conteúdo)

function VerificaCampos(f) {
    g_erros = 0;
    g_adver = 0;
    
    for (var x=0;x<f.length;x++) {
        if (f.elements[x].type == 'text' || f.elements[x].type == 'textarea') {
            if (!f.elements[x].value) {
                if (f.elements[x].obrigatorio) {
                    LabelErro(1,f.elements[x].name);
                }
                else {
                    LabelErro(2,f.elements[x].name);
                }
            }
            else {
                VerificaConteudo(f.elements[x]);
            }
        }
    }
return g_erros;
}

function VerificaConteudo(elemento) {
var num_erro=0;
    if (elemento.tipo == 'data') {
        num_erro = VerData(elemento);
    }
    else if (elemento.tipo == 'email') {
        num_erro = VerEmail(elemento);
    }
    else if (elemento.tipo == 'fone') {
        num_erro = VerFone(elemento);
    }
    else if (elemento.tipo == 'cep') {
        num_erro = VerCEP(elemento);
    }
    else if (elemento.tipo == 'cpf') {
        num_erro = VerCPF(elemento);
    }
    else if (elemento.tipo == 'chs') {
        num_erro = VerCHS(elemento);
    }
    else if (elemento.tipo == 'ctps') {
        num_erro = VerCTPS(elemento);
    }
    else if (elemento.tipo == 'decimal_semsinal') {
        num_erro = VerDecimalSemSinal(elemento);
    }
    else if (elemento.tipo == 'decimal_comsinal') {
        num_erro = VerDecimalComSinal(elemento);
    }
    else if (elemento.tipo == 'pis') {
        num_erro = VerPIS(elemento);
    }

    LabelErro(num_erro,elemento.name);
}

function VerData(elemento) {
var num_erro=0;
    if (er_data.test(elemento.value)) {
        var dia = Number(elemento.value.substr(0,2));
        var mes = Number(elemento.value.substr(3,2));
        var ano = Number(elemento.value.substr(6,4));
        if (mes == 2 && ( dia < 01 || dia > 29 || ( dia > 28 && (parseInt(ano / 4) != ano / 4)))) {
            num_erro=1;
        }
        else { // Ano permitido: 1900 a 2076
            if (ano < 1900 || ano > 2076) {
                num_erro=1;
            }
            else {
                num_erro=0;
            }
        }
    }
    else {
        num_erro=1;
    }
return num_erro;
}

function VerEmail(elemento) {
var num_erro=0;
    if (!er_email.test(elemento.value)) {
        num_erro=1;
    }
return num_erro;
}

function VerFone(elemento) {
var num_erro=0;
    if (!er_fone.test(elemento.value)) {
        num_erro=1;
    }
return num_erro;
}

function VerCEP(elemento) {
var num_erro=0;
    if (!er_cep.test(elemento.value)) {
        num_erro=1;
    }
return num_erro;
}

function VerCPF(elemento){
var num_erro=0;
    if (er_cpf.test(elemento.value)) {
        var num_cpf = elemento.value.substr(0,3) + elemento.value.substr(4,3) + elemento.value.substr(8,3);
        var dv = elemento.value.substr(12,2);

        var d1 = 0;
        if (num_cpf == "000000000" || num_cpf == "111111111" || num_cpf == "222222222" || num_cpf == "333333333" || num_cpf == "4444444444" || num_cpf == "555555555" || num_cpf == "666666666" || num_cpf == "777777777" || num_cpf == "888888888" || num_cpf == "999999999") {
            num_erro=1;
        }
        else {
            for (var i = 0; i < 9; i++) {
                d1 += num_cpf.charAt(i)*(10-i);
            }
            if (d1 == 0) {
                num_erro=0;
                }
            else {
                d1 = 11 - (d1 % 11);
                if (d1 > 9) {
                    d1 = 0;
                }
                if (dv.charAt(0) != d1) {
                    num_erro=0;
                }
                else {
                    d1 *= 2;
                    for (var i = 0; i < 9; i++) {
                        d1 += num_cpf.charAt(i)*(11-i);
                    }
                }
                d1 = 11 - (d1 % 11);
                if (d1 > 9) {
                    d1 = 0;
                }
                if (dv.charAt(1) != d1) {
                    num_erro=1;
                }
                else {
                    num_erro=0;
                }
            }
        }
    }
    else {
        num_erro=1;
    }
return num_erro;
}

function VerCHS(elemento) {
var num_erro=0;
    if (!er_chs.test(elemento.value) || Number(elemento.value) > 50) {
        num_erro=1;
    }
return num_erro;
}

function VerCTPS(elemento) {
var num_erro=0;
    if (!er_ctps.test(elemento.value)) {
        num_erro=1;
    }
return num_erro;
}

function VerDecimalSemSinal(elemento) {
var num_erro=0;
    if (!er_decimal_semsinal.test(elemento.value)) {
        num_erro=1;
    }
return num_erro;
}

function VerDecimalComSinal(elemento) {
var num_erro=0;
    if (!er_decimal_comsinal.test(elemento.value)) {
        num_erro=1;
    }
return num_erro;
}


//Função criada pelo pessoal do Grupo de Desenvolvimento de Framework da CELEPAR
// http://www.frameworkpinhao.pr.gov.br
// Modificado por Roger de Almeida Haroldo
// rogedealmeida@gmail.com

function VerPIS(elemento) {
var num_erro=0;
    //alert(elemento.value);
    if (er_pis.test(elemento.value)) {
        // Modificação de adequação ao modelo que eu sigo
        var localPis= elemento.value.substr(0,3) + elemento.value.substr(4,5) + elemento.value.substr(10,2) +elemento.value.substr(13,1);
        // CELEPAR
        //alert(localPis);
    var soma = 0;
    var digit_pis = 0;
    var ret = 0;
    var aux = 0;


    if( localPis.length>0 && localPis.length!=11 ) {
            num_erro=1;
    }

    ret = localPis;
    localPis = (localPis.substring(0,10));
    var cont = 0;

    for(cont=0; cont<2; cont++) {
        aux = parseInt(localPis.substring(cont,(cont+1)),10);
        soma = soma + aux*(4-(cont+1));
    }

    for(cont=0; cont<8; cont++) {
        aux = parseInt(localPis.substring((cont+2),(cont+3)),10);
        soma = soma + aux*(10-(cont+1));
    }

    digit_pis = (11-(soma%11));
    localPis = (parseInt(ret.substring(10,11),10));


    if( digit_pis == 11 ) {
        digit_pis = 0;
    }

    if( digit_pis == localPis ) {
        num_erro=0;
    }
    else {
        num_erro=1;
    }
    }
    else {
        num_erro=1;
    }
return num_erro
}



function ComparaDatas(di,df) {
    var vetor_di=di.split('-');
    var vetor_df=df.split('-');
    di=vetor_di[2]+vetor_di[1]+vetor_di[0];
    df=vetor_df[2]+vetor_df[1]+vetor_df[0];
    //alert(parseInt(df)+'  '+parseInt(di));
    if (parseInt(df) > parseInt(di)) {
        return 0;
    }
    else {
        return 1;
    }

}



// modifica a cor do rótulo de acordo com o erro encontrado na função Verifica campos e Verifica Conteúdo
function LabelErro(tipo,campo) {
    if (document.getElementById(campo)) {
        var rotulo = document.getElementById(campo);
        if (tipo == 0) {
            rotulo.style.color='#0D3D6A'; //  em conformidade
            }
        else if (tipo == 1) {
            rotulo.style.color='red'; // obrigatório
            g_erros=1;
        }
        else if (tipo == 2) {
            rotulo.style.color='green'; // opcional
            g_adver=1;
        }
    }

}

// A função Avisa Erro retorna true se existe erro ou o usuário não confirmar as adivertências
function AvisaErro() {
    if (g_erros == 1) {
        replaceText(mensagem,"Erro! Cadastro não está em conformidade. Verifique os campos rotulados em vermelho");
        img_status.src="../img/cancel32.png";
        alert("Erro! Cadastro não está em conformidade. Verifique os campos rotulados em vermelho");
        return true;
    }
    else if (g_adver == 1) {
        replaceText(mensagem,"Advertência! Os campos opcionais (rotulados em verde) não foram preenchidos. Isso não impede que seja registrado");
        img_status.src="../img/critical.png";
        if (confirm("Advertência! Campos opcionais não foram preenchidos. Deseja registar assim mesmo?")) {
            return false;
        }
        else {
            return true;
        }
    }
}
