// valida numero inteiros ou não
function valida_numero(numero,inteiro) {
        numero = new String(numero);

        if(numero.length==0)
                return false;

        var exp = /^\$|\./g ;

        // retira $ e .
        numero = numero.replace(exp, "");

        exp = /,/g ;

        // troca , por .
        numero = numero.replace(exp,".");

        numero = parseFloat(numero);

        if(isNaN(numero))
                return false;

        if(inteiro && numero!=Math.round(numero))
                return false;

        return true;

}

// verifica se um ano é bissexto
function ano_bi(ano) {
        if (ano % 100 == 0) {
                if (ano % 400 == 0)
                        return true;
        }
        else
                if ((ano % 4) == 0)
                        return true;
        return false;
}


// Valida uma data
function valida_data(data) {
        var datePat = /^(\d{1,2})(\/|-|.)(\d{1,2})\2(\d{4})$/;

        var datadiv = data.match(datePat);

           if (datadiv==null)
                return false;

        var dia = datadiv[1];
        var mes = datadiv[3];
        var ano = datadiv[4];

        if(dia<1 || dia>31 || mes<1 || mes>12 || ano < 2001)
                return false;

        if ((mes==4 || mes==6 || mes==9 || mes==11) && dia>30)
                return false;

        if(mes==2)
                if(dia>29)
                        return false;
                else
                        if(dia==29 && !ano_bi(ano))
                                return false;

        return true;

}

// valida CEP
function valida_cep(cep) {
        if(cep.length>9 || (cep.indexOf("-")==-1 && cep.length>8))
                return false;

        var pat = /((\d{5})(-)(\d{3}))|(\d{8})/;

        var cepdiv = cep.match(pat);

        if(cepdiv==null)
                return false;
        return true;
}


// Calculo do CNPJ
function valida_cnpj(cnpj) {
        var erro = true;
        var aux_cnpj = "";
        var cnpj1=0,cnpj2=0;
        for(j=0;j<cnpj.length;j++)
                if(cnpj.substr(j,1)>="0" && cnpj.substr(j,1)<="9")
                        aux_cnpj += cnpj.substr(j,1);
        if(aux_cnpj.length!=14)
                erro = false;
        else {
                cnpj1 = aux_cnpj.substr(0,12);
                cnpj2 = aux_cnpj.substr(aux_cnpj.length-2,2);
                fator = "543298765432";
                controle = "";
                for(j=0;j<2;j++) {
                        soma = 0;
                        for(i=0;i<12;i++)
                                soma += cnpj1.substr(i,1) * fator.substr(i,1);
                        if(j==1) soma += digito * 2;
                        digito = (soma * 10) % 11;
                        if(digito==10) digito = 0;
                        controle += digito;
                        fator = "654329876543";
                }
                if(controle!=cnpj2)
                        erro = false;
        }
        return erro;
}

// Validação do CPF
function valida_cpf(cpf) {
        var cpf = new String(cpf);
    var aux_cpf = "";

        if(cpf.length!=11)
                return false;

    for(j=0;j<cpf.length;j++)
                  if(cpf.substr(j,1)>="0" && cpf.substr(j,1)<="9")
                           aux_cpf += cpf.substr(j,1);
        if(aux_cpf.length!=11)
                return false;
    else {
            var cpf1 = String(aux_cpf);
            var cpf2 = cpf.substr(cpf.length-2,2);
              var controle = "";
              var start = 2;
              var end = 10;
              for(var i=1;i<=2;i++) {
                      var soma = 0;
                      for(j=start;j<=end;j++)
                              soma += cpf1.substr((j-i-1),1)*(end+1+i-j);
                if(i==2)
                          soma += digito * 2;
                digito = (soma * 10) % 11;
                if(digito==10)
                          digito = 0;
                controle += digito;
                start = 3;
                end = 11;
              }
              if(controle!=cpf2)
                return false;
    }

        return true;
}


// Validar emails
function valida_email(email) {
        var chars = "@#$&[]()/\\\{}!^:'\"";
        var pat=/^(.+)@(.+)$/;

        var emaildiv = email.match(pat);

        if(emaildiv==null)
                return false;

        var login = emaildiv[1];
        var dominio = emaildiv[2];

        for(var i=0;i<chars.length;i++) {
                if(login.indexOf(chars.substr(i,1))!=-1)
                        return false;
        }

        for(var i=0;i<chars.length;i++) {
                if(dominio.indexOf(chars.substr(i,1))!=-1)
                        return false;
        }

        return true;
}

