
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="textInput";
			}
		};
	};
};

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";
	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 true;
		/*return((/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/).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_NUM":
			return((/^\d+$/).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));
	};
};

