function ValidatorRule(name,errorMessage,validationMethod){
		this.validationMethod=validationMethod;
		this.errorMessage=errorMessage?errorMessage:'La comprobación ha fallado.';
		this.name=name
};

ValidatorRule.prototype={
	doValidation:function(fieldValue,fieldObj){
	return this.validationMethod(fieldValue,fieldObj)
	}
};
function ValidatorRuleCollection(){
		this.items={}
};
ValidatorRuleCollection.prototype={
	add:function(name,errorMessage,testFunction){
		this.items[name]=new ValidatorRule(name,errorMessage,testFunction)
	}
};
jQuery.validationAide={
		getDefaultValidationRules:function(){

			var rules=new ValidatorRuleCollection();
			
			rules.add('validator-required','Campo obligatorio',function(fieldValue,fieldObj){
				if(fieldValue=="")return false;
				return true;
			});
			rules.add('validator-email','Cuenta de correo incorrecta',function(fieldValue,fieldObj){
				if(fieldValue=="")return true;
				return/\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(fieldValue)
			});
			rules.add('validator-number','Número incorrecto.',function(fieldValue,fieldObj){
				if(fieldValue=="")return true;
				if(fieldValue.indexOf(".")!=-1) return false; //esto en el caso de que escriben "."
				if(fieldValue.indexOf(",")!=-1) fieldValue = fieldValue.replace(',','.');
				return(!isNaN(fieldValue)&&!/^\s+$/.test(fieldValue));
			});
			rules.add('validator-digits','Sólo numeros (0-9) permitidos',function(fieldValue,fieldObj){
				if(fieldValue=="")return true;
				return!/[^\d]/.test(fieldValue);
			});
			rules.add('validator-alphanum','Solo letras (a-z) o numeros (0-9) permitidos',function(fieldValue,fieldObj){
				if(fieldValue=="")return true;
				return!/\W/.test(fieldValue);
			});
			rules.add('validator-date-ddmmyyyy','Fecha incorrecta, tiene que ser [dd/mm/yyyy]',function(fieldValue,fieldObj){
				if(fieldValue=="")return true;
				var regex=/^(\d{2})\/(\d{2})\/(\d{4})$/;
				if(!regex.test(fieldValue))return false;
				var d=new Date(fieldValue.replace(regex,'$2/$1/$3'));
				return(parseInt(RegExp.$2,10)==(1+d.getMonth()))&&(parseInt(RegExp.$1,10)==d.getDate())&&(parseInt(RegExp.$3,10)==d.getFullYear())
			});
			rules.add('validator-date-mmddyyyy','Fecha incorrecta, tiene que ser [mm/dd/yyyy]',function(fieldValue,fieldObj){
				if(fieldValue=="")return true;
				var regex=/^(\d{2})\/(\d{2})\/(\d{4})$/;
				if(!regex.test(fieldValue))return false;
				var d=new Date(fieldValue.replace(regex,'$2/$1/$3'));
				return(parseInt(RegExp.$1,10)==(1+d.getMonth()))&&(parseInt(RegExp.$2,10)==d.getDate())&&(parseInt(RegExp.$3,10)==d.getFullYear())
			});
			rules.add('validator-url','URL incorrecta.',function(fieldValue,fieldObj){
				if(fieldValue=="")return true;
				return/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(fieldValue);
			});
			rules.add('validator-file-pdf','El Documento seleccionado tiene que ser del tipo PDF.',function(fieldValue,fieldObj){
				if(fieldValue=="")return true;
				var fileext = fieldValue.substr(fieldValue.length - 3).toUpperCase();
				if(fileext == 'PDF') return true;
				else return false;
			});
			rules.add('validator-file-pdfzip','El Documento seleccionado tiene que ser del tipo PDF ó ZIP.',function(fieldValue,fieldObj){
				if(fieldValue=="")return true;
				var fileext = fieldValue.substr(fieldValue.length - 3).toUpperCase();
				if(fileext == 'PDF' || fileext == 'ZIP') return true;
				else return false;
			});
			
			return rules;
		},extendOptions:function(options){
			var retval=jQuery.extend({},options||{});
			if(typeof retval.showInlineMessages=='undefined')retval.showInlineMessages=false;
			if(typeof retval.inlineShowSpeed=='undefined')retval.inlineShowSpeed="";
			if(typeof retval.inlineMessageElementIdPrefix=='undefined')retval.inlineMessageElementIdPrefix="ValidationInlineErrorMessage-";
			if(typeof retval.inlineMessageCssClass=='undefined')retval.inlineMessageCssClass="validation-inline-error-message";
			if(typeof retval.showSummary=='undefined')retval.showSummary=true;
			if(typeof retval.summaryElementId=='undefined')retval.summaryElementId="form-msg-ko";
			if(typeof retval.summaryMessage=='undefined')retval.summaryMessage="Por favor, rellene los campos siguientes:";
			if(typeof retval.summaryFieldMessageFormat=='undefined')retval.summaryFieldMessageFormat="##FIELD## - ##MESSAGE##";
			if(typeof retval.fieldErrorCssClass=='undefined')retval.fieldErrorCssClass="validation-failed";
			if(typeof retval.fieldMessageSeparator=='undefined')retval.fieldMessageSeparator=' - ';
			return retval;
		},resetForm:function(formId,options){
			if(typeof jQuery.fn.fieldStringVal!="function"){
				alert("Warning, validation will not work unless stringaide is loaded!");
			}
			var fullOptions=jQuery.validationAide.extendOptions(options);
			if(fullOptions.showSummary){
				jQuery("#"+fullOptions.summaryElementId).html("").hide();
			}
			jQuery(formId+" :input").each(function(){
				var inlineMessageElementId="#"+fullOptions.inlineMessageElementIdPrefix+this.id;
				jQuery(inlineMessageElementId).remove();
				jQuery(this).removeClass(fullOptions.fieldErrorCssClass);
			});
		},validateForm:function(formId,validationRules,options,preFieldValidation,postFieldValidation){
			jQuery.validationAide.resetForm(formId,options);
			var fullOptions=jQuery.validationAide.extendOptions(options);
			var validatedOK=true;
			validationRules=validationRules?validationRules:jQuery.validationAide.getDefaultValidationRules();
			var scrollTo="";
			var focusField="";
			var firstErroredField=true;
			if(fullOptions.showSummary){var messagesForSummary=new Array();
				var fieldsForSummary=new Array();
			}
			jQuery(formId+" :input").each(function(){
				var elmId=this.id;if(elmId!=""){
					var jQueryElm=jQuery(this);
					var cssClassesStr=new String(jQueryElm.attr("class"));
					cssClassesStr=jQuery.trim(cssClassesStr);
					if(cssClassesStr.length>0){
						var cssClasses=cssClassesStr.split(" ");
						for(var i=0;i<cssClasses.length;i++){
							var validationRule=validationRules.items[cssClasses[i]];
							if(validationRule){
								var fieldValue=jQueryElm.fieldStringVal();
								if(typeof preFieldValidation=='function')preFieldValidation(fieldValue,this);
								var retval=validationRule.doValidation(fieldValue,this);
								if(typeof postFieldValidation=='function')postFieldValidation(fieldValue,this,retval);
								if(!retval){validatedOK=false;if(firstErroredField){scrollTo=elmId;focusField=elmId;
								firstErroredField=false;
							}
							jQueryElm.addClass(fullOptions.fieldErrorCssClass);
							var title=jQueryElm.attr("title");
							if(!title||title=='undefined'){
								if(!title||title=='undefined')title=elmId;
							}
							var fieldFriendlyName=title;
							var fieldMessage=validationRule.errorMessage;
							if(fieldFriendlyName.indexOf(fullOptions.fieldMessageSeparator)>-1){
								var messageArr=fieldFriendlyName.split(fullOptions.fieldMessageSeparator);
								fieldFriendlyName=messageArr[0];
								fieldMessage=messageArr[1];
							}
							if(fullOptions.showSummary){
								fieldsForSummary.push(elmId);
								var messageForSummary=new String(fullOptions.summaryFieldMessageFormat);
								messageForSummary=messageForSummary.replace("##FIELD##",fieldFriendlyName);
								messageForSummary=messageForSummary.replace("##MESSAGE##",fieldMessage);
								messagesForSummary.push(messageForSummary);
							}
							if(fullOptions.showInlineMessages){
								var inlineMessageElementId=fullOptions.inlineMessageElementIdPrefix+elmId;
								jQueryElm.after('<div id="'+inlineMessageElementId+'" class="'+fullOptions.inlineMessageCssClass+'">'+fieldMessage+'</div>');
								if(fullOptions.inlineShowSpeed!=""){
									jQuery("#"+inlineMessageElementId).hide();
									jQuery("#"+inlineMessageElementId).show(fullOptions.inlineShowSpeed);
								}
							}
							break;
						}
					}
				}
			}
		}
	});
	if(!validatedOK&&fullOptions.showSummary){
		var summaryHtml="";
		if(fullOptions.summaryMessage!=""){
			summaryHtml=fullOptions.summaryMessage;
		}
		summaryHtml+="<ul id='requested_fields'>";
		for(var i=0;i<messagesForSummary.length;i++){
			summaryHtml+="<li><a href=\"#\" onclick=\"location.hash = '#"+fieldsForSummary[i]+"'; return false;\">"+messagesForSummary[i]+"</a></li>"
		}
		summaryHtml+="</ul>";
		jQuery("#"+fullOptions.summaryElementId).html(summaryHtml).show();
		scrollTo=fullOptions.summaryElementId}
		if(scrollTo!=""){
			location.hash="#"+scrollTo;
		}
		if(focusField!=""){
			//jQuery("#"+focusField)[0].focus();
		}
		return validatedOK;
	}
};

