jQuery.validator.addMethod("required0", function(value, element, param) {
			// check if dependency is met
			if ( !this.depend(param, element) )
				return "dependency-mismatch";
			switch( element.nodeName.toLowerCase() ) {
			case 'select':
				var options = jQuery("option:selected", element);
				return options.length > 0 && ( element.type == "select-multiple" || (jQuery.browser.msie && !(options[0].attributes['value'].specified) ? options[0].text : options[0].value).length > 0) && (options[0].value!=0);
			case 'input':
				if ( this.checkable(element) )
					return this.getLength(value, element) > 0;
			default:
				return value.length > 0;
			}
}, "Por favor introduza alg&uacute;n valor."); 

jQuery.validator.addMethod("maxWords", function(value, element, params) { 
    return this.optional(element) || value.match(/\b\w+\b/g).length < params; 
}, "Introduzca {0} o menos palabras."); 

jQuery.validator.addMethod("minWords", function(value, element, params) { 
    return this.optional(element) || value.match(/\b\w+\b/g).length >= params; 
}, "Introduzca al menos {0} palabras."); 

jQuery.validator.addMethod("dateES", function(value, element) { 
		var check = false;
		var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/
		if( re.test(value)){
			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);
			if ( ( xdata.getFullYear() == aaaa ) && ( xdata.getMonth () == mm - 1 ) && ( xdata.getDate() == gg ) )
				check = true;
			else
				check = false;
		} else
			check = false;
		return this.optional(element) || check;		
}, "Por favor introduzca una fecha correcta dd/mm/yyyy"); 

jQuery.validator.addMethod("datetimeES", function(value, element) { 
		var check = false;
		var re = /^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$/
		if( re.test(value)){
			check = true;
		} else
			check = false;
		return this.optional(element) || check;
}, "Por favor introduzca una fecha correcta"); 
jQuery.validator.addMethod("hora", function(value, element) { 
		var check = false;
		var re = /^\d{1,2}\:\d{1,2}$/
		if( re.test(value)){
			var adata = value.split(':');
			var hh = parseInt(adata[0],10);
			var mm = parseInt(adata[1],10);
			if ( ( hh <= 24 ) && ( hh >= 0 ) && ( mm <= 59 ) && ( mm >= 0 ) )
				check = true;
			else
				check = false;
		} else
			check = false;
		return this.optional(element) || check;
}, "Por favor introduzca una hora correcta"); 

jQuery.validator.addMethod("CIF", function(value, element) { 
		var check = false;
		var texto = value;
		texto = texto.toUpperCase();
		var re = /^[ABCDEFGHKLMNPQS]\d\d\d\d\d\d\d[0-9,A-J]$/
		if( re.test(texto)){

			var pares = 0;
			var impares = 0;
			var suma;
			var ultima;
			var unumero;
			var uletra = new Array("J", "A", "B", "C", "D", "E", "F", "G", "H", "I");
			var xxx;

			ultima = texto.substr(8,1);

			for (var cont = 1 ; cont < 7 ; cont ++)
			{
			xxx = (2 * parseInt(texto.substr(cont++,1))).toString() + "0";
			impares += parseInt(xxx.substr(0,1)) + parseInt(xxx.substr(1,1));
			pares += parseInt(texto.substr(cont,1));
			}

			xxx = (2 * parseInt(texto.substr(cont,1))).toString() + "0";
			impares += parseInt(xxx.substr(0,1)) + parseInt(xxx.substr(1,1));

			suma = (pares + impares).toString();
			unumero = parseInt(suma.substr(suma.length - 1, 1));
			unumero = (10 - unumero).toString();

			if(unumero == 10) unumero = 0;

			if ((ultima == unumero) || (ultima == uletra[unumero]))
				check = true;
			else
				check = false; 

		} else
			check = false;
		return this.optional(element) || check;
}, "Por favor introduzca un CIF correcto"); 