// Valida uma string em particular (tipo login ou senha)
function valida_string(string) {
        str = new String(string);
        if(str.length<5)
                return false;
        if(str.indexOf(" ")!=-1)
                return false;

        var chars = "@#$&[]()/\\\{}!^:'\"";

        for(var i=0;i<chars.length;i++) {
                if(str.indexOf(chars.substr(i,1))!=-1) {
                        return false;
                }
        }

        return true;

}

// Valida o numero do Cartão de crédito
function valida_cartao(numero) {
        var str = new String(numero);

        if(str.length==0)
                return false;

        var peso = (str.length%2==0) ? 2 : 1;
        var soma = 0;

        for(var i=0;i<str.length;i++) {
                num = str.substr(i,1);
                vlr = num*peso;
                soma+= (vlr>9) ? vlr-9 : vlr;
                peso = (peso==2) ? 1 : 2;
        }

        return (soma%10==0 && soma!=0);
}

// Valida a Data de validade do cartão (mm/aa)
function valida_dtvalidade(data) {
        var datePat = /^(\d{1,2})(\/|-|.)(\d{1,2})$/;
        var dtdiv = data.match(datePat);

        if(dtdiv==null)
                return false;

        var dia = 31;
        var mes = parseInt(dtdiv[1]);
        var ano = parseInt(dtdiv[3]);

        if(mes<1 || mes>12 || ano<01)
                return false;

        var data = new Date();
        var mes_at = data.getMonth();
        var ano_at = data.getYear();
        mes_at++;
        ano+=2000;

        var anomes = ano*100+mes;
        var anomes_at = ano_at*100+mes_at;

        if(anomes<anomes_at)
                return false;

        return true;
}

function retira_car(numero) {

        var exp = /^\$|\./g ;

        numero = numero.replace(exp, "");

        return numero;

}

function valida_form(form,campos,nomescampos,tipos,status)
{
        /*
        form = posição do formulário (0,1,...)
        campos = campos a verificar (0,1,2,...)
        tipos = tipo de cada campo:
                                 1-inteiro
                                2-decimal
                                3-data
                                4-email
                                5-cpf
                                6-cnpj
                                7-cep
                                8-string
                                9-login/senha
                                10-confirmação de senha
                                11-Cartão de Crédito
                                12-Validade do Cartão (mes/ano)
        status = 0 - não obrigatório, 1 - obrigatório
        */

        var mensagem = "Os campos abaixo precisam ser preenchidos ou estão incorretos\n\n";
        var erro = false;

        form++;

        for(var i=0;i<campos.length;i++) {
                resultado=true;
                valor = document.forms[form].elements[campos[i]].value;
                switch(tipos[i]) {
                case 1:
                        resultado = valida_numero(valor,true);
                        if(valor==0 && status[i]==1)
                                resultado=false;
                        document.forms[form].elements[campos[i]].value = retira_car(valor);
                        break;
                case 2:
                        resultado = valida_numero(valor,false);
                        document.forms[form].elements[campos[i]].value = retira_car(valor);
                        break;
                case 3:
                        resultado = valida_data(valor);
                        break;
                case 4:
                        resultado = valida_email(valor);
                        break;
                case 5:
                        resultado = valida_cpf(valor);
                        break;
                case 6:
                        resultado = valida_cnpj(valor);
                        break;
                case 7:
                        resultado = valida_cep(valor);
                        break;
                case 8:
                        resultado = (valor.length==0) ? false : true;
                        break;
                case 9:
                        resultado = valida_string(valor);
                        break;
                case 10:
                        resultado = valida_string(valor);
                        if(resultado)
                                resultado = (valor==document.forms[form].elements[campos[i-1]].value);
                        break;
                case 11:
                        resultado = valida_cartao(valor);
                        break;
                case 12:
                        resultado = valida_dtvalidade(valor);
                        break;
                }

                if(!resultado && (status[i]==1 || (status[i]==0 && valor.length!=0))) {
                        mensagem+= " -» " + nomescampos[i] + "\n";
                        erro = true;
                }

        }

        if(erro)
                alert(mensagem)

        return !erro;

}