﻿var validacao = (function($, undefined) {
    var email_regex = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    function EmailValido(email, obrigatorio) {
        if (typeof obrigatorio === "undefined") {
            obrigatorio = true;
        }
        return (
                        (obrigatorio && email.match(email_regex) !== null) == true
                    ||
                        (!obrigatorio && email.length > 0 && email.match(email_regex) !== null) == true
                    ||
                        (!obrigatorio && email.length == 0) == true
                    );
    }
    function TextoValido(texto, obrigatorio) {
        return ((obrigatorio && texto.length > 0) == true || (!obrigatorio) == true);
    }
    function NumeroValido(numero, obrigatorio) {
        return ((obrigatorio && parseFloat(numero) == numero) == true || (!obrigatorio && numero.length > 0 && parseFloat(numero) == numero) == true || (!obrigatorio && numero.length == 0) == true);
    }
    function ValorValido($elemento, obrigatorio) {
        var validade = false;
        var verificardependencia = false;
        var title = $elemento.attr("title");
        var title_regex = /^(aviso)\|(.+)$/;
        var title_match = title_regex.exec(title);
        if (title_match != null) {
            title = title_match[2];
        }
        else {
            title = undefined;
        }
        if (ValidacaoResolvida($elemento)) {
            return true;
        }

        if ($elemento.hasClass("texto")) {
            var placeholder = $elemento.data("placeholder");
            var isPlaceholded = $elemento.val() === placeholder ? placeholder : "";
            if (!(validade = TextoValido($elemento.val(), obrigatorio)) || isPlaceholded) {
                if (typeof title !== "undefined") {
                    alert(title);
                }
                else {
                    alert("Campo deve ser preenchido");
                }
                $elemento.focus();
                return false;
            }
            else { validade = true; }
        }
        else if ($elemento.hasClass("email")) {
            var placeholder = $elemento.data("placeholder");
            var isPlaceholded = $elemento.val() === placeholder ? placeholder : "";

            if (!(validade = EmailValido($elemento.val(), obrigatorio)) || isPlaceholded) {
                if (typeof title !== "undefined") {
                    alert(title);
                }
                else {
                    alert("Campo deve ser preenchido com e-mail válido");
                }
                $elemento.focus();
                return false;
            }
            else { validade = true; }
        }
        else if ($elemento.hasClass("numero")) {
            var placeholder = $elemento.data("placeholder");
            var isPlaceholded = $elemento.val() === placeholder ? placeholder : "";
            if (!(validade = NumeroValido($elemento.val(), obrigatorio)) || isPlaceholded) {
                if (typeof title !== "undefined") {
                    alert(title);
                }
                else {
                    alert("Campo deve ser preenchido com número válido");
                }
                $elemento.focus();
                return false;
            }
            else { validade = true; }
        }

        verificardependencia = (($elemento.hasClass("email") && validade && $elemento.val().length > 0) || ($elemento.hasClass("texto") && $elemento.val().length > 0 && validade) || ($elemento.hasClass("numero") && $elemento.val().length > 0 && validade));

        ResolverValidacao($elemento);

        if ($elemento.hasClass("anterior") && verificardependencia) {
            if (!(validade = ValorValido($elemento.prev(), true))) {
                return false;
            }
        }
        else if ($elemento.hasClass("proximo") && verificardependencia) {
            if (!(validade = ValorValido($elemento.next(), true))) {
                return false;
            }
        }
        return validade;
    }
    function ReiniciarValidacao($elementos) {
        $elementos.removeClass("resolvido");
    }
    function ResolverValidacao($elementos) {
        $elementos.addClass("resolvido");
    }
    function ValidacaoResolvida($elemento) {
        return $elemento.hasClass("resolvido");
    }
    function FormularioValido($form) {
        var $inputs = $form.find(":input:not(.naocontar)");
        var $obrigatorios = $inputs.filter(".obrigatorio");
        var $naoobrigatorios = $inputs.filter(":not(.obrigatorio)");

        ReiniciarValidacao($obrigatorios);
        ReiniciarValidacao($naoobrigatorios);

        for (var i = 0; i < $obrigatorios.length; i++) {
            var $atual = $obrigatorios.eq(i);
            var validade = ValorValido($atual, true);
            if (!validade) {
                return false;
            }
        }
        for (var i = 0; i < $naoobrigatorios.length; i++) {
            var $atual = $naoobrigatorios.eq(i);
            var validade = ValorValido($atual, false);
            if (!validade) {
                return false;
            }
        }
        return true;
    }
    return {
        FormularioValido: FormularioValido,
        EmailValido: EmailValido
    }
})(jQuery);
