/*  sjs - SSWin - AJAX Framework
    www.cebinet.com.br
    silviosa@sswin.com.br
    Agosto/2008
    ====================== */

// Objeto sjsAutoform
function sjsValidacao(props){

// construtor
    _defaults(this); if(props){ _construtor(this, props); };
    function _construtor(o, ps){ for(var p in ps){ if(o[p]!=undefined){ if(typeof(o[p])=='object'){ _construtor(o[p],ps[p]); } else o[p]=ps[p]; } } };
    function _defaults(o){

// propriedades
        o.id='sfsValidacao';
        o.titulo="Ocorrências da validação"
        o.classe='erro';
        o.ancora='Modulo';
        o.ok=true;
    };

// coleção de mensagens de erro
    this.mensagens=[];
    this.mensagensAdd= function(cpo, msg){ this.ok=false; this.mensagens[this.mensagens.length]={ "cpo": cpo, "msg": msg }; }


// métodos
    this.mostrar=function(){
        this.apagar();
        if(this.ok) { return null; }

        tags='<div id="'+this.id+'" class="sisDlg" style="overflow:auto; margin-bottom:30px;"></div>';
        $('#'+this.ancora).append(tags);

        tags='<table class="'+this.classe+'"><tr><td class="'+this.classe+'">';
        tags+='<ul class="'+this.classe+'">';
        for(i=0; i<this.mensagens.length; i++){ tags+='<li>'+this.mensagens[i].msg+'</li>'; }
        tags+='</ul></td></tr></table>';
        $('#'+this.id).append(tags);

        $('#'+this.id).dialog(
            { title: this.titulo, modal: false, position: [30,80],
            buttons: { "Fechar":  function() { $(this).dialog("close"); } }
            }
        );

        if(this.mensagens.length>0) $('#'+this.mensagens[0].cpo).focus();

        this.mensagens=[];

    };

    this.apagar=function(){
        $('#'+this.id).dialog('destroy');
        $('#'+this.id).remove();
    };

// métodos de validação

    this.cep=function(campo, mensagem){

        var dado=$('#'+campo).val(); var w='';
        if(!dado) return true;
        var i=0;
        for(i=0; i<dado.length; i++){
            if(dado.substr(i,1)>=0 && dado.substr(i,1)<=9) {w+=dado.substr(i,1)}
        }

        if(w.length!=8){
            $('#'+campo).addClass('fErroCpo'); this.mensagensAdd(campo, mensagem);
            return false;
        } else {
            $('#'+campo).removeClass('fErroCpo');
            var fmt=w.substr(0,5)+'-'+w.substr(5,3);
            $('#'+campo).val(fmt);
            return true;
        }
    },

    // compara o conteúdo de 2 campos, exigindo valores iguais
    this.confirmacao=function(c1, c2, msg) {
        if($('#'+c1).val()==$('#'+c2).val()){ $('#'+c1+', #'+c2).removeClass('fErroCpo'); }
        else { $('#'+c1+', #'+c2).addClass('fErroCpo'); this.mensagensAdd(c2, msg); }
    }

    // valida e formata os códigos de CPF ou de CNPJ
    this.cpfCnpj=function(campo, mensagem) {
        // ATENÇÃO:
        // Este método utiliza um outro componente (obj.validcpfcnpj.js) para realizar a validação
        if(typeof(sjsValidCpfCnpj)!='object'){
            $('#'+campo).addClass('fErroCpo'); this.mensagensAdd(campo, mensagem+'Método de validação de CPF e CNPJ não implementado. Instale o script "sjs.validcpfcnpj.x.x.js"');
            return false;
        }
        var dado=$('#'+campo).val(); if(!dado) return true;
        var ret=sjsValidCpfCnpj.validar(dado)
        if(ret.retCode==true){ $('#'+campo).val(ret.dadoFormatado); $('#'+campo).removeClass('fErroCpo'); }
        else { $('#'+campo).addClass('fErroCpo'); this.mensagensAdd(campo, mensagem+ret.erro); }
    },

    // compara o conteúdo de 2 campos de data, a primeira menor ou igual à segunda
    // a data precisa estar formatada dd/mm/yyyy
    this.dataMenorIgual=function(c1, c2, msg) {
        var d1=$('#'+c1).val().split('/'); var d2=$('#'+c2).val().split('/');
        var dc1=''+d1[2]+''+d1[1]+''+d1[0]; var dc2=''+d2[2]+''+d2[1]+''+d2[0];
        if(dc1<=dc2){ $('#'+c1+', #'+c2).removeClass('fErroCpo'); }
        else { $('#'+c1+', #'+c2).addClass('fErroCpo'); this.mensagensAdd(c1, msg); }
    }

    this.dmy=function(campo, mensagem, aceitaDatasForaLimiteMySQL){

        // obtém o dado
        var dado=$('#'+campo).val(); if(!dado) return true;
        var msgDefault='Digite a data somente com números, com 8 algarismos (ddmmaaaa), ou separada por barras (/), no formato dd/mm/aaaa';

        // verifica se tem somente dígitos numéricos e a barra
        var ValidChars = "0123456789/";
        var ok=this._digitosValidos(campo, ValidChars);
        if(!ok){
            $('#'+campo).addClass('fErroCpo'); this.mensagensAdd(campo, mensagem+msgDefault);
            return false;
        }

        // separa os elementos
        var w = dado.split('/');
        var dt=new Array();
        time=new Date();

        // a data foi informada com mais de 3 elementos
        if(w.length>3){
            $('#'+campo).addClass('fErroCpo'); this.mensagensAdd(campo, mensagem+msgDefault+'. Você digitou '+w.length+' elementos');
            return false;
        }

        // a data foi informada com 1 elemento
        if(w.length==1){
            if(w[0].length<3){
                dt[0]=w[0]; dt[1]=time.getMonth()+1; dt[2]=time.getYear();
            } else if( (w[0].length>2 && w[0].length<6) || (w[0].length>8) ){
                $('#'+campo).addClass('fErroCpo'); this.mensagensAdd(campo, mensagem+msgDefault+'. Você digitou '+w[0].length+' dígitos');
                return false;
            } else {
                dt[0]=w[0].substr(0,2); dt[1]=w[0].substr(2,2); dt[2]=w[0].substr(4);
            }
        }

        // a data foi informada com 2 elemento
        if(w.length==2){ dt[0]=w[0]; dt[1]=w[1]; dt[2]=time.getYear(); }

        // a data foi informada com 3 elemento
        if(w.length==3){ dt[0]=w[0]; dt[1]=w[1]; dt[2]=w[2]; }

        // transforma tudo em numérico
        var dia=dt[0]-0;
        var mes=dt[1]-0;
        var ano=dt[2]-0;

        // trata o ano
        if(ano<2000) { if(ano<1900) ano+=1900;}
        if(ano>9999){
            $('#'+campo).addClass('fErroCpo'); this.mensagensAdd(campo, mensagem+'Você digitou um ano inválido' );
            return false;
        }

        // trata o mês
        if(mes==0 || mes>12){
            $('#'+campo).addClass('fErroCpo'); this.mensagensAdd(campo, mensagem+'Você digitou um mês inválido' );
            return false;
        }

        // trata o dia
        if(dia==0 || dia>31){
            $('#'+campo).addClass('fErroCpo'); this.mensagensAdd(campo, mensagem+'Você digitou um dia inválido' );
            return false;
        }
        if( (mes==4 || mes==6 || mes==9 || mes==11) && dia>30 ){
            $('#'+campo).addClass('fErroCpo'); this.mensagensAdd(campo, mensagem+'Você digitou um dia inválido para o mês' );
            return false;
        }
        if(mes==2){
            if( (ano % 4)==0 ){
                if(dia>29){
                    $('#'+campo).addClass('fErroCpo'); this.mensagensAdd(campo, mensagem+'Você digitou um dia inválido para o mês' );
                    return false;
                }
            } else {
                if(dia>28){
                    $('#'+campo).addClass('fErroCpo'); this.mensagensAdd(campo, mensagem+'Você digitou um dia inválido para o mês' );
                    return false;
                }
            }
        }

        // devolve tudo para alfa
        dia=""+dia; if(dia.length==1) dia='0'+dia;
        mes=""+mes; if(mes.length==1) mes='0'+mes;
        ano=""+ano;

        // consiste limites de data para o MySQL
        if(aceitaDatasForaLimiteMySQL){
            // nada faz
        } else {
            if( (ano+mes+dia) < '19700101'){
                $('#'+campo).addClass('fErroCpo'); this.mensagensAdd(campo, mensagem+'Você digitou uma data menor que a menor data permitida (MySQL)' );
                return false;
            }
            if( (ano+mes+dia) >= '20380101'){
                $('#'+campo).addClass('fErroCpo'); this.mensagensAdd(campo, mensagem+'Você digitou uma data maior que a maior data permitida (MySQL)' );
                return false;
            }
        }

        // formata a data
        var fmt=dia+'/'+mes+'/'+ano;
        $('#'+campo).val(fmt);
        $('#'+campo).removeClass('fErroCpo');
        return true;

    }

    // estado, com 2 dígitos (transforma em maiúsculas)
    this.estado=function(campo, mensagem){
        if(!$('#'+campo).val()) return true;
        $('#'+campo).val( $('#'+campo).val().toUpperCase() )
        if($('#'+campo).val().length==2){ $('#'+campo).removeClass('fErroCpo'); }
        else { $('#'+campo).addClass('fErroCpo'); this.mensagensAdd(campo, mensagem); }
    }

    // obrigatório
    this.obrigatorio=function(campo, mensagem){
        if($('#'+campo).val()){ $('#'+campo).removeClass('fErroCpo'); }
        else { $('#'+campo).addClass('fErroCpo'); this.mensagensAdd(campo, mensagem); }
    }

    // número inteiro
    this.numeroInteiro=function(campo, mensagem) {
    // admite somente algarismos e o ponto
        var ValidChars = "0123456789.";
        var ok=this._digitosValidos(campo, ValidChars);
        if(ok){ $('#'+campo).removeClass('fErroCpo'); }
        else { $('#'+campo).addClass('fErroCpo'); this.mensagensAdd(campo, mensagem); }
    },

    this.numeroDecimal=function(campo, mensagem) {
    // admite somente algarismos, o ponto e a vírgula
        var ValidChars = "0123456789.,";
        var ok=this._digitosValidos(campo, ValidChars);
        if(ok){ $('#'+campo).removeClass('fErroCpo'); }
        else { $('#'+campo).addClass('fErroCpo'); this.mensagensAdd(campo, mensagem); }
    },

    this.numeroDecimalNegativo=function(campo, mensagem) {
    // admite somente algarismos, o ponto e a vírgula
        var ValidChars = "0123456789.,-";
        var ok=this._digitosValidos(campo, ValidChars);
        if(ok){ $('#'+campo).removeClass('fErroCpo'); }
        else { $('#'+campo).addClass('fErroCpo'); this.mensagensAdd(campo, mensagem); }
    },

    this._digitosValidos=function(campo, ValidChars) {
    // restringe o conteúdo do campo aos dígitos válidos

            // ATENÇÃO: esta função é de uso interno do objeto "oValid" e
            // não pode ser chamada externamente porque não atende ao
            // padrão de chamada de métdos de validação

        var IsNumber=true;
        var Char;
        var sText=$('#'+campo).val();

        for (ix = 0; ix < sText.length; ix++) {
            Char = sText.charAt(ix);
            if (ValidChars.indexOf(Char) == -1) { IsNumber = false; break }
        }
        if(IsNumber){ return true; } else { return false; }
    }

};