jQuery.validator.addMethod("NIF", function(value, element, params) { 
		var check = false;
		value = value.toUpperCase();
		numero = value.substr(0,value.length-1);
		numero = numero.replace('X','0'); //Extranjeros
		numero = numero.replace('Y','1'); //Extranjeros
		let = value.substr(value.length-1,1);
		numero = numero % 23;
		letra='TRWAGMYFPDXBNJZSQVHLCKET';
		letra=letra.substring(numero,numero+1);
		if (letra!=let) {
		  check = false;
		}else{
		  check = true;
		}
		return this.optional(element) || check;
}, "Introduzca un NIF correcto"); 

jQuery.validator.addMethod("CIFNIF", function(value, element, params) { 
		check = false;
		value = value.toUpperCase();
		prim_caracter = value.substr(0,1);
		if (isNaN(prim_caracter)) { // es una letra
			var texto = value;
			var re = /^[ABCDEFGHKLMNPQS]\d\d\d\d\d\d\d[0-9,A-J]$/
			if( re.test(texto)){
	
				var pares = 0;
				var impares = 0;
				var suma;
				var ultima;
				var unumero;
				var uletra = new Array("J", "A", "B", "C", "D", "E", "F", "G", "H", "I");
				var xxx;
	
				ultima = texto.substr(8,1);
	
				for (var cont = 1 ; cont < 7 ; cont ++)
				{
				xxx = (2 * parseInt(texto.substr(cont++,1))).toString() + "0";
				impares += parseInt(xxx.substr(0,1)) + parseInt(xxx.substr(1,1));
				pares += parseInt(texto.substr(cont,1));
				}
	
				xxx = (2 * parseInt(texto.substr(cont,1))).toString() + "0";
				impares += parseInt(xxx.substr(0,1)) + parseInt(xxx.substr(1,1));
	
				suma = (pares + impares).toString();
				unumero = parseInt(suma.substr(suma.length - 1, 1));
				unumero = (10 - unumero).toString();
	
				if(unumero == 10) unumero = 0;
	
				if ((ultima == unumero) || (ultima == uletra[unumero]))
					check = true;
				else
					check = false; 
	
			} else
				check = false;
		} else { // es un numero
			numero = value.substr(0,value.length-1);
			numero = numero.replace('X','0'); //Extranjeros
			numero = numero.replace('Y','1'); //Extranjeros
			let = value.substr(value.length-1,1);
			numero = numero % 23;
			letra='TRWAGMYFPDXBNJZSQVHLCKET';
			letra=letra.substring(numero,numero+1);
			if (letra!=let) {
			  check = false;
			}else{
			  check = true;
			}
		}
		return this.optional(element) || check;
}, "Introduzca un CIF o NIF correcto"); 

jQuery.validator.addMethod("CCC", function(value, element) {
		var check = false;
		var re = /^\d{4}\ ?\d{4}\ ?\d{2}\ ?\d{10}$/
		if( re.test(value)){
			check = true;
		} else
			check = false;
		return this.optional(element) || check;
}, "Introduzca un CCC válido");  

jQuery.validator.addMethod("NSS", function(value, element) {
		var check = false;
		if (value.length != 11 && value.length != 12) return false;
		if (value.substr(2, 1) == 0) value = "" + value.substr(0, 2) + value.substr(3, value.length-1);
		if (mod(value.substr(0, value.length-2), 97) == value.substr(value.length-2, 2)) return true;
		else return false;
		return this.optional(element) || check;
}, "Introduzca un NSS válido");  

jQuery.validator.addMethod("notEqualTo", function(value, element, param) {
	var target = $(param).unbind(".validate-notEqualTo").bind("blur.validate-notEqualTo", function() {
		$(element).valid();
	});
	return value != target.val();
	
}, "Los valores no deben coincidir."); 

jQuery.validator.addMethod("numberES", function(value, element) {
	return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value);	
}, "Por favor, introduzca un valor num&eacute;rico. El separador de decimales es la coma no el punto."); 

jQuery.validator.addMethod("ip", function(value, element) {
	return this.optional(element) || /^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$/.test(value);
}, "Por favor, introduzca una dirección IP válida.");
