/***********************************************************************
* YAV - Yet Another Validator  v1.4.1                                 *
* 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:  31 JAN 2008                                         *
***********************************************************************/
var undef;
var isFocusSet;
var internalRules;
function performCheck(formName, strRules, alertType){
	isFocusSet = false;
	var rules = makeRules(strRules);
	internalRules = makeRules(strRules);
	this.f = document.forms[formName];
	if (!this.f) {
		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) {
				highlight(getField(f, aRule.el), inputclassnormal);
			}
		}
	}
	else {
		if (rules != null) {
			highlight(getField(f, rules.el), inputclassnormal);
		}
	}
	if (rules.length) {
		for (var i = 0; i < rules.length; i++) {
			var aRule = rules[i];
			var anErr = null;
			if (aRule == null) {
			}
			else 
				if (aRule.ruleType == 'pre-condition' || aRule.ruleType == 'post-condition' || aRule.ruleType == 'andor-operator') {
				}
				else 
					if (aRule.ruleName == 'implies') {
						pre = aRule.el;
						post = aRule.comparisonValue;
						var oldClassName = getField(f, rules[pre].el).className;
						if (checkRule(f, rules[pre]) == null && checkRule(f, rules[post]) != null) {
							anErr = deleteInline(aRule.alertMsg) + '__inline__' + rules[post].el;
						}
						else 
							if (checkRule(f, rules[pre]) != null) {
								getField(f, rules[pre].el).className = oldClassName;
							}
					}
					else {
						anErr = checkRule(f, aRule);
					}
			if (anErr != null) {
				errors[ix] = anErr;
				ix++;
			}
		}//for
	}
	else {
		var myRule = rules;
		err = checkRule(f, myRule);
		if (err != null) {
			errors[0] = err;
		}
	}
	return displayAlert(errors, alertType);
}
function checkKeyPress(ev, obj, strRules){
	var keyCode = null;
	if (getBrowser() == 'msie') {
		keyCode = window.event.keyCode;
	}
	else 
		if (getBrowser() == 'netscape' || getBrowser() == 'firefox') {
			keyCode = ev.which;
		}
	var rules = 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 = isKeyAllowed(keyCode, aRule.comparisonValue);
				break;
			}
		}
	}
	else {
		var aRule = rules;
		if (aRule.ruleName == 'keypress' && aRule.el == obj.name) {
			keyAllowed = isKeyAllowed(keyCode, aRule.comparisonValue);
		}
	}
	if (!keyAllowed) {
		if (getBrowser() == 'msie') {
			window.event.keyCode = 0;
		}
		else 
			if (getBrowser() == 'netscape' || getBrowser() == 'firefox') {
				ev.preventDefault();
				ev.stopPropagation();
				ev.returnValue = false;
			}
	}
	return false;
}
function displayAlert(messages, alertType){
	var retval = null;
	clearAllInlineSpans();
	if (alertType == 'classic') {
		retval = displayClassic(messages);
	}
	else 
		if (alertType == 'innerHtml') {
			retval = displayInnerHtml(messages);
		}
		else 
			if (alertType == 'inline') {
				retval = displayInline(messages);
			}
			else 
				if (alertType == 'jsVar') {
					retval = displayJsVar(messages);
				}
				else {
					debug('DEBUG: alert type ' + alertType + ' not supported');
				}
	return retval;
}
function displayClassic(messages){
	var str = '';
	if (messages != null && messages.length > 0) {
		if (strTrim(HEADER_MSG).length > 0) {
			str += HEADER_MSG + '\n\n';
		}
		for (var i = 0; i < messages.length; i++) {
			str += ' ' + deleteInline(messages[i]) + '\n';
		}
		if (strTrim(FOOTER_MSG).length > 0) {
			str += '\n' + FOOTER_MSG;
		}
		alert(str);
		return false;
	}
	else {
		return true;
	}
}
function displayInnerHtml(messages){
	if (messages != null && messages.length > 0) {
		var str = '';
		if (strTrim(HEADER_MSG).length > 0) {
			str += HEADER_MSG;
		}
		str += '<ul>';
		for (var i = 0; i < messages.length; i++) {
			str += '<li>' + deleteInline(messages[i]) + '</li>';
		}
		str += '</ul>';
		if (strTrim(FOOTER_MSG).length > 0) {
			str += FOOTER_MSG;
		}
		document.getElementById(errorsdiv).innerHTML = str;
		document.getElementById(errorsdiv).className = innererror;
		document.getElementById(errorsdiv).style.display = 'block';
		return false;
	}
	else {
		document.getElementById(errorsdiv).innerHTML = '';
		document.getElementById(errorsdiv).className = '';
		document.getElementById(errorsdiv).style.display = 'none';
		return true;
	}
}
function displayInline(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 (document.getElementById(errorsdiv + '_' + elName)) {
				document.getElementById(errorsdiv + '_' + elName).innerHTML = deleteInline(messages[i]);
				document.getElementById(errorsdiv + '_' + elName).className = innererror;
				document.getElementById(errorsdiv + '_' + elName).style.display = '';
			}
			else {
				genericErrors[genericErrIndex] = messages[i];
				genericErrIndex++;
			}
		}
		if (genericErrIndex > 0) {
			displayInnerHtml(genericErrors);
		}
		return false;
	}
	else {
		return true;
	}
}
function clearAllInlineSpans(){
	var allDivs = document.getElementsByTagName("span");
	for (var j = 0; j < allDivs.length; j++) {
		var idName = allDivs[j].id;
		if (idName.indexOf(errorsdiv + '_') == 0) {
			document.getElementById(idName).innerHTML = '';
			document.getElementById(idName).className = '';
			document.getElementById(idName).style.display = 'none';
		}
	}
}
function displayJsVar(messages){
	document.getElementById(errorsdiv).className = '';
	document.getElementById(errorsdiv).style.display = 'none';
	if (messages != null && messages.length > 0) {
		for (var i = 0; i < messages.length; i++) {
			messages[i] = deleteInline(messages[i]);
		}
		var str = '';
		str += '<script>var jsErrors;</script>';
		document.getElementById(errorsdiv).innerHTML = str;
		jsErrors = messages;
		return false;
	}
	else {
		document.getElementById(errorsdiv).innerHTML = '<script>var jsErrors;</script>';
		return true;
	}
}
function rule(el, ruleName, comparisonValue, alertMsg, ruleType){
	if (!checkArguments(arguments)) {
		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 == undef || alertMsg == null) {
		this.alertMsg = getDefaultMessage(el, nameDisplayed, ruleName, comparisonValue) + '__inline__' + this.el;
	}
	else {
		this.alertMsg = alertMsg + '__inline__' + this.el;
	}
}
function checkRule(f, myRule){
	retVal = null;
	if (myRule != null) {
		if (myRule.ruleName == 'custom') {
			var customFunction = ' retVal = ' + myRule.el;
			eval(customFunction);
		}
		else 
			if (myRule.ruleName == 'and') {
				var op_1 = myRule.el;
				var op_next = myRule.comparisonValue;
				if (checkRule(f, internalRules[op_1]) != null) {
					retVal = myRule.alertMsg;
					if (myRule.ruleType == 'pre-condition' || myRule.ruleType == 'andor-operator') {
					}
				}
				else {
					var op_k = op_next.split('-');
					for (var k = 0; k < op_k.length; k++) {
						if (checkRule(f, internalRules[op_k[k]]) != null) {
							retVal = myRule.alertMsg;
							if (myRule.ruleType == 'pre-condition' || myRule.ruleType == 'andor-operator') {
							}
							break;
						}
					}
				}
			}
			else 
				if (myRule.ruleName == 'or') {
					var op_1 = myRule.el;
					var op_next = myRule.comparisonValue;
					var success = false;
					if (checkRule(f, internalRules[op_1]) == null) {
						success = true;
					}
					else {
						if (myRule.ruleType == 'pre-condition' || myRule.ruleType == 'andor-operator') {
						}
						var op_k = op_next.split('-');
						for (var k = 0; k < op_k.length; k++) {
							if (checkRule(f, internalRules[op_k[k]]) == null) {
								success = true;
								break;
							}
							else {
								if (myRule.ruleType == 'pre-condition' || myRule.ruleType == 'andor-operator') {
								}
							}
						}
					}
					if (success) {
						highlight(getField(f, internalRules[op_1].el), inputclassnormal);
						var op_k = op_next.split('-');
						for (var k = 0; k < op_k.length; k++) {
							highlight(getField(f, internalRules[op_k[k]].el), inputclassnormal);
						}
					}
					else {
						retVal = myRule.alertMsg;
					}
				}
				else {
					el = getField(f, myRule.el);
					if (el == null) {
						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 = checkText(el, myRule);
						}
						else 
							if (el.type == 'checkbox') {
								err = checkCheckbox(el, myRule);
							}
							else 
								if (el.type == 'select-one') {
									err = checkSelOne(el, myRule);
								}
								else 
									if (el.type == 'select-multiple') {
										err = checkSelMul(el, myRule);
									}
									else 
										if (el.type == 'radio') {
											err = checkRadio(el, myRule);
										}
										else {
											debug('DEBUG: type ' + el.type + ' not supported');
										}
					}
					else {
						err = checkRadio(el, myRule);
					}
					retVal = err;
				}
	}
	return retVal;
}
function checkArguments(args){
	if (args.length < 4) {
		debug('DEBUG: rule requires four arguments at least');
		return false;
	}
	else 
		if (args[0] == null || args[1] == null) {
			debug('DEBUG: el and ruleName are required');
			return false;
		}
	return true;
}
function checkRadio(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) {
			highlight(el, 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 {
				debug('DEBUG: rule ' + myRule.ruleName + ' not supported for radio');
			}
	return err;
}
function checkText(el, myRule){
	err = null;
	if (trimenabled) {
		el.value = strTrim(el.value);
	}
	if (myRule.ruleName == 'required') {
		if (el.value == null || el.value == '') {
			highlight(el, inputclasserror);
			err = myRule.alertMsg;
		}
	}else	if (myRule.ruleName == 'equal') {
		err = checkEqual(el, myRule);
	}else	if (myRule.ruleName == 'notequal') {
		err = checkNotEqual(el, myRule);
	}else if (myRule.ruleName == 'numeric') {
		reg = new RegExp("^[0-9]*$");
		if (!reg.test(el.value)) {
			highlight(el, inputclasserror);
			err = myRule.alertMsg;
		}
	}else if (myRule.ruleName == 'alphabetic') {
		reg = new RegExp(alphabetic_regex);
		if (!reg.test(el.value)) {
			highlight(el, inputclasserror);
			err = myRule.alertMsg;
		}
	}else if (myRule.ruleName == 'alphanumeric') {
		reg = new RegExp(alphanumeric_regex);
		if (!reg.test(el.value)) {
			highlight(el, inputclasserror);
			err = myRule.alertMsg;
		}
	}else if (myRule.ruleName == 'alnumhyphen') {
		reg = new RegExp(alnumhyphen_regex);
		if (!reg.test(el.value)) {
			highlight(el, inputclasserror);
			err = myRule.alertMsg;
		}
	}else if (myRule.ruleName == 'alnumhyphenat') {
		reg = new RegExp(alnumhyphenat_regex);
		if (!reg.test(el.value)) {
			highlight(el, inputclasserror);
			err = myRule.alertMsg;
		}
	}else if (myRule.ruleName == 'alphaspace') {
		reg = new RegExp(alphaspace_regex);
		if (!reg.test(el.value)) {
			highlight(el, inputclasserror);
			err = myRule.alertMsg;
		}
	}else if (myRule.ruleName == 'email') {
		reg = new RegExp(email_regex);
		if (!reg.test(el.value)) {
			highlight(el, inputclasserror);
			err = myRule.alertMsg;
		}
	}else if (myRule.ruleName == 'maxlength') {
		if (isNaN(myRule.comparisonValue)) {
			debug('DEBUG: comparisonValue for rule ' + myRule.ruleName + ' not a number');
		}else if (el.value.length > myRule.comparisonValue) {
			highlight(el, inputclasserror);
			err = myRule.alertMsg;
		}
	}else if (myRule.ruleName == 'minlength') {
		if (isNaN(myRule.comparisonValue)) {
			debug('DEBUG: comparisonValue for rule ' + myRule.ruleName + ' not a number');
		}
		else 
			if (el.value.length < myRule.comparisonValue) {
				highlight(el, inputclasserror);
				err = myRule.alertMsg;
			}
	}else if (myRule.ruleName == 'numrange') {
		reg = new RegExp("^[-+]{0,1}[0-9]*[.]{0,1}[0-9]*$");
		if (!reg.test(unformatNumber(el.value))) {
			highlight(el, inputclasserror);
			err = myRule.alertMsg;
		}else{
			regRange = new RegExp("^[0-9]+-[0-9]+$");
			if (!regRange.test(myRule.comparisonValue)) {
				debug('DEBUG: comparisonValue for rule ' + myRule.ruleName + ' not in format number1-number2');
			}else{
				rangeVal = myRule.comparisonValue.split('-');
				if (eval(unformatNumber(el.value)) < eval(rangeVal[0]) || eval(unformatNumber(el.value)) > eval(rangeVal[1])) {
					highlight(el, inputclasserror);
					err = myRule.alertMsg;
				}
			}
		}
	}else if (myRule.ruleName == 'regexp') {
		reg = new RegExp(myRule.comparisonValue);
		if (!reg.test(el.value)) {
			highlight(el, inputclasserror);
			err = myRule.alertMsg;
		}
	}else if (myRule.ruleName == 'integer') {
		err = checkInteger(el, myRule);
	}else if (myRule.ruleName == 'double') {
		err = checkDouble(el, myRule);
	}else if (myRule.ruleName == 'date') {
		err = checkDate(el, myRule);
	}else if (myRule.ruleName == 'date_lt') {
		err = checkDateLessThan(el, myRule, false);
	}else if (myRule.ruleName == 'date_le') {
		err = checkDateLessThan(el, myRule, true);
	}else if (myRule.ruleName == 'keypress') {
	}else if (myRule.ruleName == 'empty') {
		if (el.value != null && el.value != '') {
			highlight(el, inputclasserror);
			err = myRule.alertMsg;
		}
   
	}else if(myRule.ruleName == 'cpf'){
		if (el.value != null && el.value != '') {
			err = checkCpf(el, myRule);
		}
	}else {
		debug('DEBUG: rule ' + myRule.ruleName + ' not supported for ' + el.type);
	}
	return err;
}
function checkInteger(el, myRule){
	reg = new RegExp("^[-+]{0,1}[0-9]*$");
	if (!reg.test(el.value)) {
		highlight(el, inputclasserror);
		return myRule.alertMsg;
	}
}
function checkCpf(el, myRule){
	var c = el.value;
	var erro = false;
	
    if((c = c.replace(/[^\d]/g,"").split("")).length != 11) erro = true;
	if (parseInt(c) > 0) {
		if (new RegExp("^" + c[0] + "{11}$").test(c.join(""))) erro = true;
		for (var s = 10, n = 0, i = 0; s >= 2; n += c[i++] * s--);
		if (c[9] != (((n %= 11) < 2) ? 0 : 11 - n)) erro = true;
		for (var s = 11, n = 0, i = 0; s >= 2; n += c[i++] * s--);
		if (c[10] != (((n %= 11) < 2) ? 0 : 11 - n)) erro = true;
	}
   if(erro){
		highlight(el, inputclasserror);
      return myRule.alertMsg;
	}
}
function checkDouble(el, myRule){
	var sep = DECIMAL_SEP;
	reg = new RegExp("^[-+]{0,1}[0-9]*[" + sep + "]{0,1}[0-9]*$");
	if (!reg.test(el.value.replace(/\./gi,""))) {
		highlight(el, inputclasserror);
		return myRule.alertMsg;
	}
}
function checkDate(el, myRule){
	error = null;
	if (el.value != '') {
		var dateFormat = DATE_FORMAT;
		ddReg = new RegExp("dd");
		MMReg = new RegExp("MM");
		yyyyReg = new RegExp("yyyy");
		if (!ddReg.test(dateFormat) || !MMReg.test(dateFormat) || !yyyyReg.test(dateFormat)) {
			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)) {
			highlight(el, 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 (!checkddMMyyyy(dd, MM, yyyy)) {
				highlight(el, inputclasserror);
				error = myRule.alertMsg;
			}
		}
	}
	return error;
}
function checkDateLessThan(el, myRule, isEqualAllowed){
	error = null;
	var isDate = checkDate(el, myRule) == null ? true : false;
	if (isDate && el.value != '') {
		var dateFormat = 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 = this.getField(f, tmp[0]).value;
			}
			else {
				comparisonDate = this.getField(f, myRule.comparisonValue.substr(1)).value;
			}
		}
		else {
			comparisonDate = myRule.comparisonValue;
		}
		if (!reg.test(comparisonDate)) {
			highlight(el, 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 (tmp.length == 2) {
				switch (tmp[1]) {
					case '>':
						if (!checkddMMyyyy(cdd, cMM, cyyyy) || myDate <= cDate) {
							highlight(el, inputclasserror);
							error = myRule.alertMsg;
						}
						break;
					case '<':
						if (!checkddMMyyyy(cdd, cMM, cyyyy) || myDate >= cDate) {
							highlight(el, inputclasserror);
							error = myRule.alertMsg;
						}
						break;
					case '>=':
						if (!checkddMMyyyy(cdd, cMM, cyyyy) || myDate < cDate) {
							highlight(el, inputclasserror);
							error = myRule.alertMsg;
						}
						break;
					case '<=':
						if (!checkddMMyyyy(cdd, cMM, cyyyy) || myDate > cDate) {
							highlight(el, inputclasserror);
							error = myRule.alertMsg;
						}
						break;
				}
			}
			else {
				if (isEqualAllowed) {
					if (!checkddMMyyyy(cdd, cMM, cyyyy) || myDate > cDate) {
						highlight(el, inputclasserror);
						error = myRule.alertMsg;
					}
				}
				else {
					if (!checkddMMyyyy(cdd, cMM, cyyyy) || myDate >= cDate) {
						highlight(el, inputclasserror);
						error = myRule.alertMsg;
					}
				}
			}
		}
	}
	else {
		if (el.value != '') {
			highlight(el, inputclasserror);
			error = myRule.alertMsg;
		}
	}
	return error;
}
function checkEqual(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 = this.getField(f, tmp[0]).value;
		}
		else {
			comparisonVal = this.getField(f, myRule.comparisonValue.substr(1)).value;
		}
	}
	else {
		comparisonVal = myRule.comparisonValue;
	}
	if (el.value != comparisonVal) {
		highlight(el, inputclasserror);
		error = myRule.alertMsg;
	}
	return error;
}
function checkNotEqual(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 = this.getField(f, tmp[0]).value;
		}
		else {
			comparisonVal = this.getField(f, myRule.comparisonValue.substr(1)).value;
		}
	}
	else {
		comparisonVal = myRule.comparisonValue;
	}
	if (el.value == comparisonVal) {
		highlight(el, inputclasserror);
		error = myRule.alertMsg;
	}
	return error;
}
function checkddMMyyyy(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;
}
function checkCheckbox(el, myRule){
	if (myRule.ruleName == 'required') {
		if (!el.checked) {
			highlight(el, inputclasserror);
			return myRule.alertMsg;
		}
	}
	else 
		if (myRule.ruleName == 'equal') {
			if (!el.checked || el.value != myRule.comparisonValue) {
				highlight(el, inputclasserror);
				return myRule.alertMsg;
			}
		}
		else 
			if (myRule.ruleName == 'notequal') {
				if (el.checked && el.value == myRule.comparisonValue) {
					highlight(el, inputclasserror);
					return myRule.alertMsg;
				}
			}
			else {
				debug('DEBUG: rule ' + myRule.ruleName + ' not supported for ' + el.type);
			}
}
function checkSelOne(el, myRule){
	if (myRule.ruleName == 'required') {
		var found = false;
		var inx = el.selectedIndex;
		if (inx >= 0 && el.options[inx].value) {
			found = true;
		}
		if (!found) {
			highlight(el, 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) {
				highlight(el, 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) {
					highlight(el, inputclasserror);
					return myRule.alertMsg;
				}
			}
			else {
				debug('DEBUG: rule ' + myRule.ruleName + ' not supported for ' + el.type);
			}
}
function checkSelMul(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) {
			highlight(el, 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) {
				highlight(el, 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) {
					highlight(el, inputclasserror);
					return myRule.alertMsg;
				}
			}
			else {
				debug('DEBUG: rule ' + myRule.ruleName + ' not supported for ' + el.type);
			}
}
function debug(msg){
	if (debugmode) {
		alert(msg);
	}
}
function strTrim(str){
	return str.replace(/^\s+/, '').replace(/\s+$/, '');
}
function makeRules(strRules){
	var rules = new Array();
	if (strRules.length) {
		for (var i = 0; i < strRules.length; i++) {
			rules[i] = splitRule(strRules[i]);
		}
	}
	else {
		rules[0] = splitRule(strRules);
	}
	return rules;
}
function splitRule(strRule){
	var retval = null;
	if (strRule != undef) {
		params = strRule.split(RULE_SEP);
		switch (params.length) {
			case 2:
				retval = new rule(params[0], params[1], null, null, null);
				break;
			case 3:
				if (threeParamRule(params[1])) {
					retval = new 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 rule(params[0], params[1], null, 'foo', params[2]);
					}
					else {
						retval = new rule(params[0], params[1], null, params[2], null);
					}
				break;
			case 4:
				if (threeParamRule(params[1]) && (params[3] == 'pre-condition' || params[3] == 'post-condition' || params[3] == 'andor-operator')) {
					retval = new rule(params[0], params[1], params[2], 'foo', params[3]);
				}
				else {
					retval = new rule(params[0], params[1], params[2], params[3], null);
				}
				break;
			default:
				debug('DEBUG: wrong definition of rule');
		}
	}
	return retval;
}
function threeParamRule(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') ? true : false;
}
function highlight(el, clazz){
	if (!isFocusSet && clazz == inputclasserror) {
		if ((!el.type) && (el.length > 0) && (el.item(0).type == 'radio')) {
			el.item(0).focus();
		}
		else {
			el.focus();
		}
		isFocusSet = true;
	}
	if (el != undef && inputhighlight) {
		if (multipleclassname) {
			highlightMultipleClassName(el, clazz);
		}
		else {
			el.className = clazz;
		}
	}
}
function highlightMultipleClassName(el, clazz){
	re = new RegExp("(^|\\s)(" + inputclassnormal + "|" + inputclasserror + ")($|\\s)");
	el.className = strTrim(((typeof el.className != "undefined") ? el.className.replace(re, "") : "") +
	" " +
	clazz);
}
function getDefaultMessage(el, nameDisplayed, ruleName, comparisonValue){
	if (nameDisplayed.length == 0) {
		nameDisplayed = el;
	}
	var msg = DEFAULT_MSG;
	if (ruleName == 'required') {
		msg = REQUIRED_MSG.replace('{1}', nameDisplayed);
	}
	else 
		if (ruleName == 'minlength') {
			msg = MINLENGTH_MSG.replace('{1}', nameDisplayed).replace('{2}', comparisonValue);
		}
		else 
			if (ruleName == 'maxlength') {
				msg = MAXLENGTH_MSG.replace('{1}', nameDisplayed).replace('{2}', comparisonValue);
			}
			else 
				if (ruleName == 'numrange') {
					msg = NUMRANGE_MSG.replace('{1}', nameDisplayed).replace('{2}', comparisonValue);
				}
				else 
					if (ruleName == 'date') {
						msg = DATE_MSG.replace('{1}', nameDisplayed);
					}
					else 
						if (ruleName == 'numeric') {
							msg = NUMERIC_MSG.replace('{1}', nameDisplayed);
						}
						else 
							if (ruleName == 'integer') {
								msg = INTEGER_MSG.replace('{1}', nameDisplayed);
							}
							else 
								if (ruleName == 'double') {
									msg = DOUBLE_MSG.replace('{1}', nameDisplayed);
								}
								else 
									if (ruleName == 'equal') {
										msg = EQUAL_MSG.replace('{1}', nameDisplayed).replace('{2}', getComparisonDisplayed(comparisonValue));
									}
									else 
										if (ruleName == 'notequal') {
											msg = NOTEQUAL_MSG.replace('{1}', nameDisplayed).replace('{2}', getComparisonDisplayed(comparisonValue));
										}
										else 
											if (ruleName == 'alphabetic') {
												msg = ALPHABETIC_MSG.replace('{1}', nameDisplayed);
											}
											else 
												if (ruleName == 'alphanumeric') {
													msg = ALPHANUMERIC_MSG.replace('{1}', nameDisplayed);
												}
												else 
													if (ruleName == 'alnumhyphen') {
														msg = ALNUMHYPHEN_MSG.replace('{1}', nameDisplayed);
													}
													else 
														if (ruleName == 'alnumhyphenat') {
															msg = ALNUMHYPHENAT_MSG.replace('{1}', nameDisplayed);
														}
														else 
															if (ruleName == 'alphaspace') {
																msg = ALPHASPACE_MSG.replace('{1}', nameDisplayed);
															}
															else 
																if (ruleName == 'email') {
																	msg = EMAIL_MSG.replace('{1}', nameDisplayed);
																}
																else 
																	if (ruleName == 'regexp') {
																		msg = REGEXP_MSG.replace('{1}', nameDisplayed).replace('{2}', comparisonValue);
																	}
																	else 
																		if (ruleName == 'date_lt') {
																			msg = DATE_LT_MSG.replace('{1}', nameDisplayed).replace('{2}', getComparisonDisplayed(comparisonValue));
																		}
																		else 
																			if (ruleName == 'date_le') {
																				msg = DATE_LE_MSG.replace('{1}', nameDisplayed).replace('{2}', getComparisonDisplayed(comparisonValue));
																			}
																			else 
																				if (ruleName == 'empty') {
																					msg = EMPTY_MSG.replace('{1}', nameDisplayed);
																				}
																				else
																					if(ruleName == 'cpf'){
																						msg = CPF_MSG.replace('{1}', nameDisplayed);
																					}
	return msg;
}
function getComparisonDisplayed(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;
}
function getBrowser(){
	brs = navigator.userAgent.toLowerCase();
	var retval;
	if (brs.search(/msie\s(\d+(\.?\d)*)/) != -1) {
		retval = 'msie';
	}
	else 
		if (brs.search(/netscape[\/\s](\d+([\.-]\d)*)/) != -1) {
			retval = 'netscape';
		}
		else 
			if (brs.search(/firefox[\/\s](\d+([\.-]\d)*)/) != -1) {
				retval = 'firefox';
			}
			else {
				retval = 'unknown';
			}
	return retval;
}
function isKeyAllowed(keyCode, charsAllowed){
	retval = false;
	var aCharCode;
	if (keyCode == 8) {
		retval = true;
	}
	else {
		for (var i = 0; i < charsAllowed.length; i++) {
			aCharCode = charsAllowed.charCodeAt(i);
			if (aCharCode == keyCode) {
				retval = true;
				break;
			}
		}
	}
	return retval;
}
function getField(formObj, fieldName){
	var retval = null;
	if (formObj.elements[fieldName]) {
		retval = formObj.elements[fieldName];
	}
	else 
		if (document.getElementById(fieldName)) {
			retval = document.getElementById(fieldName);
		}
	return retval;
}
function unformatNumber(viewValue){
	var retval = viewValue.replace(THOUSAND_SEP, "");
	retval = retval.replace(DECIMAL_SEP, ".");
	return retval;
}
function deleteInline(msg){
	if (msg.indexOf('__inline__') == -1) {
		return msg;
	}
	else {
		return msg.substring(0, msg.indexOf('__inline__'));
	}
}

