var ClientValidation=
{
	onload:function()
	{
	
		for(var k=0,tags=["INPUT","SELECT","TEXTAREA"];k<tags.length;k++)
		{
			for(var i=0,c=document.getElementsByTagName(tags[k]);i<c.length;i++)
			{
				var def=c[i].getAttribute("DefaultValue")||c[i].DefaultValue
				var subdef=c[i].getAttribute?c[i].getAttribute("SubmitDefault"):c[i].SubmitDefault;
				if((c[i].getAttribute("Validation")||c[i].Validation))//||(def&&typeof(subdef)!="undefined"))
					this.MarkForValidation(c[i]);
				
				if(def)
				{
					if(c[i].value=="")
						c[i].value=def;
					//if( (c[i].getAttribute("Validation")||c[i].Validation) == "not-empty+not-default")
					if( (c[i].getAttribute("Validation")||c[i].Validation) == "not-empty+not-default")
					{
						c[i].onblur=function(){if(this.value=="")this.value=(this.getAttribute("DefaultValue")||this.DefaultValue)}
						c[i].onfocus=function(){if(this.value==(this.DefaultValue||this.getAttribute("DefaultValue")))this.value="";}
					}
				}
			}
		}
	},
	MarkForValidation:function(oEl)
	{
		oEl.setAttribute("DoValidate",true);
		if(oEl.form)
			oEl.form.onsubmit=new Function("","return ClientValidation.ValidateForm(this)")
		else
		{
			// todo: something for input elements without form, e.g. a validateThis or something..
		}
	},
	ValidateForm:function(oForm)
	{
		for(var err=[],i=0,el=null;i<oForm.elements.length;i++)
		{
			el=oForm.elements[i];
			if(el.getAttribute("DoValidate"))
			{
				if(!this.ValidateField(el))
				{
					err[err.length]=
					{
						errorDescription:el.getAttribute("ErrorDescription"),
						element:el
					}
				}
			}
		}
		
		if(err.length>0)
		{
			//err[0].element.focus();
			if(typeof(this.Error)=="function")
				this.Error(err);
			else
			{
				var errDIV = document.getElementById("validationerror");
				errDIV.innerHTML = "";
				var errUL = document.createElement("ul");
				for(var i=0,s="";i<err.length;i++){	
					var errLI = document.createElement("li");
					errLI.appendChild(document.createTextNode(err[i].errorDescription));
					errUL.appendChild(errLI);
					s+=(i>0?"\n":"")+err[i].errorDescription;
				}
				//alert(s);
				errDIV.appendChild(errUL);
			}
			
			return false;
		}
		else
		{
			for(var i=0,el=null;i<oForm.elements.length;i++)
			{
				var el=oForm.elements[i];
				if(el.type=="hidden")
					continue;
				var def=el.getAttribute("DefaultValue")||el.DefaultValue;
				if(def&&el.value==def)
					el.value="";
			}
		}
		return true;
	},
	ValidateField:function(elField)
	{
		/*
		// check for submitting default values or replacing them with empty's
		var def=(elField.getAttribute("DefaultValue")||elField.DefaultValue);	
		var subdef=(elField.getAttribute("SubmitDefault")||elField.SubmitDefault);
		
		if(def && typeof(subdef)=="string")
			if(elField.value==def&&!eval(subdef))
				elField.value="";
			*/
				
		// validate field values
		var valiType = elField.getAttribute("ValidationType") || elField.ValidationType;
		if(!valiType)
			valiType="standard";
			
		var vali = elField.getAttribute("Validation") || elField.Validation;
		
		if(typeof(vali)!="string")
			return true;
		
		var value = elField.value;
		
		if(valiType.toLowerCase()=="standard")
		{
			switch(vali.toLowerCase())
			{
				case "email":
				{
					valiType="regexp";
					vali="^[\\w-_\.]*[\\w-_\.]\@[\\w]\.+[\\w]+[\\w]$";
					break;
				}
				case "not-empty":
				{
					return value.length>0?true:false;
					break;
				}
				case "not-default":
				{
					return value!=(elField.getAttribute("DefaultValue")||elField.DefaultValue);
				}
				case "not-empty+not-default":
				{
					return (value!=(elField.getAttribute("DefaultValue")||elField.DefaultValue)) && value.length>0;
				}
				case "checked":
				{
					if(elField.type=="checkbox")
						return elField.checked;
					else if(elField.type=="radio")
					{
						var r=false;
						for(var i=0,c=elField.form.elements[elField.name];i<c.length;i++)
						{
							if(c[i].checked)
							{
								r=true;
								break;
							}
						}
						return r;
					}
				}
			}
		}
		
		if(valiType.toLowerCase()=="regexp")
		{
			var regex = new RegExp(vali);
			return regex.test(value);
		}
		if(valiType.toLowerCase()=="expression")
		{
			return eval(value+vali)
		}
	}
}
ClientValidation._onload=window.onload;
window.onload=function(){ClientValidation.onload();}