
$(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: "These 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(
		"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 == 10
		},
		"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
);
