			jQuery.validator.setDefaults({
				success: "valid"
			});			
			
			function comprovadni(dni) {
				
				dni = dni.replace(/\./g, '');
				dni = dni.replace(/-/g, '').toUpperCase();
				var regex = new RegExp('^[0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKE]$')
				if(!regex.test(dni)) return false;
				numero = dni.substr(0,dni.length-1);
				let = dni.substr(dni.length-1,1);
				numero = numero % 23;
				letra='TRWAGMYFPDXBNJZSQVHLCKET';
				letra=letra.substring(numero,numero+1);
				return letra==let;
			}

			function comprovanie(nie) {
				lletraPrimera = nie.substr(0, 1).toUpperCase();
				var numeroSubstituir;
				switch(lletraPrimera){
					case 'X':
						numeroSubstituir = '0';
						break;
					case 'Y':
						numeroSubstituir = '1';
						break;
					case 'Z':
						numeroSubstituir = '2';
						break;
				}
				restaEsDniNie = nie.substr(1, nie.length);
				return ((lletraPrimera=='X' || lletraPrimera=='Y' || lletraPrimera=='Z') && comprovadni(numeroSubstituir + restaEsDniNie));
			}
			
			//DNI
			jQuery.validator.addMethod("dni", function(value, element) {
				return this.optional(element) || comprovadni(value);
			});
			
			//NIE
			jQuery.validator.addMethod("nie", function(value, element) {
				return this.optional(element) || comprovanie(value);
			});
			
			//DNI + NIE
			jQuery.validator.addMethod("dninie", function(value, element) {
				return this.optional(element) || comprovadni(value) || comprovanie(value);
			});
			
			function comprovatelefon(telefon) {
			  var ereg = new RegExp(/^[0-9\+\ \(\)\-]{9,23}$/)
			  return ereg.test(telefon);
			}
			
			jQuery.validator.addMethod("telefon", function(value, element) {
				return this.optional(element) || comprovatelefon(value);
			});
			
			function comprovatelefonchi(telefon) {
			  var ereg = new RegExp(/^[0-9\+\ \(\)\-]{7,23}$/)
			  return ereg.test(telefon);
			}
			
			jQuery.validator.addMethod("telefon_chi", function(value, element) {
				return this.optional(element) || comprovatelefonchi(value);
			});
			
			function comprovatelefonmvlchi(telefon) {
				telefon = telefon.replace('.','').replace('/','').replace('-','').replace(' ','');
				
				var ereg = new RegExp(/^[0-9]{8,9}$/)
				return ereg.test(telefon);
			}
			
			jQuery.validator.addMethod("telefon_mvl_chi", function(value, element) {
				return this.optional(element) || comprovatelefonmvlchi(value);
			});
			
			function isInteger(s){
				var i;
				for (i = 0; i < s.length; i++){   
					// Check that current character is number.
					var c = s.charAt(i);
					if (((c < "0") || (c > "9"))) return false;
				}
				// All characters are numbers.
				return true;
			}
			function stripCharsInBag(s, bag){
				var i;
				var returnString = "";
				// Search through string's characters one by one.
				// If character is not in bag, append to returnString.
				for (i = 0; i < s.length; i++){   
					var c = s.charAt(i);
					if (bag.indexOf(c) == -1) returnString += c;
				}
				return returnString;
			}
			function daysInFebruary (year){
				// February has 29 days in any year evenly divisible by four,
				// EXCEPT for centurial years which are not also divisible by 400.
				return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
			}
			function DaysArray(n) {
				for (var i = 1; i <= n; i++) {
					this[i] = 31
					if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
					if (i==2) {this[i] = 29}
			   } 
			   return this
			}
			
			function isDate(dtStr){
				var dtCh = '/';
				var minYear = 1900;
				var maxYear = 2100;
				var daysInMonth = DaysArray(12)
				var pos1=dtStr.indexOf(dtCh)
				var pos2=dtStr.indexOf(dtCh,pos1+1)
				var strDay=dtStr.substring(0,pos1)
				var strMonth=dtStr.substring(pos1+1,pos2)
				var strYear=dtStr.substring(pos2+1)
				strYr=strYear
				if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
				if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
				for (var i = 1; i <= 3; i++) {
					if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
				}
				month=parseInt(strMonth)
				day=parseInt(strDay)
				year=parseInt(strYr)
				if (pos1==-1 || pos2==-1){
					//alert("The date format should be : dd/mm/yyyy")
					return false
				}
				if (strMonth.length<1 || month<1 || month>12){
					//alert("Please enter a valid month")
					return false
				}
				if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
					//alert("Please enter a valid day")
					return false
				}
				if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
				//if (strYear.length != 4 || year==0 ){
					//alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear)
					return false
				}
				if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
					//alert("Please enter a valid date")
					return false
				}
			return true
			}

			jQuery.validator.addMethod("data", function(value, element) {
				//return this.optional(element) || /^(?:(?:(?:0?[1-9]|1\d|2[0-8])\/(?:0?[1-9]|1[0-2]))\/(?:(?:1[6-9]|[2-9]\d)\d{2}))$|^(?:(?:(?:31\/0?[13578]|1[02])|(?:(?:29|30)\/(?:0?[1,3-9]|1[0-2])))\/(?:(?:1[6-9]|[2-9]\d)\d{2}))$|^(?:29\/0?2\/(?:(?:(?:1[6-9]|[2-9]\d)(?:0[48]|[2468][048]|[13579][26]))))$/.test(value);
				if(value == "__/__/____")element.value="";
				return this.optional(element) || isDate(value);				
			});
			
			function comprovarut(value){
				if(value.length < 8 || value.length > 10) return false;
				if(value.lastIndexOf('-') != -1 && value.lastIndexOf('-') != value.length-2) return false; 

				value = value.replace('-', '').replace(' ', '').replace('/', '').toUpperCase();
				numero = value.substr(0,value.length-1);
				digitcomprovacio = value.substr(value.length-1,1);
				
				var mult = 2;
				var suma = 0;
				var resultat;
				for(var i = numero.length - 1; i >= 0; i--){
					if(mult > 7) mult = 2;
					suma += mult * numero.substr(i, 1);
					mult++;					
				}
				
				resultat = 11 - (suma % 11);
				if(resultat == 11){
					resultat = "0";
				}else if(resultat == 10){
					resultat = "K";
				}
				
				//alert (resultat);
				return resultat == digitcomprovacio;
			}
			
			jQuery.validator.addMethod("rut", function(value, element) {
				return this.optional(element) || comprovarut(value);
			});
			
			function comprovastring(value){
				
				var ereg = new RegExp(/[0-9]+/)
				if(ereg.test(value)) return false;
				
				var ereg = new RegExp(/^[-,\.;\\\'\/áàâãäªÁÀÄéèêëÉÈÊËíìîïÍÌÎÏòóôõöºÓÒÔÕÖúùûüÚÙÛÜçÇÑñ\w ]+$/)
				if(!ereg.test(value)) return false;
				
				return true;
			}
			
			jQuery.validator.addMethod("string", function(value, element) {
				return this.optional(element) || comprovastring(value);
			});
			
			
			function comprovastring_especial(value){
				var ereg = new RegExp(/^[a-zA-Z\'\-,áàâãäªÁÀÄéèêëÉÈÊËíìîïÍÌÎÏòóôõöºÓÒÔÕÖúùûüÚÙÛÜçÇÑñ ]+$/);
				if(!ereg.test(value)) return false;
				return true;
			}
			
			jQuery.validator.addMethod("string_especial", function(value, element) {
				return this.optional(element) || comprovastring_especial(value);
			});
			
			function comprovadatahora(value){
				var data;
				var hora;
				data = value.substring(0, 10);
				
				data = data.substring(8,10) + '/' + data.substring(5,7) + '/' + data.substring(0,4);
				hora = value.substring(11);
				return isDate(data) && esHora(hora);	
			}
			
			function esHora(valor){
				var hora;
				var minut;
				var segon;
				hora = valor.substring(0,2);
				minut = valor.substring(3,5);
				if(hora < 0 || hora > 23) return false;
				if(minut < 0 || minut > 59) return false;				
				return true;
			}
			
			jQuery.validator.addMethod("datahora", function(value, element) {
				if(value == "____-__-__ __:__")element.value="";
				return this.optional(element) || comprovadatahora(value);
			});
			
			function comprovaLlistaEmails(value){
				var retorn = true;
				var emails = value.split(',');
				for (var i = 0; i < emails.length; i++){
					retorn = retorn && /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(emails[i]);
				}
				return retorn;
				
			}
			
			jQuery.validator.addMethod("llistaemails", function(value, element) {
				return this.optional(element) || comprovaLlistaEmails(value);
			});
			
			function comprovamovil(value){
				value = value.replace('.','').replace('/','').replace('-','').replace(' ','');
				var ereg = new RegExp(/^(34|)(6|7){1}[0-9]{8}$/);
				if(!ereg.test(value)) return false;
				return true;
			}
			
			jQuery.validator.addMethod("movil", function(value, element) {
				return this.optional(element) || comprovamovil(value);
			});