			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";
				}
				
				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;
				
				if(!/^(([0-9]{1,4})|[0-9]{1,2}\:[0-9]{2})$/.test(valor)) return false;
				valor = valor.replace(':', '').substring(0,4);
				if(valor.length < 3){
					valor = valor + '00';
				}
				valor = '0000' + valor;
				hora = valor.substring(valor.length - 4, valor.length - 2);
				minut = valor.substring(valor.length - 2, valor.length);
				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);
			});
			
			jQuery.validator.addMethod("importdec", function(value, element) {
				return this.optional(element) || /^[0-9]+([,\.]([0-9]{1,2})?)?$/.test(value);
			});
			
			jQuery.validator.addMethod("importdecn", function(value, element) {
				return this.optional(element) || /^[+-]?[0-9]+([,\.]([0-9]{1,2})?)?$/.test(value);
			});
			
			jQuery.validator.addMethod("importenter", function(value, element) {
				return this.optional(element) || /^[0-9]+$/.test(value);
			});
			
			jQuery.validator.addMethod("importentern", function(value, element) {
				return this.optional(element) || /^[+-]?[0-9]+$/.test(value);
			});
			
			jQuery.validator.addMethod("hora", function(value, element) {
				return this.optional(element) || esHora(value);
			});
			
			jQuery.validator.addMethod("datacontrol", function(value, element) {
				value = DonaDataSegonsValor(value);
				return this.optional(element) || isDate(value);				
			});
			
			jQuery.validator.addMethod("rangdata", function(value, element, param) {
				value = DonaDataSegonsValor(value);
				var okMinim = true;
				var okMaxim = true;				
				if(isDate(param[0]) && isDate(value)){
					if(CompararDates(value, param[0]) < 0){
						okMinim = false;
					}
				}
				if(isDate(param[1]) && isDate(value)){
					if(CompararDates(value, param[1]) > 0){
						okMaxim = false;
					}
				}
				return this.optional(element) || (okMinim && okMaxim);
			});
			
			function Formatejar(valor, num){
				valor = Array(num).join('0') + valor;
				var iLen = valor.length;
				return valor.substring(iLen, iLen - num);
			}
			
			function CompararDates(data1, data2){
				d1 = new Date(StrToData(data1));
				d2 = new Date(StrToData(data2));
				return d1 - d2;
			}
			
			function StrToData(str){
				var retorn=new Date();
				valors = str.split(/[\/]/);
				retorn.setFullYear(parseInt(valors[2], 10), parseInt(valors[1], 10) - 1,parseInt(valors[0], 10));
				return retorn;
			}
			
			function DonaDataSegonsValor(value){
				var lngDia;
				var lngMes;
				var lngAny;
				
				var currentTime = new Date();
				
				lngDia = '';
				lngMes = currentTime.getMonth() + 1;
				lngAny = currentTime.getFullYear()

				if(/^[0-9]{1,2}$/.test(value)){
					lngDia = parseInt(value, 10);
					if(lngDia < currentTime.getDate()){
						currentTime.setMonth(currentTime.getMonth() + 1 );
						
						lngMes = currentTime.getMonth() + 1;
						lngAny = currentTime.getFullYear()
					}
				}
				
				if(/^[0-9]{1,2}[\-\/][0-9]{1,2}$/.test(value)){
					valors = value.split(/[\-\/]/);
					lngDia = parseInt(valors[0], 10);
					lngMes = parseInt(valors[1], 10);
				}
				
				if(/^[0-9]{4}$/.test(value)){
					lngDia = parseInt(value.substring(0, 2), 10);
					lngMes = parseInt(value.substring(2, 4), 10);
				}
				
				if(/^[0-9]{1,2}[\-\/][0-9]{1,2}[\-\/][0-9]{2}$/.test(value)){
					valors = value.split(/[\-\/]/);
					lngDia = parseInt(valors[0], 10);
					lngMes = parseInt(valors[1], 10);
					lngAny = parseInt('20' + valors[2], 10);
				}
				
				if(/^[0-9]{1,2}[\-\/][0-9]{1,2}[\-\/][0-9]{4}$/.test(value)){
					valors = value.split(/[\-\/]/);
					lngDia = parseInt(valors[0], 10);
					lngMes = parseInt(valors[1], 10);
					lngAny = parseInt(valors[2], 10);
				}
				
				if(/^[0-9]{6}$/.test(value)){
					lngDia = parseInt(value.substring(0, 2), 10);
					lngMes = parseInt(value.substring(2, 4), 10);
					lngAny = parseInt('20' + value.substring(4, 6), 10);
				}				
				
				if(/^[0-9]{8}$/.test(value)){
					lngDia = parseInt(value.substring(0, 2), 10);
					lngMes = parseInt(value.substring(2, 4), 10);					
					lngAny = parseInt(value.substring(4, 8), 10);
				}
				if(lngDia != ''){
					value = Formatejar(lngDia, 2) + '/' + Formatejar(lngMes, 2) + '/' + Formatejar(lngAny, 4);
				}
				return value;
			}
			
			jQuery.fn.SetValor = function(valor)
			{
				var processat = false;
				if(jQuery(this).hasClass('TextBoxMonedaDecimal')){
					processat = true;
					SetValorMonedaDecimal(jQuery(this), valor);
				}
				if(jQuery(this).hasClass('TextBoxMonedaEnter')){
					processat = true;
					SetValorMonedaNoDecimal(jQuery(this), valor);
				}
				if(jQuery(this).hasClass('ComboBox')){
					processat = true;
					SetValorComboBox(jQuery(this), valor);
				}
				if(!processat) alert('SET VALOR: No implementado');
				return this;
			}
			
			jQuery.fn.GetValor = function()
			{
				if(jQuery(this).hasClass('TextBoxMonedaDecimal')){
					return GetValorMonedaDecimal(jQuery(this));
				}
				if(jQuery(this).hasClass('TextBoxMonedaEnter')){
					return GetValorMonedaNoDecimal(jQuery(this));
				}
				if(jQuery(this).hasClass('ComboBox')){
					processat = true;
					return GetValorComboBox(jQuery(this));
				}
				alert('GET VALOR: No implementado');
				return '';
			}