/**
 * VALIDACAO DE FORMULARIOS
 * PLUGIN JQUERY
 * SINCE 04/02/2010 16:41
 * AUTOR: CLAUDNEY <claudsan@gmail.com>
 */

//VALIDACAO DOS FORMULARIOS VIA JQUERY
(function($) {
    $.fn.validaFormulario = function(args) {
        var opcoes = $.extend({}, $.fn.validaFormulario.defaults, args);

        //COLOCA AS OPCOES DEFAULT
        if(opcoes.config == undefined){
            opcoes.config = {
                formatoData:"d/m/Y",
                erroLiClass:"erro",
                erroDivClass:"msg_erro",
                erroSpanClass:"ajuda",
                msgObrigatorio:"Este campo é de preenchimento obrigatório."
            }
        }

        this.each(function() {
            $(this).submit(function(){
                valido = true;
                limpaMensagensErro(opcoes.config);
                for(i in opcoes.campos){
                    eval("var dados = opcoes.campos."+i+";");
                    dados.id = i;
                    if(dados.tipo != undefined) {
                        switch (dados.tipo){
                            case "email":
                                if(!validaEmail($('#'+i).val())) {
                                    adicionaMensagemErro(dados,opcoes.config);
                                    valido=false;
                                }
                                break;
                            case "data":
                                if(!validaData($('#'+i).val(), opcoes.config.formatoData)) {
                                    adicionaMensagemErro(dados,opcoes.config);
                                    valido=false;
                                }
                                break;
                            case "numero":
                                if(!validaNumero($('#'+i).val())) {
                                    adicionaMensagemErro(dados,opcoes.config);
                                    valido=false;
                                }
                                break;
                        }
                    }

                    if(dados.obrigatorio != undefined && dados.obrigatorio == true){
                        if(dados.ckeditor != undefined){
                            if(!validaCKEDITOR(i)) {
                                adicionaMensagemErro(dados,opcoes.config);
                                valido=false;
                            }
                        }else{
                            if(!validaObrigatorio($('#'+i).val())) {
                                adicionaMensagemErro(dados,opcoes.config);
                                valido=false;
                            }
                        }
                    }

                    if(dados.confirmacao != undefined){
                        if($('#'+i).val() != $('#'+dados.confirmacao.campo).val()){
                            $("#"+i).parent("li").addClass("erro");
                            $("#"+dados.confirmacao.campo).parent("li").addClass("erro");
                            $("#"+dados.confirmacao.campo).parent("li").append("<span class='"+opcoes.config.erroSpanClass+"'>"+dados.confirmacao.msg+"</span>");
                            valido=false;
                        }
                    }
                }
                return valido;
            });
        });
    };

    //DESTACA O CAMPO COM ERRO
    function adicionaMensagemErro(campo,config) {
        var mensagem = "";
        if(campo.msg != undefined){
            mensagem = campo.msg;
        }else{
            mensagem = config.msgObrigatorio
        }
        //ADICIONA A MENSAGEM NO LI
        //ADICIONA A MENSAGEM NO DIV DE ERRO
        $("."+config.erroDivClass+":first ol").append("<li>"+mensagem+"</li>");
        $("."+config.erroDivClass).show();

        $("#"+campo.id).parent("li").addClass("erro");
        $("#"+campo.id).parent("li").append("<span class='"+config.erroSpanClass+"'>"+mensagem+"</span>");
    }

    function validaEmail(email) {
        var email_pattern  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
        if(email.match(email_pattern)) return true;
        if(email == ''){
            return true;
        }
        return false;
    }

    function validaNumero(number) {
        var number_pattern = /^([0-9\s])+$/;
        if(number.match(number_pattern)){
            return true;
        }
        if(number == ''){
            return true;
        }
        return false;
    }

    function validaObrigatorio(val) {
        if(val.length>0) return true;
        return false;
    }

    function validaData(valorData, formato) {
        var date_pattern = null;

        if(formato == "m/d/y") date_pattern  = /(0[1-9]|1[012])+\/(0[1-9]|[12][0-9]|3[01])+\/[0-9]{2}$/;
        if(formato == "m-d-y") date_pattern  = /(0[1-9]|1[012])+\/(0[1-9]|[12][0-9]|3[01])+\/[0-9]{2}$/;
        if(formato == "d/m/y") date_pattern  = /(0[1-9]|[12][0-9]|3[01])+\/(0[1-9]|1[012])+\/[0-9]{2}$/;
        if(formato == "d-m-y") date_pattern  = /(0[1-9]|[12][0-9]|3[01])+\/(0[1-9]|1[012])+\/[0-9]{2}$/;

        if(formato == "m/d/Y") date_pattern  = /(0[1-9]|1[012])+\/(0[1-9]|[12][0-9]|3[01])+\/(19|20)\d\d/;
        if(formato == "m-d-Y") date_pattern  = /(0[1-9]|1[012])+\/(0[1-9]|[12][0-9]|3[01])+\/(19|20)\d\d/;
        if(formato == "d/m/Y") date_pattern  = /(0[1-9]|[12][0-9]|3[01])+\/(0[1-9]|1[012])+\/(19|20)\d\d/;
        if(formato == "d-m-Y") date_pattern  = /(0[1-9]|[12][0-9]|3[01])+\/(0[1-9]|1[012])+\/(19|20)\d\d/;

        if(valorData.match(date_pattern)) return true;
        if(valorData == ''){
            return true;
        }
        return false;
    }

    function validaCKEDITOR(editorNome) {
        var jsEditorHtml = CKEDITOR.instances[editorNome];
        if(jsEditorHtml.getData() == "")
            return false;
        else
            return true;
    }

    function limpaMensagensErro(config){
        $('li span.'+config.erroSpanClass).remove();
        $('li.'+config.erroLiClass).removeClass(config.erroLiClass);
        $("."+config.erroDivClass+":first ol").html("");
        $("."+config.erroDivClass).hide();

    }

})(jQuery);

