﻿var tDica = 0;
jQuery.fn.extend
({
    limpaDica: function()
    {
        $(".erro", this)
            .removeClass("erro")
            .removeAttr("dica");

        $("p.dica").remove();
        $("tr:has(td.dica)").remove();
    },
    validar: function(outrasValidacoes)
    {
        var regEmail = new RegExp(/^[a-z0-9\.\-\_]+@[a-z0-9\-\_]+\.[a-z0-9\_\-]+/);
        var regNumero = new RegExp(/^[0-9]+$/);
        var regCep = new RegExp(/^[0-9]{5}-[0-9]{3}$/);
        var regCpf = new RegExp(/^[0-9]{1,3}\.[0-9]{3}\.[0-9]{3}-[0-9]{2}$/);
        var regCnpj = new RegExp(/^[0-9]{1,2}\.[0-9]{3}\.[0-9]{3}\/[0-9]{4}-[0-9]{2}$/);
        var regTelefone = new RegExp(/^\([0-9]{2}\) [0-9]{4}-[0-9]{4}$/);
        var regData = new RegExp(/^((0?[1-9]|[12]\d)\/(0?[1-9]|1[0-2])|30\/(0?[13-9]|1[0-2])|31\/(0?[13578]|1[02]))\/(19|20)?\d{2}$/);
        var regHoraMinuto = new RegExp(/^([0-1][0-9]|2[0-3]):([0-5][0-9])$/);
        var regHoraTresDigMinuto = new RegExp(/^([0-9][0-9][0-9]):([0-5][0-9])$/);
        var regDataMesAno = new RegExp(/^((0?[13-9]|1[0-2])|31\/(0?[13578]|1[02]))\/(19|20)?\d{2}$/);
        var regDataDiaMes = new RegExp(/^((0?[1-9]|[12]\d)\/(0?[1-9]|1[0-2])|30\/(0?[13-9]|1[0-2])|31\/(0?[13578]|1[02]))$/);
        var regValor = new RegExp(/[0-9]+,[0-9]{2}$/);
        var regDataHora = new RegExp(/^((0?[1-9]|[12]\d)\/(0?[1-9]|1[0-2])|30\/(0?[13-9]|1[0-2])|31\/(0?[13578]|1[02]))\/(19|20)?\d{2} ([0-1][0-9]|2[0-3]):([0-5][0-9])$/);
        var regSigla = new RegExp(/^[A-Z]{3}-[0-9]{4}-[0-9]{4}/);

        var configuraCampo = function(obj, msg)
        {
            $(obj)
                .attr("dica", msg)
                .addClass("erro")
                .attr("title", msg);
        };

        var valido = true;
        $("div.dica").hide();
        $(this).each(function()
        {
            oForm = $(this);
            oForm.limpaDica();
            $("input[obrigatorio=true], select[obrigatorio=true], textarea[obrigatorio=true]", oForm).each(function(i)
            {
                if ($.trim($(this).val()) == "")
                {
                    configuraCampo(this, "Campo obrigatório.");
                    valido = false;
                }
            });

            $("input[validacao]", oForm).each(function(i)
            {
                var valor = $(this).val();
                if ($.trim(valor) == "" && $(this).attr("obrigatorio") != "true")
                    return;

                switch ($(this).attr("validacao").toLowerCase())
                {
                    case "email":
                        if (!regEmail.test(valor))
                        {
                            configuraCampo(this, "Digite um email válido");
                            valido = false;
                        }
                        break;
                    case "numero":
                        if (!regNumero.test(valor))
                        {
                            configuraCampo(this, "Digite um número válido");
                            valido = false;
                        }
                        break;
                    case "cep":
                        if (!regCep.test(valor))
                        {
                            configuraCampo(this, "Digite um cep válido no padrão 99999-999");
                            valido = false;
                        }
                        break;
                    case "cpf":
                        if (!regCpf.test(valor))
                        {
                            configuraCampo(this, "Digite um CPF válido no padrão 999.999.999-99");
                            valido = false;
                        }
                        break;
                    case "cnpj":
                        if (!regCnpj.test(valor))
                        {
                            configuraCampo(this, "Digite um CNPJ válido 99.999.999/9999-99");
                            valido = false;
                        }
                        break;
                    case "telefone":
                        if (!regTelefone.test(valor))
                        {
                            configuraCampo(this, "Digite um Telefone válido no padrão (99) 9999-9999");
                            valido = false;
                        }
                        break;
                    case "data":
                        if (!regData.test(valor))
                        {
                            configuraCampo(this, "Digite uma Data válida no padrão DD/MM/YYYY.");
                            valido = false;
                        }
                        break;
                    case "datamesano":
                        if (!regDataMesAno.test(valor))
                        {
                            configuraCampo(this, "Digite uma Data válida no padrão MM/YYYY.");
                            valido = false;
                        }
                        break;
                    case "datadiames":
                        if (!regDataDiaMes.test(valor))
                        {
                            configuraCampo(this, "Digite uma Data válida no padrão DD/MM.");
                            valido = false;
                        }
                        break;
                    case "horaminuto":
                        if (!regHoraMinuto.test(valor))
                        {
                            configuraCampo(this, "Digite uma hora válida no padrão hh:mm.");
                            valido = false;
                        }
                        break;
                    case "horatresdigminuto":
                        if (!regHoraTresDigMinuto.test(valor))
                        {
                            configuraCampo(this, "Digite um minuto válido entre 0 e 59.");
                            valido = false;
                        }
                        break;
                    case "periodo":
                        var data = Date.parse(valor);
                        if (data == null)
                        {
                            var arrData = valor.split(" - ");
                            if (arrData.length == 2)
                            {
                                if (Date.parse(arrData[0]) == null || Date.parse(arrData[1]) == null)
                                {
                                    configuraCampo(this, "Digite uma data ou período válido.");
                                    valido = false;
                                }
                                else
                                {

                                }
                            }
                            else
                            {
                                configuraCampo(this, "Digite uma data ou período válido.");
                                valido = false;
                            }
                        }
                        break;
                    case "datahora":
                        if (!regDataHora.test(valor))
                        {
                            configuraCampo(this, "Digite uma data/hora no padrão DD/MM/AAAA hh:mm.");
                            valido = false;
                        }
                        break;
                    case "sigla":
                        if (!regSigla.test(valor))
                        {
                            configuraCampo(this, "Digite uma sigla no formato PJT-9999-9999.");
                            valido = false;
                        }
                        break;
                    case "valor":
                        if (!regValor.test(valor))
                        {
                            configuraCampo(this, "Digite um valor no padrão 999,99.");
                            valido = false;
                        }
                        break;
                }
            });

            if (outrasValidacoes)
            {
                $(outrasValidacoes).each(function()
                {
                    if ($(this.Objeto).hasClass("erro") != null && !this.Valido())
                    {
                        var Mensagem = this.Mensagem;
                        $(this.Objeto).each(function()
                        {
                            configuraCampo($(this), Mensagem);
                        });
                        valido = false;
                    }
                });
            }

            if (!valido)
            {
                if ($("div.dica").size() == 0)
                    $("body").append("<div class='dica'></div>");
                else
                    $("div.dica").hide();

                dica = $("div.dica");
                clearInterval(tDica);
                tDica = setInterval(function()
                {
                    if ($("#" + dica.attr("ref")).size() == 0)
                        $("div.dica").hide();
                }, 1);
            }

            $("input[dica], select[dica], textarea[dica]").focus(function()
            {
                if ($(this).attr("dica"))
                {
                    var oObj = $(this)
                    var offset = oObj.position();
                    $("div.dica")
                        .insertAfter(oObj)
                        .attr("ref", $(this).attr("id"))
                        .html("<p>" + oObj.attr("dica") + "</p>")
                        .css("top", offset.top - 4)
                        .css("left", offset.left + oObj.width() + 23)
                        .animate({ opacity: "show", left: "-=20" }, "normal");
                }
            });

            $("input[dica], select[dica], textarea[dica]").blur(function()
            {
                $("div.dica").hide();
            });

            $("input:checkbox[dica]").each(function()
            {
                var oObj = $(this)
                var offset = oObj.offset();
                $("div.dica")
                        .attr("ref", $(this).attr("id"))
                        .html("<p>" + oObj.attr("dica") + "</p>")
                        .css("top", offset.top - 4)
                        .css("left", offset.left + oObj.width() + 23)
                        .animate({ opacity: "show", left: "-=20" }, "normal");

            });

            $("ul[dica], div[dica]").each(function()
            {
                $("<p class='dica'>" + $(this).attr("dica") + "</p>").insertAfter(this);
            });

            $("table[dica]").each(function()
            {
                $("tbody", this).prepend("<tr><td colspan='20' class='dica'>" + $(this).attr("dica") + "</td></tr>");
            });

            $("[dica]:visible:first", this).focus();
        });

        return valido;
    },
    mascara: function()
    {
        var campo;
        var mask;

        var execMascara = function()
        {
            campo.val(mask(campo.val()));
        }

        var configuraMascara = function(_campo, _mask)
        {
            _campo.keypress(function()
            {
                campo = _campo;
                mask = _mask;
                setInterval(execMascara, 1);
            });
        }

        var mascaraCEP = function(v)
        {
            v = v.replace(/\D/g, "");
            v = v.replace(/^(\d{5})(\d+)/g, "$1-$2");
            v = v.replace(/^(\d{5}\-\d{3})(\d+)/g, "$1");
            return v;
        }

        var mascaraValor = function(v)
        {
            v = v.replace(/\D/g, "");
            v = v.replace(/(\d)(\d{2})$/g, "$1,$2");
            v = v.replace(/(\d)(\d{3},\d{2})$/g, "$1.$2");
            v = v.replace(/(\d)(\d{3}.\d{3},\d{2})$/g, "$1.$2");
            v = v.replace(/(\d)(\d{3}.\d{3}.\d{3},\d{2})$/g, "$1.$2");
            v = v.replace(/(\d)(\d{3}.\d{3}.\d{3}.\d{3},\d{2})$/g, "$1.$2");
            v = v.replace(/(\d)(\d{3}.\d{3}.\d{3}.\d{3}.\d{3},\d{2})$/g, "$1.$2");
            return v;
        }

        var mascaraNumero = function(v)
        {
            return v.replace(/\D/g, "");
        }

        var mascaraCPF = function(v)
        {
            v = v.replace(/\D/g, "");
            v = v.replace(/^(\d{3})(\d+)/g, "$1.$2");
            v = v.replace(/^(\d{3}\.\d{3})(\d+)/g, "$1.$2");
            v = v.replace(/^(\d{3}\.\d{3}\.\d{3})(\d+)/g, "$1-$2");
            v = v.replace(/^(\d{3}\.\d{3}\.\d{3}-\d{2})(\d+)/g, "$1");
            return v;
        }

        var mascaraTelefone = function(v)
        {
            v = v.replace(/\D/g, "");
            v = v.replace(/^(\d+)/g, "($1")
            v = v.replace(/^(\(\d{2})(\d+)/g, "$1) $2")
            v = v.replace(/^(\(\d{2}\) \d{4})(\d+)/g, "$1-$2")
            v = v.replace(/^(\(\d{2}\) \d{4}-\d{4})(\d+)/g, "$1")
            return v;
        }

        var mascaraData = function(v)
        {
            v = v.replace(/\D/g, "");
            v = v.replace(/^(\d{2})(\d+)/g, "$1/$2");
            v = v.replace(/^(\d{2}\/\d{2})(\d+)/g, "$1/$2");
            v = v.replace(/^(\d{2}\/\d{2}\/\d{4})(\d+)/g, "$1");
            return v;
        }

        var mascaraPeriodo = function(v)
        {
            v = v.replace(/\D/g, "");
            v = v.replace(/^(\d{2})(\d+)/g, "$1/$2");
            v = v.replace(/^(\d{2}\/\d{2})(\d+)/g, "$1/$2");
            v = v.replace(/^(\d{2}\/\d{2}\/\d{4})(\d+)/g, "$1 - $2");
            v = v.replace(/^(\d{2}\/\d{2}\/\d{4} - \d{2})(\d+)/g, "$1/$2");
            v = v.replace(/^(\d{2}\/\d{2}\/\d{4} - \d{2}\/\d{2})(\d+)/g, "$1/$2");
            return v;
        }

        var mascaraCNPJ = function (v)
        {
            v = v.replace(/\D/g, "");
            v = v.replace(/^(\d{2})(\d+)/g, "$1.$2");
            v = v.replace(/^(\d{2}\.\d{3})(\d+)/g, "$1.$2");
            v = v.replace(/^(\d{2}\.\d{3}\.\d{3})(\d+)/g, "$1/$2");
            v = v.replace(/^(\d{2}\.\d{3}\.\d{3}\/\d{4})(\d+)/g, "$1-$2");
            v = v.replace(/^(\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2})(\d+)/g, "$1");
            return v;
        }

        $(this).each(function()
        {
            var obj = $(this);

            switch (obj.attr("validacao"))
            {
                case "cep":
                    obj.attr("maxlength", 9);
                    configuraMascara(obj, mascaraCEP);
                    obj.val(mascaraCEP(obj.val()));
                    break;
                case "valor":
                    obj.css("text-align", "right");
                    configuraMascara(obj, mascaraValor);
                    obj.val(mascaraValor(obj.val()));
                    break;
                case "numero":
                    configuraMascara(obj, mascaraNumero);
                    obj.css("text-align", "right");
                    obj.val(mascaraNumero(obj.val()));
                    break;
                case "cpf":
                    obj.attr("maxlength", 14);
                    configuraMascara(obj, mascaraCPF);
                    obj.val(mascaraCPF(obj.val()));
                    break;
                case "cnpj":
                    obj.attr("maxlength", 19);
                    configuraMascara(obj, mascaraCNPJ);
                    obj.val(mascaraCNPJ(obj.val()));
                    break;
                case "telefone":
                    obj.attr("maxlength", 14);
                    configuraMascara(obj, mascaraTelefone);
                    obj.val(mascaraTelefone(obj.val()));
                    break;
                case "data":
                    obj.attr("maxlength", 10);
                    configuraMascara(obj, mascaraData);
                    obj.val(mascaraData(obj.val()));
                    break;
                case "periodo":
                    obj.attr("maxlength", 23);
                    obj.attr("autocomplete", "off");
                    configuraMascara(obj, mascaraPeriodo);
                    obj.val(mascaraPeriodo(obj.val()));
                    break;
            }
        });
    }
});

function Validacao(objeto, mensagem, funcao)
{
    this.Objeto = objeto;
    this.Mensagem = mensagem;
    this.Funcao = funcao;

    this.Valido = function()
    {
        return this.Funcao();
    }
}
