	
	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 required 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=regex.length-1;
			if(regex.charAt(0)=="/")nBegin=1;
			if(regex.charAt(regex.length-1)=="/")nEnd=regex.length-2;
			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((/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\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_NUMBERCHECK":
			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));
			
			case "JSVAL_RX_DATE":
			return((/^\d{2}\/\d{2}\/\d{4}$/).test(value));
	
			break;
	
			default:
	
			return(regx.test(value));
		}
	}