jQuery.fn.validationAideEnable=function(validationRules,options,preFieldValidation,postFieldValidation){
	jQuery.validationAide.resetForm("#"+this[0].id,options);
	this.unbind("submit");
	this.bind("submit",function(){
		return jQuery.validationAide.validateForm("#"+this.id,validationRules,options,preFieldValidation,postFieldValidation);
	});
	return this;
};

jQuery.fn.validationAideDisable=function(){
	this.unbind("submit");
	return this;
};

jQuery.fn.validationAideDisableOnClick=function(formId){
	this.unbind("click");
	this.bind("click",function(){
		jQuery(formId).unbind("submit")
	});
	return this;
};

jQuery.fn.validationAideEnableOnClick=function(formId,validationRules,options,preFieldValidation,postFieldValidation){
	jQuery.validationAide.resetForm(formId,options);
	this.unbind("click");
	this.bind("click",function(){
		jQuery(formId).validationAideEnable(validationRules,options,preFieldValidation,postFieldValidation);
	});
	return this;
};
/*
 // accion para el boton del formulario de un nuevo eje
 $j("input[name='Enviar']").click(function () {
	if($j.validationAide.validateForm("#NewEje")) {
		var grupo = document.NewEje.elements['Grupo'].value;
		var titulo = document.NewEje.elements['Titulo'].value;
		alert(grupo);
		$j.ajax({type:"POST",url:"10_1_4_new_eje.php",
			data:"grupo="+grupo+"&titulo="+titulo,
			async:false,
			success: function(msg){
				alert(msg);
				//$j("#form-msg-ok").fadeOut();
				//$j("#form-msg-ko").html('Ha ocurrido el siguiente error:"'+msg+'" <br />Por favor, intentélo de nuevo más tarde.');
				//$j("#form-msg-ko").slideDown();
			}
		 });
	}
 });
*/
jQuery.fn.limit = function(chars,counter) {
	this.keyup(function(){
		valor = this.value;
		if(valor.length > chars) {
			this.value = valor.substr(0,chars);
			jQuery.prompt('Solamente está permitido '+chars+' carácteres en este campo.');
			//alert('Solamente está permitido '+chars+' carácteres en este campo.');	
		}
		counting = (chars - this.value.length);
		jQuery('span.'+counter).text('('+counting+' carácteres disponibles)');
	})
}
