jQuery.validator.addMethod("dataBR", function(value, element, params) {
    var er = /(^(0[1-9]|[12][0-9]|3[01])\/(0[13578]|1[02])\/(19[0-9]{2}|2[0-9]{3}))|(^(0[1-9]|[12][0-9]|30)\/(0[469]|11)\/(19[0-9]{2}|2[0-9]{3}))|(^(0[1-9]|1[0-9]|2[0-9])\/02\/(19[0-9]{2}|2[0-9]{3}))$/;

    var dia = parseInt(value.substring(0,3));
    var mes = parseInt(value.substring(3,5));
    var ano = parseInt(value.substring(6,10));

    var retorno = (er.test(value) && (mes==2 && dia == 29 ? (ano%4 == 0 ? true : false) : true));
    return this.optional(element) || retorno;
}, "Data inv&aacute;lida.");

jQuery.validator.addMethod("horaBR", function(value, element, params) {
	return this.optional(element) || /^([0-1]\d|2[0-3]):[0-5]\d$/.test(value);
	}, "Hora inv&aacute;lida.");

jQuery.validator.addMethod("urlBR", function(value, element, params) {
var er = /^(https?:\/\/)?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?(([0-9]{1,3}\.){3}[0-9]{1,3}|([0-9a-z_!~*'()-]+\.)*([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\.[a-z]{2,6})(:[0-9]{1,4})?((\/?)|(\/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+\/?)$/;
var retorno = (er.test(value)) ? true : false;
return this.optional(element) || retorno;
}, "Url inv&aacute;lida.");

jQuery.validator.addMethod("dataHoraBR", function(value, element) {
	 //contando chars
	if(value.length!=16) return false;
	 // dividindo data e hora
	if(value.substr(10,1)!=' ') return false; // verificando se há espaço
	var arrOpcoes = value.split(' ');
	if(arrOpcoes.length!=2) return false; // verificando a divisão de data e hora
	// verificando data
	var data 		= arrOpcoes[0];
	var dia 		= data.substr(0,2);
	var barra1		= data.substr(2,1);
	var mes 		= data.substr(3,2);
	var barra2		= data.substr(5,1);
	var ano 		= data.substr(6,4);
	if(data.length!=10 || barra1!="/" || barra2!="/" || isNaN(dia) || isNaN(mes) || isNaN(ano) || dia>31 || mes>12)return false;
	if ((mes==4 ||mes==6 ||mes==9 ||mes==11) && dia==31)return false;
	if (mes==2 && (dia>29 ||(dia==29&&ano%4!=0)))return false;
	// verificando hora
	var horario 	= arrOpcoes[1];
	var	hora 		= horario.substr(0,2);
	var doispontos 	= horario.substr(2,1);
	var minuto 		= horario.substr(3,2);
	var retorno = (horario.length!=5 || isNaN(hora) || isNaN(minuto) || hora>23 || minuto>59 || doispontos!=":") ? false : true;
    return this.optional(element) || retorno;
}, "Data inv&aacute;lida");

jQuery.validator.addMethod("verificaCPF", function(value, element) {

	cpf =  value.replace(/\D/g,"");
	while(cpf.length < 11) cpf = "0"+ cpf;
	var expReg = /^0+$|^1+$|^2+$|^3+$|^4+$|^5+$|^6+$|^7+$|^8+$|^9+$/;
	var a = [];
	var b = new Number;
	var c = 11;
	for (i=0; i<11; i++){
		a[i] = cpf.charAt(i);
		if (i < 9) b += (a[i] * --c);
	}
	if ((x = b % 11) < 2) { a[9] = 0 } else { a[9] = 11-x }
	b = 0;
	c = 11;
	for (y=0; y<10; y++) b += (a[y] * c--);
	if ((x = b % 11) < 2) { a[10] = 0; } else { a[10] = 11-x; }
	var retorno = ((cpf.charAt(9) != a[9]) || (cpf.charAt(10) != a[10]) || cpf.match(expReg)) ? false : true;
    return this.optional(element) || retorno;
}, "CPF inv&aacute;lido."); // Mensagem padrão

jQuery.validator.addMethod("verificaCNPJ", function(value, element) {
	cnpj = value.replace(/\D/g,"");
	while(cnpj.length < 14) cnpj = "0"+ cnpj;
	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];
    for (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 (y=0; y<13; y++) {
        b += (a[y] * c[y]);
    }
    if ((x = b % 11) < 2) { a[13] = 0; } else { a[13] = 11-x; }
    var retorno =  ((cnpj.charAt(12) != a[12]) || (cnpj.charAt(13) != a[13])  || cnpj.match(expReg) ) ? false : true;
    return this.optional(element) || retorno;
}, "CNPJ inv&aacute;lido."); // Mensagem padrão

jQuery.validator.addMethod("datamaiorigualque", function(value, element,target) {
    var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
    var anotherValue = jQuery(target).val();
    if( re.test(value) && re.test(anotherValue) ){
    var adata = value.split('/');
    var gg = parseInt(adata[0],10);
    var mm = parseInt(adata[1],10);
    var aaaa = parseInt(adata[2],10);
    var xdata = new Date(aaaa,mm-1,gg);

    var adata = anotherValue.split('/');
    var gg = parseInt(adata[0],10);
    var mm = parseInt(adata[1],10);
    var aaaa = parseInt(adata[2],10);
    var ydata = new Date(aaaa,mm-1,gg);

    if ( ydata <= xdata )
        check = true;
    else
        check = false;
    } else
        check = false;
    return this.optional(element) || check;
}, "Your date field must be much more.");