
$(document).ready(function(){
    // a custom method for validating the date range
    $.validator.addMethod("dateRange", function() {
        return new Date($("#grupo_data_ini").val().split("/").reverse().join("/")) < new Date($("#grupo_data_fim").val().split("/").reverse().join("/"));
    }, "A data inicial deve ser anterior à data final");

    // a new class rule to group all three methods
    $.validator.addClassRules({
        requiredDateRange: {
            required:true, 
            date:true, 
            dateRange:true
        }
    });

    // overwrite default messages
    $.extend($.validator.messages, {
        required: "xxxxxxxxxxxThese fields are required",
        date: "Please specify valid dates"
    });


    $.validator.addMethod(
        "dateBR",
        function (value, element) {
            var val_exp = value.split('/');
            if (val_exp.length == 3) {
                var ano = val_exp[2];
                var mes = val_exp[1];
                var dia = val_exp[0];
                if ((ano >= 1000)&&(ano < 10000)) {
                    if (((mes=='01')||(mes=='03')||(mes=='05')||(mes=='07')||(mes=='08')||(mes=='10')||(mes=='12'))&&(dia.match(/^(0[1-9]|[1-2][0-9]|3[0-1])$/))) {
                        return true;
                    } else if (((mes=='04')||(mes=='06')||(mes=='09')||(mes=='07')||(mes=='08')||(mes=='11'))&&(dia.match(/^(0[1-9]|[1-2][0-9]|30)$/))) {
                        return true;
                    } else if ((mes=='02')&&(dia.match(/^(0[1-9]|1[0-9]|2[0-8])$/))) {
                        return true;
                    } else if ((mes=='02')&&(dia=='29')&&((ano%400==0)||((ano%4==0)&&(ano%100!=0)))) {
                        return true;
                    } else {
                        if ($(element).val().length == 0) {
                            return true;
                        } else {
                            return false;
                        }
                    }
                } else {
                    if($(element).val().length == 0) {
                        return true;
                    } else {
                        return false;
                    }
                }
            } else {
                if ($(element).val().length == 0) {
                    return true;
                } else {
                    return false;
                }
            }
        },
        "Data inválida" // Mensagem padrao
        );
            
    $.validator.addMethod(
        "timeBR",
        function(value) {
            var horario 	= value;
            var hora 		= horario.substr(0,2);
            var doispontos 	= horario.substr(2,1);
            var minuto 		= horario.substr(3,2);
            var segundos 	= horario.substr(6,2);
            if(isNaN(hora)
                || isNaN(minuto)
                || hora > 23
                || minuto > 59
                || doispontos != ":"){
                return false;
            }else if(horario.length == 8){
                if(segundos > 59){
                    return false;
                }
            }
            return true;
        }, "Hora inválida");

    $.validator.addMethod(
        "cpf",
        function (value, element){
            var numeros, digitos, soma, i, resultado, digitos_iguais;
            var cpf = value.replace(/[^0-9]+/g, '');
            digitos_iguais = 1;

            if (cpf.length < 11) {
                if ($(element).val().length == 0) {
                    return true;
                } else {
                    return false;
                }
            }

            for (i = 0; i < cpf.length - 1; i++) {
                if (cpf.charAt(i) != cpf.charAt(i + 1)) {
                    digitos_iguais = 0;
                    break;
                }
            }

            if (!digitos_iguais) {
                numeros = cpf.substring(0,9);
                digitos = cpf.substring(9);
                soma    = 0;

                for (i = 10; i > 1; i--) {
                    soma += numeros.charAt(10 - i) * i;
                }

                resultado = soma % 11 < 2
                ? 0
                : 11 - soma % 11;

                if (resultado != digitos.charAt(0)) {
                    if ($(element).val().length==0) {
                        return true;
                    } else {
                        return false;
                    }
                }

                numeros = cpf.substring(0,10);
                soma = 0;

                for (i = 11; i > 1; i--) {
                    soma += numeros.charAt(11 - i) * i;
                }

                resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;

                if (resultado != digitos.charAt(1)) {
                    if ($(element).val().length == 0) {
                        return true;
                    } else {
                        return false;
                    }
                }

                return true;
            } else if ($(element).val().length == 0) {
                return true;
            } else {
                return false;
            }
        },
        "CPF inválido" // Mensagem padrao
        );

    $.validator.addMethod(
        "fone",
        function (value, element){
            return value.replace(/\D/g, '').length == 11
        },
        "Telefone inválido" // Mensagem padrao
        );

    jQuery.validator.addMethod(
        "cnpj", 
        function (value, element) {
            var cnpj   = value.replace(/\D/g,"");
            var expReg = /^0+$|^1+$|^2+$|^3+$|^4+$|^5+$|^6+$|^7+$|^8+$|^9+$/;
            var a      = [];
            var b      = new Number;
            var c      = [6,5,4,3,2,9,8,7,6,5,4,3,2];
				
            while(cnpj.length < 14) {
                cnpj = "0"+ cnpj;
            }

            for (var i = 0; i < 12; i++) {
                a[i] = cnpj.charAt(i);
                b   += a[i] * c[i+1];
            }

            if ((x = b % 11) < 2) {
                a[12] = 0;
            } else { 
                a[12] = 11-x;
            }
				
            b = 0;
            for (var y = 0; y < 13; y++) {
                b += (a[y] * c[y]);
            }

            if ((x = b % 11) < 2) {
                a[13] = 0;
            } else { 
                a[13] = 11-x; 
            }
				
            if ((cnpj.charAt(12) != a[12]) || (cnpj.charAt(13) != a[13]) || cnpj.match(expReg) ) {
                if($(element).val().length == 0) {
                    return true; 
                } else {
                    return false;
                }
            }
				
            return true;
        }, 
        "CNPJ inválido" // Mensagem padrao
        );

    jQuery.validator.addMethod(
        "numeros", 
        function (value, element) {
            var valor = value.replace(/\D/g,"");
				
            if (valor != value) {
                return false;
            } else {
                return true;
            }
        }, 
        "Somente números" // Mensagem padrao
        );

    jQuery.validator.addMethod(
        "emails", 
        function (value, element) {
            var emails  = value.split(',');
            var retorno = true;
				
            $.each(emails, function (i, val){
					
                var email = val.replace(/^\ *|\ *$/g, ''); 
                var exp   = /^[A-Za-z0-9]([\w\.\-\_]*)@([A-Za-z0-9\.]*)\.(([A-Za-z]{3}\.[A-Za-z]{2}$)|([A-Za-z]{3}$)|([a-z]{2}$))/i ;
                if (!exp.test(email)) {
                    retorno = false;
                }
            });
				
            return retorno;
        }, 
        "Informe e-mails válidos" // Mensagem padrao
        );

});
