/*
validationAide (v1.6.0)
(Edited 20080916)
Copyright 2007 Ste Brennan (dnaide.com). Licensed under the MIT (MIT-LICENSE.txt)
*/

eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('d.W(h.V,{U:6(f){7 3.e(0,f)},T:6(f){7 3.e((3.9-f),3.9)},S:6(c,a){4(!c){c=0};4(!a||a>3.9){a=3.9};4(a!=3.9){a=c+a};7 3.e(c,a)},R:6(n,y){5 2=3;m(2.Q(n)>-1){2=2.k(n,y)}7 2},P:6(){5 2=3;2=3.x();7 2.w()},x:6(){5 2=3;m(2.l(0)==" "){2=2.k(2.l(0),"")}7 2},w:6(){5 2=3;m(2.l((2.9-1))==" "){2=2.e(0,2.9-1)}7 2},O:6(){5 v=j N(\'\\\\s{1,}\',\'M\');7 3.k(v,\'\')}});d.L.K=6(J){5 2=j h();4(3.9>0){5 8=3[0];5 b=j h(8.b);5 t=8.I;4(t=="H"||t=="G"){4(b==""){4(8.u)2=8.r}g{d("F[@b="+b+"]").E(6(){4(3.u){4(2!="")2+=",";2+=3.r}})}}g 4(t=="q-D"||t=="q-C"){B(5 i=0;i<8.9;i++){4(8.p[i].A){4(2!="")2+=",";2+=8.p[i].o}}}g{2=8.o}}7 d.z(2)};',59,59,'||retval|this|if|var|function|return|elm|length|end|name|start|jQuery|substring|characterCount|else|String||new|replace|charAt|while|replaceThis|value|options|select|id|||checked|exp|TrimEnd|TrimStart|replaceWith|trim|selected|for|multiple|one|each|input|radio|checkbox|type|successful|fieldStringVal|fn|gi|RegExp|RemoveAllWhitespace|Trim|indexOf|Replace|Mid|Right|Left|prototype|extend'.split('|'),0,{}))
function ValidatorRule (name, errorMessage, validationMethod){this.validationMethod = validationMethod; this.errorMessage = errorMessage ? errorMessage : 'Validation failed.'; 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('validate-required', 'This is required.', function(fieldValue, fieldObj){
			if (fieldValue == "") return false;
			return true;
		});
		rules.add('required', 'This is required.', function(fieldValue, fieldObj){
			if (fieldValue == "") return false;
			return true;
		});
		rules.add('validate-alphanum', 'Please use only letters (a-z) or numbers (0-9) only in this field. No spaces or other characters are allowed.', function(fieldValue, fieldObj){
			if (fieldValue == "") return true;
			return !/\W/.test(fieldValue);
		});
		rules.add('validate-date-ddmmyyyy', 'Please use this date format: dd/mm/yyyy.', function(fieldValue, fieldObj){
			if (fieldValue == "") return true;
			var regex = /^(\d{1,2})\/(\d{1,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('validate-date-mmddyyyy', 'Please use this date format: mm/dd/yyyy.', function(fieldValue, fieldObj){
			if (fieldValue == "") return true;
			var regex = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
			if(!regex.test(fieldValue)) return false;
			var d = new Date(fieldValue.replace(regex, '$1/$2/$3'));
			return	(parseInt(RegExp.$1, 10) == (1+d.getMonth())) && 
				(parseInt(RegExp.$2, 10) == d.getDate()) && 
				(parseInt(RegExp.$3, 10) == d.getFullYear());
		});
		rules.add('validate-digits', 'Please use numbers only in this field. Please avoid spaces or other characters such as dots or commas.', function(fieldValue, fieldObj){
			if (fieldValue == "") return true;
			return !/[^\d]/.test(fieldValue);
		});
		rules.add('validate-email', 'Please enter a valid email address. For example: name@domain.com', function(fieldValue, fieldObj){
			if (fieldValue == "") return true;
			return /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(fieldValue);
		});
		rules.add('validate-number', 'Please enter a valid number.', function(fieldValue, fieldObj){
			if (fieldValue == "") return true;
			return (!isNaN(fieldValue) && !/^\s+$/.test(fieldValue));
		});
		rules.add('validate-phone', 'Please enter a valid phone number. For example: (123) 456-7890 or 123-456-7890', function(fieldValue, fieldObj){
			if (fieldValue == "") return true;
			return /^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/.test(fieldValue);
		});
		rules.add('validate-url', 'Please enter a valid URL starting with "http://"', 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('validate-zip', 'Please enter a valid zip code. For example: "12345" or "12345-6789"', function(fieldValue, fieldObj){
			if (fieldValue == "") return true;
			return /^\d{5}([\-]\d{4})?$/.test(fieldValue);
		});
		return rules;
	},
	extendOptions : function(options){
		var retval = jQuery.extend({}, options || {});
		if (typeof retval.showInlineMessages == 'undefined') retval.showInlineMessage = false;
		if (typeof retval.inlineShowSpeed == 'undefined') retval.inlineShowSpeed = "";
		if (typeof retval.inlineMessageElementIdPrefix == 'undefined') retval.inlineMessageElementIdPrefix = "validation-advice-";
		if (typeof retval.inlineMessageCssClass == 'undefined') retval.inlineMessageCssClass = "validation-advice";
		if (typeof retval.inlineFieldMessageFormat == 'undefined') retval.inlineFieldMessageFormat = "##MESSAGE##";
		if (typeof retval.showSummary == 'undefined') retval.showSummary = true;
		if (typeof retval.summaryElementId == 'undefined') retval.summaryElementId = "validation-summary";
		if (typeof retval.summaryMessage == 'undefined') retval.summaryMessage = "<p>Please correct the following:</p>";
		if (typeof retval.summaryFieldMessageFormat == 'undefined') retval.summaryFieldMessageFormat = "##FIELD##";
		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("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;
									var messageForInline = new String(fullOptions.inlineFieldMessageFormat);
									messageForInline = messageForInline.replace("##FIELD##", fieldFriendlyName);
									messageForInline = messageForInline.replace("##MESSAGE##", fieldMessage);
									jQueryElm.after('<div id="' + inlineMessageElementId + '" class="' + fullOptions.inlineMessageCssClass + '">' + messageForInline + '</div>');
									if (fullOptions.inlineShowSpeed != ""){jQuery("#" + inlineMessageElementId).hide().fadeIn(fullOptions.inlineShowSpeed);}
								}
								break;
							}
						}
					}
				}
			}
		});
		if (!validatedOK && fullOptions.showSummary){
			var summaryHtml = "";
			if (fullOptions.summaryMessage != ""){summaryHtml = fullOptions.summaryMessage;}
			summaryHtml += "<ul>";
			for(var i=0;i<messagesForSummary.length; i++){summaryHtml += "<li><label for=\"" + fieldsForSummary[i] + "\">" + messagesForSummary[i] + "</label></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;};