/*******************************************************************************
 * YAV - Yet Another Validator v2.0 * Copyright (C) 2005-2008 * Author: Federico
 * Crivellaro <f.crivellaro@gmail.com> * WWW: http://yav.sourceforge.net * *
 * This library is free software; you can redistribute it and/or * modify it
 * under the terms of the GNU Lesser General Public * License as published by
 * the Free Software Foundation; either * version 2.1 of the License, or (at
 * your option) any later version. * * This library is distributed in the hope
 * that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied
 * warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU * Lesser General Public License for more details. * * You should have
 * received a copy of the GNU Lesser General Public * License along with this
 * library; if not, write to the Free Software * Foundation, Inc.,59 Temple
 * Place,Suite 330,Boston,MA 02111-1307 USA * * last revision: 2 MAR 2008 *
 ******************************************************************************/

var yav = {

	// ------------------------------------------------------------ PUBLIC
	// FUNCTIONS
	undef : undefined,
	isFocusSet : undefined,
	internalRules : undefined,
	f : undefined,
	formEvt : undefined,
	fieldsEvt : new Array(),
	rulesEvt : new Array(),
	helpEvt : new Array(),
	mask : new Array(),
	onOKEvt : new Array(),
	onErrorEvt : new Array(),
	preValidationEvt : new Array(),
	filterByName : null,

	performCheck : function(formName, strRules, alertType, filterErrorsByName) {
		yav.filterByName = (filterErrorsByName) ? filterErrorsByName : null;
		for ( var j = 0; j < yav.preValidationEvt.length; j++) {
			if (yav.filterByName == yav.preValidationEvt[j].name) {
				var preValidationResult = eval(yav.preValidationEvt[j].fn);
				yav.preValidationEvt[j].executedWithSuccess = preValidationResult;
				if (!preValidationResult) {
					return preValidationResult;
				}
				break;
			}
		}
		yav.isFocusSet = false;
		var rules = yav.makeRules(strRules);
		yav.internalRules = yav.makeRules(strRules);
		yav.f = document.forms[formName];
		if (!yav.f) {
			yav.debug('DEBUG: could not find form object ' + formName);
			return null;
		}
		var errors = new Array();
		var ix = 0;
		if (rules.length) {
			for ( var i = 0; i < rules.length; i++) {
				var aRule = rules[i];
				if (aRule != null) {
					yav.highlight(yav.getField(yav.f, aRule.el),
							yav_config.inputclassnormal);
				}
			}
		} else {
			if (rules != null) {
				yav.highlight(yav.getField(yav.f, rules.el),
						yav_config.inputclassnormal);
			}
		}
		if (rules.length) {
			for ( var i = 0; i < rules.length; i++) {
				var aRule = rules[i];
				var anErr = null;
				if (aRule == null) {
					// do nothing
				} else if (aRule.ruleType == 'pre-condition'
						|| aRule.ruleType == 'post-condition'
						|| aRule.ruleType == 'andor-operator') {
					// do nothing
				} else if (aRule.ruleName == 'implies') {
					pre = aRule.el;
					post = aRule.comparisonValue;
					var oldClassName = yav.getField(yav.f, rules[pre].el).className;
					if (yav.filterByName != null) {
						if (rules[pre].el == yav.filterByName
								|| rules[post].el == yav.filterByName) {
							yav.clearInlineSpans(rules[pre].el, rules[post].el);
						}
					}
					if (yav.checkRule(yav.f, rules[pre]) == null
							&& yav.checkRule(yav.f, rules[post]) != null) {
						anErr = yav.deleteInline(aRule.alertMsg) + '__inline__'
								+ rules[post].el;
					} else if (yav.checkRule(yav.f, rules[pre]) != null) {
						yav.getField(yav.f, rules[pre].el).className = oldClassName;
					}
				} else if (aRule.ruleName == 'date_lt'
						|| aRule.ruleName == 'date_le') {
					if (yav.filterByName != null) {
						if (aRule.comparisonValue
								&& aRule.comparisonValue
										.indexOf('$' + yav.filterByName) == 0) {
							yav.clearInlineSpans(aRule.el, yav.filterByName);
						}
					}
					anErr = yav.checkRule(yav.f, aRule);
				} else {
					anErr = yav.checkRule(yav.f, aRule);
				}
				if (anErr != null) {
					if (yav.filterByName && yav.filterByName != null) {
						if (aRule.ruleName == 'implies') {
							if (rules[pre].el == yav.filterByName
									|| rules[post].el == yav.filterByName) {
								yav.clearInlineSpans(rules[pre].el,
										rules[post].el);
							}
							aRule = rules[aRule.comparisonValue];
						}
						// todo
						if (aRule.ruleName == 'or') {
							var tmp = aRule.comparisonValue.split('-');
							for ( var t = 0; t < tmp.length; t++) {
								yav.clearInlineSpans(rules[tmp[t]].el);
							}
							if (rules[aRule.el].el == yav.filterByName) {
								yav.clearInlineSpans(rules[aRule.el].el);
							}
							aRule = rules[aRule.el];
						}
						//
						if (aRule.el == yav.filterByName
								|| (aRule.comparisonValue && aRule.comparisonValue
										.indexOf('$' + yav.filterByName) == 0)) {
							for ( var z = 0; z < rules.length; z++) {
								if (rules[z].ruleName == 'implies'
										&& rules[rules[z].el].el == aRule.el) {
									yav
											.clearInlineSpans(rules[rules[z].comparisonValue].el);
								}
							}
							errors[ix] = anErr;
							ix++;
							break;
						}
					} else {
						errors[ix] = anErr;
						ix++;
					}
				}
			}// for
		} else {
			var myRule = rules;
			err = yav.checkRule(yav.f, myRule);
			if (err != null) {
				if (yav.filterByName && yav.filterByName != null) {
					if (myRule.el == yav.filterByName) {
						errors[0] = err;
					}
				} else {
					errors[0] = err;
				}
			}
		}
		var retval = yav.displayAlert(errors, alertType);
		yav.filterByName = null;
		return retval;
	},

	checkKeyPress : function(ev, obj, strRules) {
		var keyCode = null;
		keyCode = (typeof (ev.which)) != 'undefined' ? ev.which
				: window.event.keyCode;
		var rules = yav.makeRules(strRules);
		var keyAllowed = true;
		if (rules.length) {
			for ( var i = 0; i < rules.length; i++) {
				var aRule = rules[i];
				if (aRule.ruleName == 'keypress' && aRule.el == obj.name) {
					keyAllowed = yav.isKeyAllowed(keyCode,
							aRule.comparisonValue);
					break;
				}
			}
		} else {
			var aRule = rules;
			if (aRule.ruleName == 'keypress' && aRule.el == obj.name) {
				keyAllowed = yav.isKeyAllowed(keyCode, aRule.comparisonValue);
			}
		}
		if (!keyAllowed) {
			if (typeof (ev.which) == 'undefined') {
				window.event.keyCode = 0;
			} else {
				ev.preventDefault();
				ev.stopPropagation();
				ev.returnValue = false;
			}
		}
		return keyAllowed;
	},

	init : function(formName, strRules) {
		yav.addMask('alphabetic', null, null, yav_config.alphabetic_regex);
		yav.addMask('alphanumeric', null, null, yav_config.alphanumeric_regex);
		yav.addMask('alnumhyphen', null, null, yav_config.alnumhyphen_regex);
		yav
				.addMask('alnumhyphenat', null, null,
						yav_config.alnumhyphenat_regex);
		yav.addMask('alphaspace', null, null, yav_config.alphaspace_regex);
		yav.formEvt = formName;
		yav.rulesEvt = strRules;
		if (strRules.length) {
			for ( var i = 0; i < strRules.length; i++) {
				var aRule = yav.splitRule(strRules[i]);
				var elm = yav.getField(document.forms[formName], aRule.el);
				if (elm && aRule.ruleName == 'mask') {
					yav.addEvent(elm, 'keypress', yav.maskEvt
							.bindAsEventListener(elm));
				} else if (elm && !yav.inArray(yav.fieldsEvt, aRule.el)) {
					var eventAdded = false;
					for ( var j = 0; j < yav.onOKEvt.length; j++) {
						if (elm.name == yav.onOKEvt[j].name) {
							yav
									.addEvent(
											elm,
											yav.onOKEvt[j].evType,
											function() {
												if (yav.performEvt(this.name)) {
													yav
															.performOnOKEvt(this.name);
												} else {
													for ( var k = 0; k < yav.preValidationEvt.length; k++) {
														if (this.name == yav.preValidationEvt[k].name) {
															if (yav.preValidationEvt[k].executedWithSuccess == false) {
																yav.preValidationEvt[k].executedWithSuccess = null;
																return;
															}
															yav.preValidationEvt[k].executedWithSuccess = null;
															break;
														}
													}
													yav
															.performOnErrorEvt(this.name);
												}
											});
							eventAdded = true;
							break;
						}
					}
					if (!eventAdded) {
						for ( var j = 0; j < yav.onErrorEvt.length; j++) {
							if (elm.name == yav.onErrorEvt[j].name) {
								yav
										.addEvent(
												elm,
												yav.onErrorEvt[j].evType,
												function() {
													if (!yav
															.performEvt(this.name)) {
														for ( var k = 0; k < yav.preValidationEvt.length; k++) {
															if (this.name == yav.preValidationEvt[k].name) {
																if (yav.preValidationEvt[k].executedWithSuccess == false) {
																	yav.preValidationEvt[k].executedWithSuccess = null;
																	return;
																}
																yav.preValidationEvt[k].executedWithSuccess = null;
																break;
															}
														}
														yav
																.performOnErrorEvt(this.name);
													}
												});
								eventAdded = true;
								break;
							}
						}
					}
					yav.fieldsEvt.push(aRule.el);
					if (!eventAdded) {
						yav.addEvent(elm, 'blur', function() {
							yav.performEvt(this.name);
						});
					}
				}
			}
		} else {
			var rule = yav.splitRule(strRules);
			var elm = yav.getField(document.forms[formName], rule.el);
			if (elm && rule.ruleName == 'mask') {
				yav.addEvent(elm, 'keypress', yav.maskEvt
						.bindAsEventListener(elm));
			} else if (elm) {
				var eventAdded = false;
				for ( var j = 0; i < yav.onOKEvt.length; j++) {
					if (elm.name == yav.onOKEvt[i].name) {
						yav.addEvent(elm, yav.onOKEvt[j].evType, function() {
							if (yav.performEvt(this.name)) {
								yav.performOnOKEvt(this.name);
							}
						});
						eventAdded = true;
						break;
					}
				}
				for ( var j = 0; j < yav.onErrorEvt.length; j++) {
					if (elm.name == yav.onErrorEvt[j].name) {
						yav
								.addEvent(
										elm,
										yav.onErrorEvt[j].evType,
										function() {
											if (!yav.performEvt(this.name)) {
												for ( var k = 0; k < yav.preValidationEvt.length; k++) {
													if (this.name == yav.preValidationEvt[k].name) {
														if (yav.preValidationEvt[k].executedWithSuccess == false) {
															yav.preValidationEvt[k].executedWithSuccess = null;
															return;
														}
														yav.preValidationEvt[k].executedWithSuccess = null;
														break;
													}
												}
												yav
														.performOnErrorEvt(this.name);
											}
										});
						eventAdded = true;
						break;
					}
				}
				if (!eventAdded) {
					yav.addEvent(elm, 'blur', function() {
						yav.performEvt(this.name);
					});
				}
			}
		}
		if (yav.helpEvt.length > 0) {
			for ( var i = 0; i < yav.helpEvt.length; i++) {
				var elm = yav.getField(document.forms[formName],
						yav.helpEvt[i].name);
				if (elm) {
					if (elm.focus) {
						yav.addEvent(elm, 'focus', function() {
							yav.showHelpEvt(this.name);
						});
					} else {
						yav.addEvent(elm, 'click', function() {
							yav.showHelpEvt(this.name);
						});
					}
					if (!yav.inArray(yav.fieldsEvt, yav.helpEvt[i].name)) {
						yav.addEvent(elm, 'blur', function() {
							yav.cleanInline(this.name);
						});
					}
				}
			}
		}
	},

	displayMsg : function(name, msg, clazz) {
		var elm = yav.get(yav_config.errorsdiv + '_' + name);
		if (elm) {
			elm.innerHTML = msg;
			elm.className = clazz;
			elm.style.display = '';
		} else {
			elm = yav.get(yav_config.errorsdiv);
			if (elm) {
				elm.innerHTML = msg;
				elm.className = clazz;
				elm.style.display = '';
			} else {
				alert(msg);
			}
		}
	},

	cleanInline : function(name) {
		yav.get(yav_config.errorsdiv + '_' + name).innerHTML = '';
		yav.get(yav_config.errorsdiv + '_' + name).className = '';
		yav.get(yav_config.errorsdiv + '_' + name).style.display = 'none';
	},

	addHelp : function(name, helpMsg) {
		var elem = new Object();
		elem.name = name;
		elem.help = helpMsg;
		yav.helpEvt.push(elem);
	},

	addMask : function(name, format, charsAllowed, regex) {
		var elem = new Object();
		elem.name = name;
		elem.format = format;
		elem.charsAllowed = charsAllowed;
		elem.regex = regex ? regex : null;
		yav.mask.push(elem);
	},

	postValidation_OnOK : function(name, evType, fn) {
		var elem = new Object();
		elem.name = name;
		elem.evType = evType;
		elem.fn = fn;
		yav.onOKEvt.push(elem);
	},

	postValidation_OnError : function(name, evType, fn) {
		var elem = new Object();
		elem.name = name;
		elem.evType = evType;
		elem.fn = fn;
		yav.onErrorEvt.push(elem);
	},

	preValidation : function(fn, name) {
		var elem = new Object();
		elem.name = (name && name != null) ? name : null;
		elem.fn = fn;
		elem.executedWithSuccess = null;
		yav.preValidationEvt.push(elem);
	},

	// ------------------------------------------------------------ PRIVATE
	// FUNCTIONS

	inArray : function(arr, value) {
		var found = false;
		for ( var i = 0; i < arr.length; i++) {
			if (arr[i] == value) {
				found = true;
				break;
			}
		}
		return found;
	},

	performEvt : function(name) {
		var elm = yav.get(yav_config.errorsdiv);
		if (elm) {
			elm.innerHTML = '';
			elm.className = '';
			elm.style.display = 'none';
		}
		return yav.performCheck(yav.formEvt, yav.rulesEvt, 'inline', name);
	},

	performOnOKEvt : function(name) {
		for ( var j = 0; j < yav.onOKEvt.length; j++) {
			if (name == yav.onOKEvt[j].name) {
				eval(yav.onOKEvt[j].fn);
				break;
			}
		}
	},

	performOnErrorEvt : function(name) {
		for ( var j = 0; j < yav.onErrorEvt.length; j++) {
			if (name == yav.onErrorEvt[j].name) {
				eval(yav.onErrorEvt[j].fn);
				break;
			}
		}
	},

	showHelpEvt : function(name) {
		for ( var i = 0; i < yav.helpEvt.length; i++) {
			if (yav.helpEvt[i].name == name) {
				yav.get(yav_config.errorsdiv + '_' + name).innerHTML = yav.helpEvt[i].help;
				yav.get(yav_config.errorsdiv + '_' + name).className = yav_config.innerhelp;
				yav.get(yav_config.errorsdiv + '_' + name).style.display = '';
				break;
			}
		}
	},

	maskEvt : function(ev) {
		var mask = null;
		var myRule = null;
		for ( var i = 0; i < yav.rulesEvt.length; i++) {
			var aRule = yav.splitRule(yav.rulesEvt[i]);
			var elm = yav.getField(document.forms[yav.formEvt], aRule.el);
			if (elm && aRule.ruleName == 'mask' && elm.name == this.name) {
				for ( var j = 0; j < yav.mask.length; j++) {
					if (yav.mask[j].name == aRule.comparisonValue) {
						mask = yav.mask[j];
						break;
					}
				}
				myRule = aRule;
				break;
			}
		}
		var key = (typeof (ev.which)) != 'undefined' ? ev.which
				: window.event.keyCode;
		var ch = String.fromCharCode(key);
		var str = this.value + ch;
		var pos = str.length;
		if (key == 8 || key == 0) {
			return true;
		}
		var keyAllowed = false;
		if (mask == null) {
			if (yav.isKeyAllowed(key, myRule.comparisonValue)) {
				keyAllowed = true;
			} else {
				if (typeof (ev.which) == 'undefined') {
					window.event.keyCode = 0;
				} else {
					ev.preventDefault();
					ev.stopPropagation();
					ev.returnValue = false;
				}
			}
			return keyAllowed;
		} else if (mask.format == null) {
			reg = new RegExp(mask.regex);
			if (reg.test(ch)) {
				keyAllowed = true;
			} else {
				if (typeof (ev.which) == 'undefined') {
					window.event.keyCode = 0;
				} else {
					ev.preventDefault();
					ev.stopPropagation();
					ev.returnValue = false;
				}
			}
			return keyAllowed;
		} else if (yav.isKeyAllowed(key, mask.charsAllowed)
				&& pos <= mask.format.length) {
			if (mask.format.charAt(pos - 1) != ' ') {
				str = this.value + mask.format.charAt(pos - 1) + ch;
			}
			this.value = str;
			keyAllowed = true;
		}
		if (typeof (ev.which) == 'undefined') {
			window.event.keyCode = 0;
		} else {
			ev.preventDefault();
			ev.stopPropagation();
			ev.returnValue = false;
		}
		return keyAllowed;
	},

	displayAlert : function(messages, alertType) {
		var retval = null;
		yav.clearAllInlineSpans();
		if (alertType == 'classic') {
			retval = yav.displayClassic(messages);
		} else if (alertType == 'innerHtml') {
			retval = yav.displayInnerHtml(messages);
		} else if (alertType == 'inline') {
			retval = yav.displayInline(messages);
		} else if (alertType == 'jsVar') {
			retval = yav.displayJsVar(messages);
		} else {
			yav.debug('DEBUG: alert type ' + alertType + ' not supported');
		}
		return retval;
	},

	displayClassic : function(messages) {
		var str = '';
		if (messages != null && messages.length > 0) {
			if (yav.strTrim(yav_config.HEADER_MSG).length > 0) {
				str += yav_config.HEADER_MSG + '\n\n';
			}
			for ( var i = 0; i < messages.length; i++) {
				str += ' ' + yav.deleteInline(messages[i]) + '\n';
			}
			if (yav.strTrim(yav_config.FOOTER_MSG).length > 0) {
				str += '\n' + yav_config.FOOTER_MSG;
			}
			alert(str);
			return false;
		} else {
			return true;
		}
	},

	displayInnerHtml : function(messages) {
		if (messages != null && messages.length > 0) {
			var str = '';
			if (yav.strTrim(yav_config.HEADER_MSG).length > 0) {
				str += yav_config.HEADER_MSG;
			}
			str += '<ul>';
			for ( var i = 0; i < messages.length; i++) {
				str += '<li>' + yav.deleteInline(messages[i]) + '</li>';
			}
			str += '</ul>';
			if (yav.strTrim(yav_config.FOOTER_MSG).length > 0) {
				str += yav_config.FOOTER_MSG;
			}
			yav.get(yav_config.errorsdiv).innerHTML = str;
			yav.get(yav_config.errorsdiv).className = yav_config.innererror;
			yav.get(yav_config.errorsdiv).style.display = 'block';
			return false;
		} else {
			yav.get(yav_config.errorsdiv).innerHTML = '';
			yav.get(yav_config.errorsdiv).className = '';
			yav.get(yav_config.errorsdiv).style.display = 'none';
			return true;
		}
	},

	displayInline : function(messages) {
		if (messages != null && messages.length > 0) {
			var genericErrors = new Array();
			var genericErrIndex = 0;
			for ( var i = 0; i < messages.length; i++) {
				var elName = messages[i].substring(messages[i]
						.indexOf('__inline__') + 10);
				if (yav.get(yav_config.errorsdiv + '_' + elName)) {
					yav.get(yav_config.errorsdiv + '_' + elName).innerHTML = yav
							.deleteInline(messages[i]);
					yav.get(yav_config.errorsdiv + '_' + elName).className = yav_config.innererror;
					yav.get(yav_config.errorsdiv + '_' + elName).style.display = '';
				} else {
					genericErrors[genericErrIndex] = messages[i];
					genericErrIndex++;
				}
			}
			if (genericErrIndex > 0) {
				yav.displayInnerHtml(genericErrors);
			}
			return false;
		} else {
			return true;
		}
	},

	clearAllInlineSpans : function() {
		var allDivs = document.getElementsByTagName("span");
		for ( var j = 0; j < allDivs.length; j++) {
			var idName = allDivs[j].id;
			if (idName.indexOf(yav_config.errorsdiv + '_') == 0) {
				if (yav.filterByName != null) {
					if (idName == yav_config.errorsdiv + '_' + yav.filterByName) {
						yav.get(idName).innerHTML = '';
						yav.get(idName).className = '';
						yav.get(idName).style.display = 'none';
					}
				} else {
					yav.get(idName).innerHTML = '';
					yav.get(idName).className = '';
					yav.get(idName).style.display = 'none';
				}
			}
		}
	},

	clearInlineSpans : function() {
		var allDivs = document.getElementsByTagName("span");
		for ( var j = 0; j < allDivs.length; j++) {
			var idName = allDivs[j].id;
			if (idName.indexOf(yav_config.errorsdiv + '_') == 0) {
				for ( var k = 0; k < arguments.length; k++) {
					if (idName == yav_config.errorsdiv + '_' + arguments[k]) {
						yav.get(idName).innerHTML = '';
						yav.get(idName).className = '';
						yav.get(idName).style.display = 'none';
					}
				}
			}
		}
	},

	displayJsVar : function(messages) {
		yav.get(yav_config.errorsdiv).className = '';
		yav.get(yav_config.errorsdiv).style.display = 'none';
		if (messages != null && messages.length > 0) {
			for ( var i = 0; i < messages.length; i++) {
				messages[i] = yav.deleteInline(messages[i]);
			}
			var str = '';
			str += '<script>var jsErrors;</script>';
			yav.get(yav_config.errorsdiv).innerHTML = str;
			jsErrors = messages;
			return false;
		} else {
			yav.get(yav_config.errorsdiv).innerHTML = '<script>var jsErrors;</script>';
			return true;
		}
	},

	rule : function(el, ruleName, comparisonValue, alertMsg, ruleType) {
		var checkArguments = arguments.length >= 4 && arguments[0] != null
				&& arguments[1] != null;
		if (!checkArguments) {
			return false;
		}
		tmp = el.split(':');
		nameDisplayed = '';
		if (tmp.length == 2) {
			nameDisplayed = tmp[1];
			el = tmp[0];
		}
		this.el = el;
		this.nameDisplayed = nameDisplayed;
		this.ruleName = ruleName;
		this.comparisonValue = comparisonValue;
		this.ruleType = ruleType;
		if (alertMsg == yav.undef || alertMsg == null) {
			this.alertMsg = yav.getDefaultMessage(el, nameDisplayed, ruleName,
					comparisonValue)
					+ '__inline__' + this.el;
		} else {
			this.alertMsg = alertMsg + '__inline__' + this.el;
		}
	},

	checkRule : function(f, myRule) {
		retVal = null;
		if (myRule != null) {
			if (myRule.ruleName == 'custom') {
				var customFunction = null;
				if (myRule.comparisonValue != null) {
					customFunction = ' retVal = ' + myRule.comparisonValue;
				} else { // deprecated, maintained for back compatibility
					customFunction = ' retVal = ' + myRule.el;
				}
				retVal = eval(customFunction);
				if (myRule.comparisonValue != null && retVal != this.undef
						&& retVal != null) {
					retVal += '__inline__' + myRule.el;
				}
				if (retVal != null && myRule.comparisonValue != null) {
					yav.highlight(yav.getField(yav.f, myRule.el),
							yav_config.inputclasserror);
				}
			} else if (myRule.ruleName == 'and') {
				var op_1 = myRule.el;
				var op_next = myRule.comparisonValue;
				if (yav.checkRule(f, yav.internalRules[op_1]) != null) {
					retVal = myRule.alertMsg;
					if (myRule.ruleType == 'pre-condition'
							|| myRule.ruleType == 'andor-operator') {
						// yav.highlight(yav.getField(f,
						// yav.internalRules[op_1].el),
						// yav_config.inputclasserror);
					}
				} else {
					var op_k = op_next.split('-');
					for ( var k = 0; k < op_k.length; k++) {
						if (yav.checkRule(f, yav.internalRules[op_k[k]]) != null) {
							retVal = myRule.alertMsg;
							if (myRule.ruleType == 'pre-condition'
									|| myRule.ruleType == 'andor-operator') {
								// yav.highlight(yav.getField(f,
								// yav.internalRules[op_k[k]].el),
								// yav_config.inputclasserror);
							}
							break;
						}
					}
				}
			} else if (myRule.ruleName == 'or') {
				var op_1 = myRule.el;
				var op_next = myRule.comparisonValue;
				var success = false;
				if (yav.checkRule(f, yav.internalRules[op_1]) == null) {
					success = true;
				} else {
					if (myRule.ruleType == 'pre-condition'
							|| myRule.ruleType == 'andor-operator') {
						// yav.highlight(yav.getField(f,
						// yav.internalRules[op_1].el),
						// yav_config.inputclasserror);
					}
					var op_k = op_next.split('-');
					for ( var k = 0; k < op_k.length; k++) {
						if (yav.checkRule(f, yav.internalRules[op_k[k]]) == null) {
							success = true;
							break;
						} else {
							if (myRule.ruleType == 'pre-condition'
									|| myRule.ruleType == 'andor-operator') {
								// yav.highlight(yav.getField(f,
								// yav.internalRules[op_k[k]].el),
								// yav_config.inputclasserror);
							}
						}
					}
				}
				if (success) {
					yav.highlight(yav.getField(f, yav.internalRules[op_1].el),
							yav_config.inputclassnormal);
					var op_k = op_next.split('-');
					for ( var k = 0; k < op_k.length; k++) {
						yav.highlight(yav.getField(f,
								yav.internalRules[op_k[k]].el),
								yav_config.inputclassnormal);
					}
				} else {
					retVal = myRule.alertMsg;
				}
			} else {
				el = yav.getField(f, myRule.el);
				if (el == null) {
					yav.debug('DEBUG: could not find element ' + myRule.el);
					return null;
				}
				var err = null;
				if (el.type) {
					if (el.type == 'hidden' || el.type == 'text'
							|| el.type == 'password' || el.type == 'textarea') {
						err = yav.checkText(el, myRule);
					} else if (el.type == 'checkbox') {
						err = yav.checkCheckbox(el, myRule);
					} else if (el.type == 'select-one') {
						err = yav.checkSelOne(el, myRule);
					} else if (el.type == 'select-multiple') {
						err = yav.checkSelMul(el, myRule);
					} else if (el.type == 'radio') {
						err = yav.checkRadio(el, myRule);
					} else {
						yav.debug('DEBUG: type ' + el.type + ' not supported');
					}
				} else {
					err = yav.checkRadio(el, myRule);
				}
				retVal = err;
			}
		}
		return retVal;
	},

	checkRadio : function(el, myRule) {
		var err = null;
		if (myRule.ruleName == 'required') {
			var radios = el;
			var found = false;
			if (isNaN(radios.length) && radios.checked) {
				found = true;
			} else {
				for ( var j = 0; j < radios.length; j++) {
					if (radios[j].checked) {
						found = true;
						break;
					}
				}
			}
			if (!found) {
				yav.highlight(el, yav_config.inputclasserror);
				err = myRule.alertMsg;
			}
		} else if (myRule.ruleName == 'equal') {
			var radios = el;
			var found = false;
			if (isNaN(radios.length) && radios.checked) {
				if (radios.value == myRule.comparisonValue) {
					found = true;
				}
			} else {
				for ( var j = 0; j < radios.length; j++) {
					if (radios[j].checked) {
						if (radios[j].value == myRule.comparisonValue) {
							found = true;
							break;
						}
					}
				}
			}
			if (!found) {
				err = myRule.alertMsg;
			}
		} else if (myRule.ruleName == 'notequal') {
			var radios = el;
			var found = false;
			if (isNaN(radios.length) && radios.checked) {
				if (radios.value != myRule.comparisonValue) {
					found = true;
				}
			} else {
				for ( var j = 0; j < radios.length; j++) {
					if (radios[j].checked) {
						if (radios[j].value != myRule.comparisonValue) {
							found = true;
							break;
						}
					}
				}
			}
			if (!found) {
				err = myRule.alertMsg;
			}
		} else {
			yav
					.debug('DEBUG: rule ' + myRule.ruleName + ' not supported for radio');
		}
		return err;
	},

	checkText : function(el, myRule) {
		err = null;
		if (yav_config.trimenabled) {
			el.value = yav.strTrim(el.value);
		}
		if (myRule.ruleName == 'required') {
			if (el.value == null || el.value == '') {
				yav.highlight(el, yav_config.inputclasserror);
				err = myRule.alertMsg;
			}
		} else if (myRule.ruleName == 'equal') {
			err = yav.checkEqual(el, myRule);
		} else if (myRule.ruleName == 'notequal') {
			err = yav.checkNotEqual(el, myRule);
		} else if (myRule.ruleName == 'numeric') {
			reg = new RegExp("^[0-9]*$");
			if (!reg.test(el.value)) {
				yav.highlight(el, yav_config.inputclasserror);
				err = myRule.alertMsg;
			}
		} else if (myRule.ruleName == 'alphabetic') {
			reg = new RegExp(yav_config.alphabetic_regex);
			if (!reg.test(el.value)) {
				yav.highlight(el, yav_config.inputclasserror);
				err = myRule.alertMsg;
			}
		} else if (myRule.ruleName == 'alphanumeric') {
			reg = new RegExp(yav_config.alphanumeric_regex);
			if (!reg.test(el.value)) {
				yav.highlight(el, yav_config.inputclasserror);
				err = myRule.alertMsg;
			}
		} else if (myRule.ruleName == 'alnumhyphen') {
			reg = new RegExp(yav_config.alnumhyphen_regex);
			if (!reg.test(el.value)) {
				yav.highlight(el, yav_config.inputclasserror);
				err = myRule.alertMsg;
			}
		} else if (myRule.ruleName == 'alnumhyphenat') {
			reg = new RegExp(yav_config.alnumhyphenat_regex);
			if (!reg.test(el.value)) {
				yav.highlight(el, yav_config.inputclasserror);
				err = myRule.alertMsg;
			}
		} else if (myRule.ruleName == 'alphaspace') {
			reg = new RegExp(yav_config.alphaspace_regex);
			if (!reg.test(el.value)) {
				yav.highlight(el, yav_config.inputclasserror);
				err = myRule.alertMsg;
			}
		} else if (myRule.ruleName == 'email') {
			reg = new RegExp(yav_config.email_regex);
			if (!reg.test(el.value)) {
				yav.highlight(el, yav_config.inputclasserror);
				err = myRule.alertMsg;
			}
		} else if (myRule.ruleName == 'maxlength') {
			if (isNaN(myRule.comparisonValue)) {
				yav
						.debug('DEBUG: comparisonValue for rule ' + myRule.ruleName + ' not a number');
			} else if (el.value.length > myRule.comparisonValue) {
				yav.highlight(el, yav_config.inputclasserror);
				err = myRule.alertMsg;
			}
		} else if (myRule.ruleName == 'minlength') {
			if (isNaN(myRule.comparisonValue)) {
				yav
						.debug('DEBUG: comparisonValue for rule ' + myRule.ruleName + ' not a number');
			} else if (el.value.length < myRule.comparisonValue) {
				yav.highlight(el, yav_config.inputclasserror);
				err = myRule.alertMsg;
			}
		} else if (myRule.ruleName == 'numrange') {
			reg = new RegExp("^[-+]{0,1}[0-9]*[.]{0,1}[0-9]*$");
			if (!reg.test(yav.unformatNumber(el.value))) {
				yav.highlight(el, yav_config.inputclasserror);
				err = myRule.alertMsg;
			} else {
				regRange = new RegExp("^[0-9]+-[0-9]+$");
				if (!regRange.test(myRule.comparisonValue)) {
					yav
							.debug('DEBUG: comparisonValue for rule ' + myRule.ruleName + ' not in format number1-number2');
				} else {
					rangeVal = myRule.comparisonValue.split('-');
					if (eval(yav.unformatNumber(el.value)) < eval(rangeVal[0])
							|| eval(yav.unformatNumber(el.value)) > eval(rangeVal[1])) {
						yav.highlight(el, yav_config.inputclasserror);
						err = myRule.alertMsg;
					}
				}
			}
		} else if (myRule.ruleName == 'regexp') {
			reg = new RegExp(myRule.comparisonValue);
			if (!reg.test(el.value)) {
				yav.highlight(el, yav_config.inputclasserror);
				err = myRule.alertMsg;
			}
		} else if (myRule.ruleName == 'integer') {
			err = yav.checkInteger(el, myRule);
		} else if (myRule.ruleName == 'double') {
			err = yav.checkDouble(el, myRule);
		} else if (myRule.ruleName == 'date') {
			err = yav.checkDate(el, myRule);
		} else if (myRule.ruleName == 'date_lt') {
			err = yav.checkDateLessThan(el, myRule, false);
		} else if (myRule.ruleName == 'date_le') {
			err = yav.checkDateLessThan(el, myRule, true);
		} else if (myRule.ruleName == 'keypress') {
			// do nothing
		} else if (myRule.ruleName == 'empty') {
			if (el.value != null && el.value != '') {
				yav.highlight(el, yav_config.inputclasserror);
				err = myRule.alertMsg;
			}
		} else {
			yav.debug('DEBUG: rule ' + myRule.ruleName + ' not supported for '
					+ el.type);
		}
		return err;
	},

	checkInteger : function(el, myRule) {
		reg = new RegExp("^[-+]{0,1}[0-9]*$");
		if (!reg.test(el.value)) {
			yav.highlight(el, yav_config.inputclasserror);
			return myRule.alertMsg;
		}
	},

	checkDouble : function(el, myRule) {
		var sep = yav_config.DECIMAL_SEP;
		reg = new RegExp("^[-+]{0,1}[0-9]*[" + sep + "]{0,1}[0-9]*$");
		if (!reg.test(el.value)) {
			yav.highlight(el, yav_config.inputclasserror);
			return myRule.alertMsg;
		}
	},

	checkDate : function(el, myRule) {
		error = null;
		if (el.value != '') {
			var dateFormat = yav_config.DATE_FORMAT;
			ddReg = new RegExp("dd");
			MMReg = new RegExp("MM");
			yyyyReg = new RegExp("yyyy");
			if (!ddReg.test(dateFormat) || !MMReg.test(dateFormat)
					|| !yyyyReg.test(dateFormat)) {
				yav
						.debug('DEBUG: locale format ' + dateFormat + ' not supported');
			} else {
				ddStart = dateFormat.indexOf('dd');
				MMStart = dateFormat.indexOf('MM');
				yyyyStart = dateFormat.indexOf('yyyy');
			}
			strReg = dateFormat.replace('dd', '[0-9]{2}').replace('MM',
					'[0-9]{2}').replace('yyyy', '[0-9]{4}');
			reg = new RegExp("^" + strReg + "$");
			if (!reg.test(el.value)) {
				yav.highlight(el, yav_config.inputclasserror);
				error = myRule.alertMsg;
			} else {
				dd = el.value.substring(ddStart, ddStart + 2);
				MM = el.value.substring(MMStart, MMStart + 2);
				yyyy = el.value.substring(yyyyStart, yyyyStart + 4);
				if (!yav.checkddMMyyyy(dd, MM, yyyy)) {
					yav.highlight(el, yav_config.inputclasserror);
					error = myRule.alertMsg;
				}
			}
		}
		return error;
	},

	checkDateLessThan : function(el, myRule, isEqualAllowed) {
		error = null;
		var isDate = yav.checkDate(el, myRule) == null ? true : false;
		if (isDate && el.value != '') {
			var dateFormat = yav_config.DATE_FORMAT;
			ddStart = dateFormat.indexOf('dd');
			MMStart = dateFormat.indexOf('MM');
			yyyyStart = dateFormat.indexOf('yyyy');
			dd = el.value.substring(ddStart, ddStart + 2);
			MM = el.value.substring(MMStart, MMStart + 2);
			yyyy = el.value.substring(yyyyStart, yyyyStart + 4);
			myDate = "" + yyyy + MM + dd;
			strReg = dateFormat.replace('dd', '[0-9]{2}').replace('MM',
					'[0-9]{2}').replace('yyyy', '[0-9]{4}');
			reg = new RegExp("^" + strReg + "$");
			var isMeta = myRule.comparisonValue.indexOf('$') == 0 ? true
					: false;
			var comparisonDate = '';
			if (isMeta) {
				toSplit = myRule.comparisonValue.substr(1);
				tmp = toSplit.split(':');
				if (tmp.length == 2) {
					comparisonDate = yav.getField(yav.f, tmp[0]).value;
				} else {
					comparisonDate = yav.getField(yav.f, myRule.comparisonValue
							.substr(1)).value;
				}
			} else {
				comparisonDate = myRule.comparisonValue;
			}
			if (!reg.test(comparisonDate)) {
				yav.highlight(el, yav_config.inputclasserror);
				error = myRule.alertMsg;
			} else {
				cdd = comparisonDate.substring(ddStart, ddStart + 2);
				cMM = comparisonDate.substring(MMStart, MMStart + 2);
				cyyyy = comparisonDate.substring(yyyyStart, yyyyStart + 4);
				cDate = "" + cyyyy + cMM + cdd;
				if (isEqualAllowed) {
					if (!yav.checkddMMyyyy(cdd, cMM, cyyyy) || myDate > cDate) {
						yav.highlight(el, yav_config.inputclasserror);
						error = myRule.alertMsg;
					}
				} else {
					if (!yav.checkddMMyyyy(cdd, cMM, cyyyy) || myDate >= cDate) {
						yav.highlight(el, yav_config.inputclasserror);
						error = myRule.alertMsg;
					}
				}
			}
		} else {
			if (el.value != '') {
				yav.highlight(el, yav_config.inputclasserror);
				error = myRule.alertMsg;
			}
		}
		return error;
	},

	checkEqual : function(el, myRule) {
		error = null;
		var isMeta = myRule.comparisonValue.indexOf('$') == 0 ? true : false;
		var comparisonVal = '';
		if (isMeta) {
			toSplit = myRule.comparisonValue.substr(1);
			tmp = toSplit.split(':');
			if (tmp.length == 2) {
				comparisonVal = yav.getField(yav.f, tmp[0]).value;
			} else {
				comparisonVal = yav.getField(yav.f, myRule.comparisonValue
						.substr(1)).value;
			}
		} else {
			comparisonVal = myRule.comparisonValue;
		}
		if (el.value != comparisonVal) {
			yav.highlight(el, yav_config.inputclasserror);
			error = myRule.alertMsg;
		}
		return error;
	},

	checkNotEqual : function(el, myRule) {
		error = null;
		var isMeta = myRule.comparisonValue.indexOf('$') == 0 ? true : false;
		var comparisonVal = '';
		if (isMeta) {
			toSplit = myRule.comparisonValue.substr(1);
			tmp = toSplit.split(':');
			if (tmp.length == 2) {
				comparisonVal = yav.getField(yav.f, tmp[0]).value;
			} else {
				comparisonVal = yav.getField(yav.f, myRule.comparisonValue
						.substr(1)).value;
			}
		} else {
			comparisonVal = myRule.comparisonValue;
		}
		if (el.value == comparisonVal) {
			yav.highlight(el, yav_config.inputclasserror);
			error = myRule.alertMsg;
		}
		return error;
	},

	checkddMMyyyy : function(dd, MM, yyyy) {
		retVal = true;
		if ((dd < 1)
				|| (dd > 31)
				|| (MM < 1)
				|| (MM > 12)
				|| (dd == 31 && (MM == 2 || MM == 4 || MM == 6 || MM == 9 || MM == 11))
				|| (dd > 29 && MM == 2)
				|| (dd == 29 && (MM == 2) && ((yyyy % 4 > 0) || (yyyy % 4 == 0
						&& yyyy % 100 == 0 && yyyy % 400 > 0)))) {
			retVal = false;
		}
		return retVal;
	},

	checkCheckbox : function(el, myRule) {
		if (myRule.ruleName == 'required') {
			if (!el.checked) {
				yav.highlight(el, yav_config.inputclasserror);
				return myRule.alertMsg;
			}
		} else if (myRule.ruleName == 'equal') {
			if (!el.checked || el.value != myRule.comparisonValue) {
				yav.highlight(el, yav_config.inputclasserror);
				return myRule.alertMsg;
			}
		} else if (myRule.ruleName == 'notequal') {
			if (el.checked && el.value == myRule.comparisonValue) {
				yav.highlight(el, yav_config.inputclasserror);
				return myRule.alertMsg;
			}
		} else {
			yav.debug('DEBUG: rule ' + myRule.ruleName + ' not supported for '
					+ el.type);
		}
	},

	checkSelOne : function(el, myRule) {
		if (myRule.ruleName == 'required') {
			var found = false;
			var inx = el.selectedIndex;
			if (inx >= 0 && el.options[inx].value) {
				found = true;
			}
			if (!found) {
				yav.highlight(el, yav_config.inputclasserror);
				return myRule.alertMsg;
			}
		} else if (myRule.ruleName == 'equal') {
			var found = false;
			var inx = el.selectedIndex;
			if (inx >= 0 && el.options[inx].value == myRule.comparisonValue) {
				found = true;
			}
			if (!found) {
				yav.highlight(el, yav_config.inputclasserror);
				return myRule.alertMsg;
			}
		} else if (myRule.ruleName == 'notequal') {
			var found = false;
			var inx = el.selectedIndex;
			if (inx >= 0 && el.options[inx].value != myRule.comparisonValue) {
				found = true;
			}
			if (!found) {
				yav.highlight(el, yav_config.inputclasserror);
				return myRule.alertMsg;
			}
		} else {
			yav.debug('DEBUG: rule ' + myRule.ruleName + ' not supported for '
					+ el.type);
		}
	},

	checkSelMul : function(el, myRule) {
		if (myRule.ruleName == 'required') {
			var found = false;
			opts = el.options;
			for ( var i = 0; i < opts.length; i++) {
				if (opts[i].selected && opts[i].value) {
					found = true;
					break;
				}
			}
			if (!found) {
				yav.highlight(el, yav_config.inputclasserror);
				return myRule.alertMsg;
			}
		} else if (myRule.ruleName == 'equal') {
			var found = false;
			opts = el.options;
			for ( var i = 0; i < opts.length; i++) {
				if (opts[i].selected && opts[i].value == myRule.comparisonValue) {
					found = true;
					break;
				}
			}
			if (!found) {
				yav.highlight(el, yav_config.inputclasserror);
				return myRule.alertMsg;
			}
		} else if (myRule.ruleName == 'notequal') {
			var found = false;
			opts = el.options;
			for ( var i = 0; i < opts.length; i++) {
				if (opts[i].selected && opts[i].value != myRule.comparisonValue) {
					found = true;
					break;
				}
			}
			if (!found) {
				yav.highlight(el, yav_config.inputclasserror);
				return myRule.alertMsg;
			}
		} else {
			yav.debug('DEBUG: rule ' + myRule.ruleName + ' not supported for '
					+ el.type);
		}
	},

	debug : function(msg) {
		if (yav_config.debugmode) {
			alert(msg);
		}
	},

	strTrim : function(str) {
		return str.replace(/^\s+/, '').replace(/\s+$/, '');
	},

	makeRules : function(strRules) {
		var rules = new Array();
		if (strRules.length) {
			for ( var i = 0; i < strRules.length; i++) {
				rules[i] = yav.splitRule(strRules[i]);
			}
		} else {
			rules[0] = yav.splitRule(strRules);
		}
		return rules;
	},

	splitRule : function(strRule) {
		var retval = null;
		if (strRule != yav.undef) {
			params = strRule.split(yav_config.RULE_SEP);
			switch (params.length) {
			case 2:
				retval = new yav.rule(params[0], params[1], null, null, null);
				break;
			case 3:
				if (yav.threeParamRule(params[1])) {
					retval = new yav.rule(params[0], params[1], params[2],
							null, null);
				} else if (params[2] == 'pre-condition'
						|| params[2] == 'post-condition'
						|| params[2] == 'andor-operator') {
					retval = new yav.rule(params[0], params[1], null, 'foo',
							params[2]);
				} else {
					retval = new yav.rule(params[0], params[1], null,
							params[2], null);
				}
				break;
			case 4:
				if (yav.threeParamRule(params[1])
						&& (params[3] == 'pre-condition'
								|| params[3] == 'post-condition' || params[3] == 'andor-operator')) {
					retval = new yav.rule(params[0], params[1], params[2],
							'foo', params[3]);
				} else {
					retval = new yav.rule(params[0], params[1], params[2],
							params[3], null);
				}
				break;
			default:
				yav.debug('DEBUG: wrong definition of rule');
			}
		}
		return retval;
	},

	threeParamRule : function(ruleName) {
		return (ruleName == 'equal' || ruleName == 'notequal'
				|| ruleName == 'minlength' || ruleName == 'maxlength'
				|| ruleName == 'date_lt' || ruleName == 'date_le'
				|| ruleName == 'implies' || ruleName == 'regexp'
				|| ruleName == 'numrange' || ruleName == 'keypress'
				|| ruleName == 'and' || ruleName == 'or'
				|| ruleName == 'custom' || ruleName == 'mask') ? true : false;
	},

	highlight : function(el, clazz) {
		if (yav.rulesEvt.length > 0 && clazz == yav_config.inputclasserror) {
			return;
		}
		if (!yav.isFocusSet && clazz == yav_config.inputclasserror) {
			if ((!el.type) && (el.length > 0) && (el.item(0).type == 'radio')) {
				el.item(0).focus();
			} else {
				el.focus();
			}
			yav.isFocusSet = true;
		}
		if (el != yav.undef && yav_config.inputhighlight) {
			if (yav_config.multipleclassname) {
				yav.highlightMultipleClassName(el, clazz);
			} else {
				el.className = clazz;
			}
		}
	},

	highlightMultipleClassName : function(el, clazz) {
		re = new RegExp("(^|\\s)(" + yav_config.inputclassnormal + "|"
				+ yav_config.inputclasserror + ")($|\\s)");
		el.className = yav
				.strTrim(((typeof el.className != "undefined") ? el.className
						.replace(re, "") : "")
						+ " " + clazz);
	},

	getDefaultMessage : function(el, nameDisplayed, ruleName, comparisonValue) {
		if (nameDisplayed.length == 0) {
			nameDisplayed = el;
		}
		var msg = yav_config.DEFAULT_MSG;
		if (ruleName == 'required') {
			msg = yav_config.REQUIRED_MSG.replace('{1}', nameDisplayed);
		} else if (ruleName == 'minlength') {
			msg = yav_config.MINLENGTH_MSG.replace('{1}', nameDisplayed)
					.replace('{2}', comparisonValue);
		} else if (ruleName == 'maxlength') {
			msg = yav_config.MAXLENGTH_MSG.replace('{1}', nameDisplayed)
					.replace('{2}', comparisonValue);
		} else if (ruleName == 'numrange') {
			msg = yav_config.NUMRANGE_MSG.replace('{1}', nameDisplayed)
					.replace('{2}', comparisonValue);
		} else if (ruleName == 'date') {
			msg = yav_config.DATE_MSG.replace('{1}', nameDisplayed);
		} else if (ruleName == 'numeric') {
			msg = yav_config.NUMERIC_MSG.replace('{1}', nameDisplayed);
		} else if (ruleName == 'integer') {
			msg = yav_config.INTEGER_MSG.replace('{1}', nameDisplayed);
		} else if (ruleName == 'double') {
			msg = yav_config.DOUBLE_MSG.replace('{1}', nameDisplayed);
		} else if (ruleName == 'equal') {
			msg = yav_config.EQUAL_MSG.replace('{1}', nameDisplayed).replace(
					'{2}', yav.getComparisonDisplayed(comparisonValue));
		} else if (ruleName == 'notequal') {
			msg = yav_config.NOTEQUAL_MSG
					.replace('{1}', nameDisplayed)
					.replace('{2}', yav.getComparisonDisplayed(comparisonValue));
		} else if (ruleName == 'alphabetic') {
			msg = yav_config.ALPHABETIC_MSG.replace('{1}', nameDisplayed);
		} else if (ruleName == 'alphanumeric') {
			msg = yav_config.ALPHANUMERIC_MSG.replace('{1}', nameDisplayed);
		} else if (ruleName == 'alnumhyphen') {
			msg = yav_config.ALNUMHYPHEN_MSG.replace('{1}', nameDisplayed);
		} else if (ruleName == 'alnumhyphenat') {
			msg = yav_config.ALNUMHYPHENAT_MSG.replace('{1}', nameDisplayed);
		} else if (ruleName == 'alphaspace') {
			msg = yav_config.ALPHASPACE_MSG.replace('{1}', nameDisplayed);
		} else if (ruleName == 'email') {
			msg = yav_config.EMAIL_MSG.replace('{1}', nameDisplayed);
		} else if (ruleName == 'regexp') {
			msg = yav_config.REGEXP_MSG.replace('{1}', nameDisplayed).replace(
					'{2}', comparisonValue);
		} else if (ruleName == 'date_lt') {
			msg = yav_config.DATE_LT_MSG.replace('{1}', nameDisplayed).replace(
					'{2}', yav.getComparisonDisplayed(comparisonValue));
		} else if (ruleName == 'date_le') {
			msg = yav_config.DATE_LE_MSG.replace('{1}', nameDisplayed).replace(
					'{2}', yav.getComparisonDisplayed(comparisonValue));
		} else if (ruleName == 'empty') {
			msg = yav_config.EMPTY_MSG.replace('{1}', nameDisplayed);
		}
		return msg;
	},

	getComparisonDisplayed : function(comparisonValue) {
		comparisonDisplayed = comparisonValue;
		if (comparisonValue.substring(0, 1) == '$') {
			comparisonValue = comparisonValue.substring(1,
					comparisonValue.length);
			tmp = comparisonValue.split(':');
			if (tmp.length == 2) {
				comparisonDisplayed = tmp[1];
			} else {
				comparisonDisplayed = comparisonValue;
			}
		}
		return comparisonDisplayed;
	},

	isKeyAllowed : function(keyCode, charsAllowed) {
		retval = false;
		var aCharCode;
		if (keyCode == 8 || keyCode == 0) {
			retval = true;
		} else {
			for ( var i = 0; i < charsAllowed.length; i++) {
				aCharCode = charsAllowed.charCodeAt(i);
				if (aCharCode == keyCode) {
					retval = true;
					break;
				}
			}
		}
		return retval;
	},

	getField : function(formObj, fieldName) {
		var retval = null;
		if (formObj.elements[fieldName]) {
			retval = formObj.elements[fieldName];
		} else if (yav.get(fieldName)) {
			retval = yav.get(fieldName);
		}
		return retval;
	},

	get : function(id) {
		return document.getElementById(id);
	},

	unformatNumber : function(viewValue) {
		var retval = viewValue.replace(yav_config.THOUSAND_SEP, "");
		retval = retval.replace(yav_config.DECIMAL_SEP, ".");
		return retval;
	},

	deleteInline : function(msg) {
		if (msg.indexOf('__inline__') == -1) {
			return msg;
		} else {
			return msg.substring(0, msg.indexOf('__inline__'));
		}
	},

	addEvent : function(elm, evType, fn) {
		if (elm.addEventListener) {
			elm.addEventListener(evType, fn, false);
			return true;
		} else if (elm.attachEvent) {
			// The main drawback of the Microsoft event registration model is
			// that
	// attachEvent() creates a reference to the function and does not copy it.
	// so these lines (commented out) don't work in some circumstances.
	// var r = elm.attachEvent('on'+evType, fn);
	// return r;
	elm['on' + evType] = fn;
} else {
	elm['on' + evType] = fn;
}
},

call : function(elmName, evType, fn) {
var elm = document.forms[yav.formEvt].elements[elmName];
addEvent(elm, evType, fn);
}

}
// end namespace 'yav'

Function.prototype.bindAsEventListener = function(object) {
	var __method = this;
	return function(event) {
		return __method.call(object, event || window.event);
	}
}

