	/*=====add fate func*/
	// These 2 functions provide the date object in 
	// the format specified from the server in the DateFormat variable
	Date.prototype.GetSeparator = function(inputVal)
	{
		var separators = new Array(".",":","/",",","-");
		for(i=0; i < separators.length; i++)
			if(inputVal.indexOf(separators[i]) != -1)
				return separators[i];
	}
	
	Date.prototype.NewDate = function(inputVal)
	{
		var Month, DD, Year;	
		DateFormat = DateFormat.toLowerCase();
		var dateFormat = DateFormat.split(this.GetSeparator(DateFormat));	
		for(i=0; i<dateFormat.length; i++)
		{
			if(dateFormat[i].indexOf("m") != -1)
			{Month = i;continue;}
			if(dateFormat[i].indexOf("d") != -1)
			{DD = i;continue;}
			if(dateFormat[i].indexOf("y") != -1)
			{Year = i;continue;}
		}
		var ArrDate = inputVal.split(this.GetSeparator(inputVal));
		return new Date(ArrDate[Year], (parseFloat(ArrDate[Month]) - 1) , ArrDate[DD]);
	}
	/*=====add fate func*/
	var ClientObject;
	function Field(obj, stats)
	{
		this.obj = obj;
		if(stats && obj.value.length == 0)
		{
			this.stats = true;
			this.valide = false;
		}
		else 
		{	
			this.stats = false;
			this.valide = true;
		}
	}
	function GetHour(sClientId, intHour)
	{
		obj = document.getElementById(sClientId);
		var s = new String(obj.value);
		var values = s.split(':');
		return parseInt(values[intHour],10);
	}
	var validationObjects = new Array();
	
	function ClientObj()
	{
		this.Fields = new Array;
		/*Methods*/
		this.Add = AddField;
		this.ChangeVal = OnChangeFieldVal;
		this.Compare = CompareFunc;
		this.Validate = ValidateClientObj; 
		this.Reset = _Reset;
		this.ResetOthers = _ResetOthers;
		this.RemoveItems = _Remove;
		this.OnErrorRaise = function(){}
		if (arguments.length == 0) _FillWithFields(this)
		else _FillWidthIDS(this, arguments[0]);
		validationObjects.push(this);
	}
	
	_INTERNAL_DICT = new Array;
	_INTERNAL_DICT["lowerdatetime"] = function(val, obj)
								  {
									var sobj = new String(val);
									var objValues = sobj.split(',');
									if(obj.value == "")
									{
										return true;
									}
									
									var lowerDate = new Date().NewDate(obj.value);
									lowerDate.setHours( GetHour(objValues[0],0), GetHour(objValues[0],1));
									
									var upperDate = new Date().NewDate(document.getElementById(objValues[1]).value);
									upperDate.setHours( GetHour(objValues[2],0), GetHour(objValues[2],1));
									
									
									if(upperDate <= lowerDate) return true;
									else return false;
								  }
	// objValue - is the input control which holds length of the word
	// obj - is the input which should be validated
	// if (obj.Value has a word with length greater than value in the objValue control)
	//{
	// return true;
	//}
	//else{
	// return false;
	//}
	_INTERNAL_DICT["wordlength"] = function(objValue, obj)
										{
											var sValue = document.getElementById(objValue).value;
											
											var intLength = parseInt(sValue,10);
											
											var objValues = obj.value.split(' ');
											
											for (var ii = 0; ii <objValues.length; ii++)
											{
												if (objValues[ii].length > intLength)
												{
													return false;
												}
											}
											return true;
										}
								  
	_INTERNAL_DICT["upperdate"] = function(lowerVal, obj)
								  {
									var upperVal = obj.value;
									
									if(obj.value == "")
									{
										return true;
									}
									var lowerVal = document.getElementById(lowerVal).value;
									
									if (lowerVal == "")
									{
										return true;
									}
									
									var lowerDate = new Date().NewDate(lowerVal);
									var upperDate = new Date().NewDate(upperVal);
									if(upperDate >= lowerDate) return true;
									else return false;
								  }
	_INTERNAL_DICT["comparevalue"] = function(firstVal, obj)
									{
										return (obj.value == document.getElementById(firstVal).value);
									}
	_INTERNAL_DICT["comparepass"] = function(firstVal, obj)
									{
										if (vPattern["general"].exec(obj.value))
										{
											var result = (obj.value == document.getElementById(firstVal).value);
											if (result)
											{
												result = vPattern["passwordM"].exec(obj.value);
												return result;
											}
											return false;
										}
										else 
										{
											err.Alert(obj, "general");
											return false;
										}
									}
	_INTERNAL_DICT["password"] = function(firstVal, obj)
									{
										if (vPattern["passwordM"].exec(obj.value))
										{
											if (obj.value.length < 6)
											{
												err.Alert(obj, "password")
												return false;
											}
											return true;
										}
										else 
										{
											err.Alert(obj, "password");
											return false;
										}
									}
	// input firstval format: "<,200"
	// means obj.vale < 200
	_INTERNAL_DICT["intrange"] = function(firstVal, obj)
									{
										var secondVal = obj.value;
										var arr = new Array();
										var expr;
										if (obj.getAttribute("stats").toLowerCase() == "true")
										{
											if (obj.value == "")
											{
												err.Alert(obj, "notEmpty");
												return false;
											}
										}
										if (vPattern["digits"].exec(secondVal))
										{
											if (obj.value == "")
											{
												return true;
											}
											arr = firstVal.split(",");
											expr = "parseInt(secondVal)" + arr[0] + "parseInt(arr[1])";
											var r = eval(expr);
											if (!r)
											{
												err.Alert(obj, "intrange", arr[0]+" " + arr[1]);	
											}
											return r;
										}
										else 
										{
											err.Alert(obj, "digits");
											return false;
										}
									}
	
	// input firstval format: "1,200" 
	// means: 1 < obj.value < 200
	var isNotSet = true;
	_INTERNAL_DICT["betwen"] = function(firstVal, obj)
									{
										var secondVal = obj.value;
										var arr = new Array();
										var expr;
										var arr = firstVal.split(",");
										if (vPattern["digits"].exec(secondVal))
										{
											if (isNotSet)
												TR_CLIENT_MESSAGES["betwen"] += " " + arr[0]+" & "+ arr[1];
											isNotSet = false;
											return(parseInt(arr[0]) < parseInt(secondVal) && parseInt(secondVal)  < parseInt(arr[1]));
										}
										else 
										{
											err.Alert(obj, "digits");
											return false;
										}
									}
	
	_INTERNAL_DICT["compareint"] = function(firstVal, obj)
									{
										var secondVal = obj.value;
										var firstVal = document.getElementById(firstVal).value;
										if(err.validate(obj))
										{
											if(parseInt(secondVal) >= parseInt(firstVal))
											{
												return true;
											}
										}
										return false;
									}
									
	_INTERNAL_DICT["checkboxvalidator"] = function(firstVal, obj)
								  {
									var params = firstVal.split(",");
									if (document.getElementById(params[0]).checked)
									{
										if (obj.value == "")
										{
											err.Alert(obj, "notEmpty");
											return false;
										}
										if (params.length > 1)
										{
											if (!vPattern[params[1]].exec(obj.value))
											{
												err.Alert(obj, params[1]);
												return false;
											}
										}
									}
									return true;
								  }
	_INTERNAL_DICT["internetservicerequered"] = function(firstVal, obj)
								  {
										if (document.getElementById(firstVal).checked && obj.value.length == 0)	
										{
											return false;
										}
										else return true;
								  }
	_INTERNAL_DICT["digitsalertnumber"] = function(firstVal, obj)
										{
											if (obj.value.length > 0 && !vPattern["digits"].exec(obj.value))
											{
												err.Alert(obj,"digits");
												return false;
											}
											if (obj.value == firstVal && !alreadyValide)
											{
												var strMsg = "digitsalertnumber" + firstVal;
												var b = window.confirm(TR_CLIENT_MESSAGES[strMsg]);
												return b;
											}
											return true;
										}
	_INTERNAL_DICT["standart_characters"] = function(firstVal, obj)
										{
											if (obj.value.length > 0 && !vPattern["standart_characters"].exec(obj.value))
											{
												err.Alert(obj,"general");
												return false;
											}
											return true;
										}
	// means obj.value only with numbers
	_INTERNAL_DICT["numbers"] = function(name, obj)
	{
		try {	
			var secondVal = obj.value;
			var arr = new Array();
			var val;
			if (obj.getAttribute("stats").toLowerCase() == "true")
			{
				if (obj.value == "")
				{
					err.Alert(obj, "notEmpty");
					return false;
				}
			}
			var numbers = /[0123456789]/g;
			if (new String(secondVal).replace(numbers,"") == "")
			{
				return true;
			}
			else 
			{
				err.Alert(obj, "digits");
				return false;
			}
		}
		catch (e) {
			alert("Error: " +e.description);
		}
	}
	_INTERNAL_DICT["multiemail"] = function(firstVal, obj)
										{
											if (obj.value.length > 0 && !vPattern["multiemail"].exec(obj.value))
											{
												err.Alert(obj,"multiemail");
												return false;
											}
											if (obj.value == firstVal && !alreadyValide)
											{
												var strMsg = "digitsalertnumber" + firstVal;
												var b = window.confirm(TR_CLIENT_MESSAGES[strMsg]);
												return b;
											}
											return true;
										}
	_INTERNAL_DICT["email"] =	function(firstVal, obj)
								{
									if (obj.value.length > 0 && !vPattern["email"].exec(obj.value))
									{
										err.Alert(obj,"email");
										return false;
									}
									return true;
								}
	function _ResetOthers()
	{
		for (var j = 0; j <validationObjects.length; j++)
		{
			if (this!=validationObjects[j]) validationObjects[j].Reset();
		}
	}
	function _Reset()
	{
		var unicode = /^(.*&#)|(&#)+.*$/im;
		for (var i = 0; i <this.Fields.length; i++)
		{
			if (((this.Fields[i].obj.getAttribute("validator"))&&(this.Fields[i].obj.getAttribute("validator").toLowerCase() != "nothing")) && ((!vPattern["general"].exec(this.Fields[i].obj.value) || unicode.exec(this.Fields[i].obj.value))))
			{
				this.Fields[i].obj.value = "";
			}
		}
	}
	
	function _Remove(ids)
	{
		var idsArr = ids.split(",");
		var arr = new Array();
		arr = this.Fields;
		for (var i=arr.length-1; i >= 0; i--)
		{
			for (var j = 0; j < idsArr.length; j++)
			{
				if(arr[i].obj.id == idsArr[j])
				{
					arr.splice(i, 1);
					break;
				}
			}
		}
		this.Fields = arr;
	}
	
	function CompareFunc(obj, comparedId)
	{
		for(var i=0; i<this.Fields.length;i++)
		{
			if(this.Fields[i].obj.id == obj.id)
			{
				var anotherElement = document.getElementById(comparedId);
				
				if(anotherElement != null && obj.value.length == 0 && anotherElement.value.length == 0)
				{
					 this.Fields[i].valide = true;
					 return true;
				}
				if(!_INTERNAL_DICT[obj.getAttribute("validator").toLowerCase()](comparedId, obj))
				{
					this.Fields[i].valide = false;
					return false;
				}
				else
				{
				  this.Fields[i].valide = true;
				  return true;
				}
			}
		}
	}
	
	function OnChangeFieldVal(obj)
	{
		for(var i=0; i<this.Fields.length;i++)
		{
			if(this.Fields[i].obj.id == obj.id)
			{
				
				var val = Trim(obj.value);
				if(obj.getAttribute("stats")=="true" && val.length == 0)
				{
					if(!err.ExistValidationRule(obj) && obj.getAttribute("validator") && obj.getAttribute("validator") != "nothing")
					{
						err.Alert(obj, obj.getAttribute("validator"));
					}
					this.Fields[i].valide = false;
					return;
				}
				
				if(val.length !=0 && !err.validate(obj))
				{
					this.Fields[i].valide = false;
					return;
				}	
				this.Fields[i].valide = true;
				return;	
			}
		}
	}
	function AddField(obj)
	{
		if (obj)
		{
			this.Fields[this.Fields.length] = new Field(obj, obj.getAttribute("stats"));
		}
	}
	function _FillWidthIDS(obj, ids)
	{
		var idsArr = ids.split(",");
		for (var i = 0; i < idsArr.length; i++)
		{
			obj.Add(document.getElementById(idsArr[i]));
		}
	}
	function _FillWithFields(This)
	{
		var arr = new Array;
		var arr1 = new Array;
		if(document.all)
		{
			arr = document.all.tags("INPUT");
			arr1 = document.all.tags("TEXTAREA");
		}
		else
		{ 
			arr = document.getElementsByTagName("INPUT");
			arr1 = document.getElementsByTagName("TEXTAREA");
		}
		var arr2 = new Array();
		for(var i = 0; i < arr.length; i ++)
		{
			if(arr[i].type=="submit" && !arr[i].getAttribute("Requires"))
			{
				var tmp = arr[i].onclick;
				//alert(tmp);
				if(!tmp) tmp = "function(){"+arr[i].getAttribute("onclick")+"};";
				arr[i].onclick = new Function("", "var f= "+tmp+"; var a = true; if(f) a = f();if (a || a+''=='undefined') {ClientObject.Reset();ClientObject.ResetOthers();}else return false;");
			}
			arr2.push(arr[i]);
		}
		for(var i = 0; i < arr1.length; i ++)
		{
			arr2.push(arr1[i]);
		}
		arr = arr2;
		var bool = false;
		try
		{
			if(HTMLElement)
			{
				bool = true;
			}
		}
		catch(e)
		{
			bool = false;
		}
		for(var i=0; i < arr.length;i++)
			if((arr[i].getAttribute("validator") && arr[i].getAttribute("validator") != "") || arr[i].getAttribute("stats"))
			{
				if (!bool && !arr[i].fireEvent)
				{
					arr[i].fireEvent = function(name){this.onchange();}
				}
				This.Add(arr[i]);
			}
		if (bool)
		{
			HTMLElement.prototype.fireEvent = function(name)	
			{
				if ((typeof eval("this."+name)).toString() == "function")
				{
					HTMLElement.prototype.tmp_F = this.onchange; 
					this.tmp_F();
				}
			}
		}
	}
	
	function AttachEventHandler(validator, obj)
	{
		if(validator == "upperdate")
		{
			var str = obj.onchange.toString();
			var id = str.split("this");
			id[1] = id[1].replace(/\'/g, "").replace(/\,/g,"").replace(/\)/g,"").replace(/\}/g,"").replace(/\"/g,"").replace(/\;/g,"");
			id[1] = Trim(id[1]);
			compare_obj = document.getElementById(id[1]);
			try
			{
				compare_obj.attachEvent("onchange", function(){obj.fireEvent("onchange")});
			}
			catch(Exception)
			{
				compare_obj.addEventListener("change", function(){obj.fireEvent("onchange")}, false);
			}
		}	
	}
	
	// in all cases we verify if the field is valid after firing onchange event
	// but in some cases we do not fiere event if field is valide, in this case we use alreadyValide variable
	var alreadyValide = false;	
	
	function ValidateClientObj()
	{	
		for(var i=0; i<this.Fields.length;i++)
		{
			alreadyValide = this.Fields[i].valide;
			//alert(this.Fields[i].obj.id + " valide = " +this.Fields[i].obj.onchange);
			if (this.Fields[i].obj.fireEvent)
			{
				this.Fields[i].obj.fireEvent("onchange");	
			}
			else
			{
				try
				{
					this.Fields[i].obj.onchange();
				}
				catch(ex){}
			}
			
			if(!this.Fields[i].valide)
			{
				if(this.Fields[i].obj.value.length == 0 && this.Fields[i].obj.getAttribute("stats")){
					tag = "notEmpty";
				}
				else tag = (this.Fields[i].obj.getAttribute("validator") && this.Fields[i].obj.getAttribute("validator")!= "nothing" ) ? this.Fields[i].obj.getAttribute("validator") : "notEmpty";
				err.Alert(this.Fields[i].obj, tag);
				
				return false;
			}
		}
		return true;
	}
	function Trim(str){
		var len = str.length;
		if(str.charCodeAt(0)==32 || str.charCodeAt(0)==10) str = Trim(str.substring(1,len));
		if(str.charCodeAt(len-1)==32 || str.charCodeAt(len-1)==10) str = Trim(str.substring(0,len-1));
		return str;
	}
/**form stop submit**/
	function FormSubmitHandler(id, evt)
	{
		var _clientObject = (arguments[2]) ? eval(arguments[2]) : ClientObject;
		id = id.split("$").join("_");
		var isIgnored = false;
		var _srcObject = document.getElementById(id);
		if(_srcObject)
		{
			isIgnored = _srcObject.getAttribute("Requires");
			if (!isIgnored && _clientObject) _clientObject.Reset();
		}
		if(isIgnored && _clientObject && !_clientObject.Validate())
		{
			_clientObject.OnErrorRaise();
			if(evt)
			{				
				try{evt.preventDefault();}
				catch(Exception){evt.returnValue = false;}
			}
			return false;
		} 
		else
		{
			if (_clientObject)_clientObject.ResetOthers();
			return true;
		}
	}
