/* Método usado para validar campos
 * @author Mateus Haas
 * @return boolean
 *
 * Ex:
 * <p>
 *      <input type='text' data-name='E-mail' data-focus='false' data-mask='email' />
 * </p>
 * data-name String <p>é usado para personalizar o alert do campo ("O campo $name é obrigatório")</p>
 * data-msg String <p>é usado para personalizar o alert do campo ("$msg")</p>
 * data-focus boolean <p>é usado para dizer ao script se deve dar o focus</p>
 * data-clear boolean <p>é usado para dizer se deve limpar o campo ao dar o erro</p>
 * data-min-length int <p>qtd de caracteres minimo</p>
 * data-max-length int <p>qtd de caracteres maximo</p>
 * data-mask String <p>se existe uma mascara, verifica ela com expressão regular</p>
 */
(function($){
    $.fn.validate = function(options) {
        //Variaveis
        options = $.extend({
            defaultMsg : "Campo Obrigatório",
            clearField : false,
            focusField : true
        },options);
        var retrn = true;
        var $obj = $(this);

        //array de expressões regulares
        var masks = new Array();
        masks["email"] = /^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/;

        //varre todos os campos
        $obj.each(function() {
            var $field = $(this);
            
            //para cada tipo de input
            if ($field.is(":text") || $field.is(":password") || $field.is("textarea")) {
                string = $.trim($field.val());

                if ((mask = ($field.data("mask"))) != undefined) {
                    if (masks[mask] != undefined) {
                        if (!masks[mask].test(string)) {
                            validate($field,options,'Digite um valor válido.');
                            retrn = false;
                            return false;
                        }
                    }
                }
                if ((min = ($field.data("min-length"))) != undefined) {
                    if (string.length < parseInt(min)) {
                        validate($field,options,"Digite um valor acima de "+parseInt(min)+" caracteres.");
                        retrn = false;
                        return false;
                    }
                }
                if ((max = ($field.data("max-length"))) != undefined) {
                    if (string.length > parseInt(max)) {
                        validate($field,options,"Digite um valor abaixo de "+parseInt(max)+" caracteres.");
                        retrn = false;
                        return false;
                    }
                }
                if (string == "") {
                    validate($field,options);
                    retrn = false;
                    return false;
                }
            }
            else if ($field.is("select")) {
                if ($.trim($field.val()) == 0) {
                    validate($field,options);
                    retrn = false;
                    return false;
                }
            }
            else if ($field.is(":checkbox")) {
                if ($field.filter(":checked").length == 0) {
                    validate($field,options);
                    retrn = false;
                    return false;
                }
            }
            else if ($field.is(":radio")) {
                if ($("input[type=radio][name="+$field.attr("name")+"]").filter(":checked").length == 0) {
                    validate($field,options);
                    retrn = false;
                    return false;
                }
            }

        });
        return (retrn);
    }
})(jQuery);

/*
 * @param jQuery $obj <p>objeto da jQuery a ser validado</p>
 * @param Array options <p>opções default</p>
 * @param String mensagem <p>acrescenta algo na mensagem (geralmente vem nulo)</p>
 */
function validate($obj,options,msg) {
    //focus
    if ((($obj.data("focus") != undefined) ? $obj.data("focus") : options.focusField)) {
        $obj.trigger("focus");
    }

    //clear field
    if ((($obj.data("clear") != undefined) ? $obj.data("clear") : options.clearField)) {
        if ($obj.is(":text") || $obj.is(":password") || $obj.is("textarea")) {
            $obj.val("");
        }
    }

    //mensagem complementar
    if (msg != undefined) {
        msg = '\n' + msg;
    }
    else {
        msg = "";
    }

    //alerta
    alert((
        ($obj.data("msg") == undefined) ?
            ((($obj.data("name") == undefined) ?
                (options.defaultMsg + msg) :
                ("O campo " + $obj.data("name") + " é obrigatório." + msg))):
            ($obj.data("msg") + msg)
    ));
}
