function validateCompleteForm(objForm, strErrorClass) {
	return _validateInternal(objForm, strErrorClass, 0);
};
function validateStandard(objForm, strErrorClass) {
	return _validateInternal(objForm, strErrorClass, 1);
};
function _validateInternal(form, strErrorClass, nErrorThrowType) {
	var strErrorMessage = "";
	var objFirstError = null;
	if (nErrorThrowType == 0) {
		strErrorMessage = (form.err) ? form.err : _getLanguageText("err_form");
	}
	;
	var fields = _GenerateFormFields(form);
	for ( var i = 0; i < fields.length; ++i) {
		var field = fields[i];
		if (!field.IsValid(fields)) {
			field.SetClass(strErrorClass);
			if (nErrorThrowType == 1) {
				_throwError(field);
				return false;
			} else {
				if (objFirstError == null) {
					objFirstError = field;
				}
				strErrorMessage = _handleError(field, strErrorMessage);
				bError = true;
			}
		} else {
			field.ResetClass();
		}
	}
	;
	if (objFirstError != null) {
		alert(strErrorMessage);
		objFirstError.element.focus();
		return false;
	}
	;
	return true;
};
function _getLanguageText(id) {
	objTextsInternal = new _jsVal_Language();
	objTexts = null;
	try {
		objTexts = new jsVal_Language();
	} catch (ignored) {
	}
	;
	switch (id) {
	case "err_form":
		strResult = (!objTexts || !objTexts.err_form) ? objTextsInternal.err_form
				: objTexts.err_form;
		break;
	case "err_enter":
		strResult = (!objTexts || !objTexts.err_enter) ? objTextsInternal.err_enter
				: objTexts.err_enter;
		break;
	case "err_select":
		strResult = (!objTexts || !objTexts.err_select) ? objTextsInternal.err_select
				: objTexts.err_select;
		break;
	}
	;
	return strResult;
};
function _GenerateFormFields(form) {
	var arr = new Array();
	for ( var i = 0; i < form.length; ++i) {
		var element = form.elements[i];
		var index = _getElementIndex(arr, element);
		if (index == -1) {
			arr[arr.length] = new Field(element, form);
		} else {
			arr[index].Merge(element)
		}
		;
	}
	;
	return arr;
};
function _getElementIndex(arr, element) {
	if (element.name) {
		var elementName = element.name.toLowerCase();
		for ( var i = 0; i < arr.length; ++i) {
			if (arr[i].element.name) {
				if (arr[i].element.name.toLowerCase() == elementName) {
					return i;
				}
			}
			;
		}
		;
	}
	return -1;
};
function _jsVal_Language() {
	this.err_form = "Please enter/select values for the following fields:\n\n";
	this.err_select = "Please select a valid \"%FIELDNAME%\"";
	this.err_enter = "Please enter a valid \"%FIELDNAME%\"";
};
function Field(element, form) {
	this.type = element.type;
	this.element = element;
	this.exclude = element.exclude || element.getAttribute('exclude');
	this.err = element.err || element.getAttribute('err');
	this.required = _parseBoolean(element.required
			|| element.getAttribute('required'));
	this.realname = element.realname || element.getAttribute('realname');
	this.elements = new Array();
	switch (this.type) {
	case "textarea":
	case "password":
	case "text":
	case "file":
		this.value = element.value;
		this.minLength = element.minlength || element.getAttribute('minlength');
		this.maxLength = element.maxlength || element.getAttribute('maxlength');
		this.regexp = this._getRegEx(element);
		this.minValue = element.minvalue || element.getAttribute('minvalue');
		this.maxValue = element.maxvalue || element.getAttribute('maxvalue');
		this.equals = element.equals || element.getAttribute('equals');
		this.callback = element.callback || element.getAttribute('callback');
		break;
	case "select-one":
	case "select-multiple":
		this.values = new Array();
		for ( var i = 0; i < element.options.length; ++i) {
			if (element.options[i].selected
					&& (!this.exclude || element.options[i].value != this.exclude)) {
				this.values[this.values.length] = element.options[i].value;
			}
		}
		this.min = element.min || element.getAttribute('min');
		this.max = element.max || element.getAttribute('max');
		this.equals = element.equals || element.getAttribute('equals');
		break;
	case "checkbox":
		this.min = element.min || element.getAttribute('min');
		this.max = element.max || element.getAttribute('max');
	case "radio":
		this.required = _parseBoolean(this.required
				|| element.getAttribute('required'));
		this.values = new Array();
		if (element.checked) {
			this.values[0] = element.value;
		}
		this.elements[0] = element;
		break;
	}
	;
};
Field.prototype.Merge = function(element) {
	var required = _parseBoolean(element.getAttribute('required'));
	if (required) {
		this.required = true;
	}
	;
	if (!this.err) {
		this.err = element.getAttribute('err');
	}
	;
	if (!this.equals) {
		this.equals = element.getAttribute('equals');
	}
	;
	if (!this.callback) {
		this.callback = element.getAttribute('callback');
	}
	;
	if (!this.realname) {
		this.realname = element.getAttribute('realname');
	}
	;
	if (!this.max) {
		this.max = element.getAttribute('max');
	}
	;
	if (!this.min) {
		this.min = element.getAttribute('min');
	}
	;
	if (!this.regexp) {
		this.regexp = this._getRegEx(element);
	}
	;
	if (element.checked) {
		this.values[this.values.length] = element.value;
	}
	;
	this.elements[this.elements.length] = element;
};
Field.prototype.IsValid = function(arrFields) {
	switch (this.type) {
	case "textarea":
	case "password":
	case "text":
	case "file":
		return this._ValidateText(arrFields);
	case "select-one":
	case "select-multiple":
	case "radio":
	case "checkbox":
		return this._ValidateGroup(arrFields);
	default:
		return true;
	}
	;
};
Field.prototype.SetClass = function(newClassName) {
	if ((newClassName) && (newClassName != "")) {
		if ((this.elements) && (this.elements.length > 0)) {
			for ( var i = 0; i < this.elements.length; ++i) {
				if (this.elements[i].className != newClassName) {
					this.elements[i].oldClassName = this.elements[i].className;
					this.elements[i].className = newClassName;
				}
			}
		} else {
			if (this.element.className != newClassName) {
				this.element.oldClassName = this.element.className;
				this.element.className = newClassName;
			}
		}
		;
	}
};
Field.prototype.ResetClass = function() {
	if ((this.type != "button") && (this.type != "submit")
			&& (this.type != "reset")) {
		if ((this.elements) && (this.elements.length > 0)) {
			for ( var i = 0; i < this.elements.length; ++i) {
				if (this.elements[i].oldClassName) {
					this.elements[i].className = this.elements[i].oldClassName;
				} else {
					this.element.className = "";
				}
			}
		} else {
			if (this.elements.oldClassName) {
				this.element.className = this.element.oldClassName;
			} else {
				this.element.className = "";
			}
		}
		;
	}
	;
};
Field.prototype._getRegEx = function(element) {
	regex = element.regexp || element.getAttribute('regexp')
	if (regex == null)
		return null;
	retype = typeof (regex);
	if (retype.toUpperCase() == "FUNCTION")
		return regex;
	else if ((retype.toUpperCase() == "STRING") && !(regex == "JSVAL_RX_EMAIL")
			&& !(regex == "JSVAL_RX_TEL") && !(regex == "JSVAL_RX_PC")
			&& !(regex == "JSVAL_RX_ZIP") && !(regex == "JSVAL_RX_MONEY")
			&& !(regex == "JSVAL_RX_CREDITCARD")
			&& !(regex == "JSVAL_RX_POSTALZIP")) {
		nBegin = 0;
		nEnd = 0;
		if (regex.charAt(0) == "/")
			nBegin = 1;
		if (regex.charAt(regex.length - 1) == "/")
			nEnd = 0;
		return new RegExp(regex.slice(nBegin, nEnd));
	} else {
		return regex;
	}
	;
};
Field.prototype._ValidateText = function(arrFields) {
	if ((this.required) && (this.callback)) {
		nCurId = this.element.id ? this.element.id : "";
		nCurName = this.element.name ? this.element.name : "";
		eval("bResult = " + this.callback + "('" + nCurId + "', '" + nCurName
				+ "', '" + this.value + "');");
		if (bResult == false) {
			return false;
		}
		;
	} else {
		if (this.required && !this.value) {
			return false;
		}
		;
		if (this.value
				&& (this.minLength && this.value.length < this.minLength)) {
			return false;
		}
		;
		if (this.value
				&& (this.maxLength && this.value.length > this.maxLength)) {
			return false;
		}
		;
		if (this.regexp) {
			if (!_checkRegExp(this.regexp, this.value)) {
				if (!this.required && this.value) {
					return false;
				}
				if (this.required) {
					return false;
				}
			} else {
				return true;
			}
			;
		}
		;
		if (this.equals) {
			for ( var i = 0; i < arrFields.length; ++i) {
				var field = arrFields[i];
				if ((field.element.name == this.equals)
						|| (field.element.id == this.equals)) {
					if (field.element.value != this.value) {
						return false;
					}
					;
					break;
				}
				;
			}
			;
		}
		;
		if (this.required) {
			var fValue = parseFloat(this.value);
			if ((this.minValue || this.maxValue) && isNaN(fValue)) {
				return false;
			}
			;
			if ((this.minValue) && (fValue < this.minValue)) {
				return false;
			}
			;
			if ((this.maxValue) && (fValue > this.maxValue)) {
				return false
			}
			;
		}
		;
	}
	return true;
};
Field.prototype._ValidateGroup = function(arrFields) {
	if (this.required && this.values.length == 0) {
		return false;
	}
	;
	if (this.required && this.min && this.min > this.values.length) {
		return false;
	}
	;
	if (this.required && this.max && this.max < this.values.length) {
		return false;
	}
	;
	return true;
};
function _handleError(field, strErrorMessage) {
	var obj = field.element;
	// strNewMessage=strErrorMessage+((field.realname)?field.realname:((obj.id)?obj.id:obj.name))+"\n";
	strNewMessage = strErrorMessage;
	return strNewMessage;
};
function _throwError(field) {
	var obj = field.element;
	switch (field.type) {
	case "text":
	case "password":
	case "textarea":
	case "file":
		alert(_getError(field, "err_enter"));
		try {
			obj.focus();
		} catch (ignore) {
		}
		break;
	case "select-one":
	case "select-multiple":
	case "radio":
	case "checkbox":
		alert(_getError(field, "err_select"));
		break;
	}
	;
};
function _getError(field, str) {
	var obj = field.element;
	strErrorTemp = (field.err) ? field.err : _getLanguageText(str);
	idx = strErrorTemp.indexOf("\\n");
	while (idx > -1) {
		strErrorTemp = strErrorTemp.replace("\\n", "\n");
		idx = strErrorTemp.indexOf("\\n");
	}
	;
	return strErrorTemp.replace("%FIELDNAME%",
			(field.realname) ? field.realname : ((obj.id) ? obj.id : obj.name));
};
function _parseBoolean(value) {
	return !(!value || value == 0 || value == "0" || value == "false");
};
function _checkRegExp(regx, value) {
	switch (regx) {
	case "JSVAL_RX_EMAIL":
		return ((/^[a-zA-Z�������]+([\.-]?[a-zA-Z�������]+)*@[a-zA-Z�������]+([\.-]?[a-zA-Z�������]+)*(\.\w{2,5})+$/)
				.test(value));
	case "JSVAL_RX_TEL":
		return ((/^1?[\-]?\(?\d{3}\)?[\-]?\d{3}[\-]?\d{4}$/).test(value));
	case "JSVAL_RX_PC":
		return ((/^[a-z]\d[a-z]?\d[a-z]\d$/i).test(value));
	case "JSVAL_RX_ZIP":
		return ((/^\d{5}$/).test(value));
	case "JSVAL_RX_MONEY":
		return ((/^\d+([\.]\d\d)?$/).test(value));
	case "JSVAL_RX_CREDITCARD":
		return (!isNaN(value));
	case "JSVAL_RX_POSTALZIP":
		if (value.length == 6 || value.length == 7)
			return ((/^[a-zA-Z]\d[a-zA-Z] ?\d[a-zA-Z]\d$/).test(value));
		if (value.length == 5 || value.length == 10)
			return ((/^\d{5}(\-\d{4})?$/).test(value));
		break;
	default:
		return (regx.test(value));
	}
	;
};
