(function(aTypes)
	{
		for(var j, i = 0; i < aTypes.length; ++i)
			for(j = 0; j < aTypes.length; ++j)
				window[aTypes[i]].prototype["is" + aTypes[j]] = window[aTypes[i]].prototype[aTypes[j].charAt(0).toLowerCase()]  = i == j;
	}(["Array", "Date", "String", "Boolean", "Number"]))
String.prototype.toArray = function(aSplit)
{
	return this.split(CbOS.is.Null(aSplit, ","));
};
Array.prototype.GV = function(aIndex, aParam)/*get value*/
{
	return (
			CbOS.is.Def(aParam = (aParam && !CbOS.is.Def(this[aIndex]))
			?
			this.GV(aIndex - 1, aParam)
			:
			this[aIndex]) && !aParam.isArray
		)
		?
		String(aParam)
		:
		aParam;
};
CbOS ={
	rem: function(aObj, aAll)
	{
		if(aObj)
		{
			var obj;
			if (aAll)
			{
				obj = aObj;
				while (aObj.hasChildNodes())
					aObj.removeChild(aObj.firstChild);
			}
			else
				(obj = aObj.parentNode).removeChild(aObj);
			return obj;
		}
	},
	to: {
		CamelCase: function(aStyle)
		{
			var list = [(aStyle = aStyle.split('-'))[0]];
			for(var i = 1; i < aStyle.length; ++i)
				list.push(aStyle[i].charAt(0).toUpperCase(), aStyle[i].substring(1));
			return list.join("");
		},
		Int: function(aValue)
		{
			return isNaN(aValue = parseInt(aValue, 10)) ? 0 : aValue;
		}
	},
	is: {
		ie: (navigator.appName == "Microsoft Internet Explorer"),
		op9: (navigator.appName == "Opera"),
		sf3: ((/safari/i).test(navigator.userAgent)), 
		In:function(aObj, n, i){return i ? aObj == n : CbOS.run.Recursion.a1(CbOS.is.In, aObj, n)},
		Null:function(a,b,c){with(CbOS) return (is.Def(a)||!is.Def(b)&&!is.Def(c))?a:is.Null(b,c)},
		InsertKeyPressed: false,
		Def:function(n){return n!=null && typeof n != "undefined"},
		Tag: function(aObj, aTag, aFlag){return aObj && aObj.nodeName && aObj.nodeName.toUpperCase() == aTag && aObj},
		Cls:function(o,n,i){if(o){
				if(i)
					return o==n;
				else if((o=o.className&&o.className.toArray(" ")))
					for(i=0;i<o.length;i++)
						if(CbOS.run.Recursion.a1(CbOS.is.In,o[i],n))
							return true
			}
		}
	},
	get: {
		EventObj: function(o)
		{
			if(!o||o.nodeName||!(o=o.srcElement||o.target)) return o;
			if(!o.nodeName) return;
			while(CbOS.is.Tag(o,["#TEXT","OPTION"])) o=o.parentNode;
			return o
		},
		PK: function()
		{
			var pk = "p" + (new Date() * 1).toString(32), pkn = 0;
			return function(aName)
			{
				if (aName)
					return aName;
				if (pkn > 99999)
				{
					pkn = 0;
					pk = "p" + (new Date() * 1).toString(32);
				};
				return pk + (++pkn).toString(32);
			}
		}(),
		Obj: function(aObj)
		{
			return document.getElementById(aObj);
		},
		Doc: function(aObj)
		{
			return aObj && (aObj.ownerDocument || aObj.document || aObj);
		},
		node:{
			Child: function(aObj, aName, aClass, aType)
			{
				if (aObj && (aObj.getElementsByTagName || ((aObj= CbOS.get.Doc(aObj)) && aObj.getElementsByTagName)) && (aObj = aObj.getElementsByTagName(aName)).length)
					with (CbOS.is)
						for (var i = 0; i < aObj.length; ++i)
							if ((!aClass || Cls(aObj[i], aClass)) && (!aType || In(aObj[i].type, aType)))
								return aObj[i];
			},
			Parent: function(aObj, aName, aClass, aCurrent)
			{
				if (aObj)
					with (CbOS.is)
						if(!aCurrent || Tag(aObj, aCurrent))
							for (aObj = aObj.parentNode; aObj; aObj = aObj.parentNode)
								if (Tag(aObj, aName) && (!aClass || Cls(aObj, aClass)))
									return aObj;
			},
			_FirstLast: function(aObj, aName, aProp)
			{
				with (CbOS.is)
					for (; aObj; aObj = aObj[aProp])
						if(aName ? Tag(aObj, aName) : !Tag(aObj, "#TEXT"))
							return aObj;
			},
			First: function(aObj, aName)
			{
				if (aObj && (aObj = aObj.firstChild))
					return CbOS.get.node._FirstLast(aObj, aName, "nextSibling")
			},
			Last: function(aObj, aName)
			{
				if (aObj && (aObj = aObj.lastChild))
					return CbOS.get.node._FirstLast(aObj, aName, "previousSibling")
			},
			_PrevNext: function(aObj, aName, aCount, aProp)
			{
				if (aCount)
				{
					do
						aObj = CbOS.get.node._PrevNext(aObj, aName, null, aProp);
					while (aObj && --aCount);
					return aObj
				}
				else if (aObj)
					with (CbOS.is)
						for (aObj = aObj[aProp]; aObj; aObj = aObj[aProp])
							if (aName ? Tag(aObj, aName) : !Tag(aObj, "#TEXT"))
								return aObj;
			},
			Prev: function(aObj, aName, aCount)
			{
				if (aObj)
					return CbOS.get.node._PrevNext(aObj, aName, aCount, "previousSibling");
			},
			Next: function(aObj, aName, aCount)
			{
				if (aObj)
					return CbOS.get.node._PrevNext(aObj, aName, aCount, "nextSibling");
			},
			Sibling: function(aObj, aCount)
			{
				var obj,
					method = CbOS.get.node[aCount < 0 ? "Prev" : "Next"];
				for (var i = -Math.abs(aCount); (obj = method(aObj)) && i < 0; ++i)
					aObj = obj;
				return aObj;
			}
		},
		Style:function(o,s,n,r){
			if(o) with(CbOS){
				if(!(r=o.style[to.CamelCase(s)])){
					if(document.defaultView)
						r=document.defaultView.getComputedStyle(o,"").getPropertyValue(s);
					else
						if(o.currentStyle)
							r=o.currentStyle[to.CamelCase(s)]
				};
				return n?to.Int(r):r
			};
			return 0
		}
	}
}
CbOS.set =
{
	Event: new Function("s", CbOS.get.Event="return typeof s == 'string' ? new Function("+(CbOS.is.ie?'':"'event',")+"s):s"),
	Attach:function(aObj, aEvent,aFunc)
	{
		aFunc = CbOS.set.Event(aFunc)
		if(aObj[aEvent]||window.attachEvent)
			aObj[aEvent]=aFunc;
		else if(aObj.addEventListener)
			aObj.addEventListener(aEvent.substring(2,aEvent.length),aFunc,false);
	},
	DetachEvent:function(o,e,f)
	{
		if(window.attachEvent)
			o.detachEvent(e, f)
		else if(o.addEventListener)
			o.removeEventListener(e.substring(2,e.length),f);
	},
	CBubble: function(aEvent, f)
	{
		if(!aEvent) return;
		if(CbOS.is.Def(aEvent.cancelable))
		{
			if(aEvent.preventDefault && aEvent.cancelable)
				aEvent.preventDefault();
			if(aEvent.stopPropagation)
				aEvent.stopPropagation();
		}else
			if(aEvent.keyCode!=17&&aEvent.keyCode!=16){aEvent.cancelBubble=true; try{aEvent.keyCode=0}catch(f){} return aEvent.returnValue=false}
	},
	MaxLength: function(aObj, alength)
	{
		return aObj.maxLength = (aObj.getAttribute("maxlength") || alength || 250) * 1;
	},
	Param:function(aSource, aTarget)
	{
		aTarget = aTarget ? aTarget : {};
		if(aSource){
			for(var i in aSource)
				aTarget[i]=aSource[i];
		};
		return aTarget;
	},
	nParam:function(a,o,i){
		o=o?o:{};
		if(a){
			if(a.a){
				for(i=0;i<a.length;i++)
					if(CbOS.is.Def(a[i].a?a[i][1]:a[1+i]))
						o[a[i].GV(0)]=a[i].a?a[i][1]:a[1+i++];
			}else
				for(i in a)
					if(CbOS.is.Def(a[i]))
						o[i]=a[i];
		};
		return o},
	Style: function(aObj, aStyle, aValue, e){
		with(CbOS){
			if (aStyle && aStyle.isArray)
				for (var i = 0; i < aStyle.length; ++i)
					set.Style(aObj, aStyle[i], aValue);
			else if (aObj && aObj.isArray)
				for (var i = 0; i < aObj.length; ++i)
					set.Style(aObj[i], aStyle, aValue);
			else if (aStyle && aObj)
			{
				var n = to.CamelCase(aStyle)
				if (!aObj.CbOSStyle)
					aObj.CbOSStyle = create.Obj(aObj);
				if (!aObj.CbOSStyle[n])
						aObj.CbOSStyle[n] = get.Style(aObj, aStyle);
				if ((aValue = String(is.Null(aValue,aObj.CbOSStyle[n]))) != get.Style(aObj, aStyle))
				{
					try
					{
						aObj.style[n] = aValue
					}catch(e)
					{
						if(w.DebugMode)
							alert(n + "\n" + aValue + "\n" + aObj.outerHTML)
					}
				}
			}
		};
		return aObj
	},
	Value: function(aObj, aStr)
	{
		if (CbOS.is.ie && document.selection)
		{
			var r = aObj.createTextRange();
			r.collapse(false);
			r.text = aStr;
			r = aObj.createTextRange();
			r.moveStart("textedit",1);
			r.select();
		} else if (aObj.selectionStart)
		{
			var scrollTop = aObj.scrollTop, scrollLeft = aObj.scrollLeft;
			aObj.value = aStr;
			if (aObj.scrollTop != scrollTop) aObj.scrollTop = scrollTop;
			if (aObj.scrollLeft != scrollLeft) aObj.scrollLeft = scrollLeft;
		}
	}
}
CbOS.create={
	Obj:function(o){return new Object()},
	Element:function(aNode, aParent, aClass, aId, aType, aValue)
	{
		if (!aParent)
			aParent = d.body;
		var obj;
		with(CbOS)
			if (aClass && aClass.isArray)
				for(var j = 0; j < aClass.length; ++j)
					obj = create.Element(aNode, aParent, aClass[j], aId, aType, aValue);
			else
				obj = aParent.appendChild(
						set.nParam([
							['type', aType],
							['id', aId],
							['name', aId],
							['value', aValue],
							['className', aClass]
						],
						document.createElement(aNode)
					)
				);
		return obj;
	},
	Xml:window.ActiveXObject ? function(o){return new ActiveXObject(CbOS.create.XmlHttpProgID())} : function(o){return new XMLHttpRequest()},
	XmlHttpProgID:function(){
		if (CbOS.create._XmlHttpProgID)
			return CbOS.create._XmlHttpProgID;
		for(var e,
			p = ["MSXML2.XMLHTTP.7.0","MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"],
			i = 0; i < p.length; ++i)
			try{
				var o = new ActiveXObject(p[i]);
				return CbOS.create._XmlHttpProgID = p[i]
			}
			catch(e){}
    }
}
CbOS.run={
	Enter:function(i){
		with(CbOS){
			var isSetEnter=true, k;
			while(!is.Tag(i,"BODY")){
				if(isSetEnter && (k=i.getAttribute("setEnter"))&& (k = get.Obj(k)) && !k.disabled)
				{	
					isSetEnter=false
					k.onclick()
					k.form.submit()
				};
				i=i.parentNode
			}
			return isSetEnter
		}
	},
	CancelEnter: function(e)
	{
		var o
		if(e.keyCode==13 && CbOS.is.Tag(o = CbOS.get.EventObj(e),"INPUT"))
		{
			if(!CbOS.run.Enter(o, e))
			{
				var err;
				try
				{
					o.blur();
					o.focus()
				}
				catch(err){}
			};
			CbOS.set.CBubble(e)
		}
	},
	Recursion:{
		a1: function(aFunction, aData, aObj)
		{
			if (aObj && aObj.isArray)
			{
				for (var i = 0; i < aObj.length; ++i)
				{
					if (this.a1(aFunction, aData, aObj[i]))
						return true;
				}
			}else
				return aFunction(aData, aObj, true);
		}
	}
}
CbOS.OperatedInput = {
	Rules:
	{
		Color:
		{
			RExp: /^[0-9a-f]{0,6}$/i,
			DoneExp: /^[0-9a-f]{6}$/i
		},
		Phone:
		{
			RExp: /^((\()?\d{0,3}(\))?)?(-| )?\d{0,3}(-| )?\d{0,4}$/,
			DoneExp: /^((((\(\d{3}\))|(\d{3}))?(-| )?\d{3})(-| )?\d{4}|(\d{7})|(\d{10}))$/,
			Template: [[/^\(\d{3}$/, ") "]]
		},
		PhoneEx:
		{
			RExp: /^\d{0,3}-?\d{0,3}-?\d{0,4}$/,
			DoneExp: /^\d{3}-?\d{3}-?\d{4}$/,
			Template: [[/^.{3}$/, "-"], [/^\d{0,3}-\d{3}$/, "-"]],
			Ex: "XXX-XXX-XXXX",
			ResultTest: function(aObj, aValue)
			{
				return this.DoneExp.test(aValue)
			},
			ErrorMessage: "Please, enter a valid phone number.\nEx.: 555-555-5555."
		},
		Integer:
		{
			RExp:
			[
				/^\d{0,1}$/,
				/^\d{0,2}$/,
				/^\d{0,3}$/,
				/^\d{0,4}$/,
				/^\d{0,5}$/,
				/^\d{0,6}$/,
				/^\d{0,7}$/,
				/^\d{0,8}$/,
				/^\d{0,9}$/,
				/^\d{0,10}$/,
				/^\d{0,11}$/,
				/^\d{0,12}$/,
				/^\d{0,13}$/,
				/^\d{0,14}$/,
				/^\d{0,15}$/,
				/^-?\d{0,1}$/,
				/^-?\d{0,2}$/,
				/^-?\d{0,3}$/,
				/^-?\d{0,4}$/,
				/^-?\d{0,5}$/,
				/^-?\d{0,6}$/,
				/^-?\d{0,7}$/,
				/^-?\d{0,8}$/,
				/^-?\d{0,9}$/,
				/^-?\d{0,10}$/,
				/^-?\d{0,11}$/,
				/^-?\d{0,12}$/,
				/^-?\d{0,13}$/,
				/^-?\d{0,14}$/,
				/^-?\d{0,15}$/
			],
			DoneExp: /^(\+|-)?\d{0,10}$/,
			ResultTest: function(aObj, aValue)
			{
				CbOS.OperatedInput.Rules.Integer.Init(aObj)
				if (this.DoneExp.test(aValue))
					return parseFloat(aValue, 10).Between(aObj.validationInfo.MinValue, aObj.validationInfo.MaxValue);
			},
			Init: function(aObj, aMinLength)
			{
				with (CbOS)
				{
					var obj = aObj.validationInfo
					if (!is.Def(obj.RExpIndex))
					{
						var min = is.Def(obj.MinValue) ? to.Float(obj.MinValue) : -Infinity,
						max = is.Def(obj.MaxValue) ? to.Float(obj.MaxValue) : Infinity,
						minus = (min < 0) * 1,
						maxLength = Math.min(15 + minus, (aObj.maxLength || (aObj.maxLength = 15 + minus))) - minus,
						num = (obj.DataType == "Integer" ? 9 : 9.99).PadL(maxLength, 9);
						min = obj.MinValue = Math.max(min, -1 * num);
						max = obj.MaxValue = Math.min(max, 1 * num);
						minus = (min < 0) * 1;
						obj.RExpIndex = minus * 15 + Math.max(Math.min(15 + minus, (aObj.maxLength || (aObj.maxLength = 15 + minus))) - (aMinLength || 1) - minus, 0);
					};
				}
			},
			RealTime: function(aObj, aValue, aMinLength)
			{
				CbOS.OperatedInput.Rules.Integer.Init(aObj, aMinLength)
				return this.Validate(aObj, aValue, this.RExp[aObj.validationInfo.RExpIndex]);
			},
			ClientVal: function(aObj, aValue)
			{
				return this.Validate(aObj, aValue, this.DoneExp);
			},
			Validate: function(aObj, aValue, aRegExp)
			{
				return this.Between(aValue, aObj.validationInfo.MinValue, aObj.validationInfo.MaxValue) && aRegExp.test(aValue)
			},
			Between: function(aValue, aMin, aMax)
			{
				if (aMin >= 0 && aMax >= 0)
					return aValue >= 0 && aValue <= aMax;
				if (aMin <= 0 && aMax <= 0)
					return Math.abs(aValue) <= -aMin;
				if (aMin <= 0 && aMax >= 0)
					return Math.abs(aValue) <= Math.max(-aMin, aMax);
				return true
			}
		},
		Decimal:
		{
			RExp:
			[
				/^\d{0,3}(\.\d{0,2})?$/,
				/^\d{0,4}(\.\d{0,2})?$/,
				/^\d{0,5}(\.\d{0,2})?$/,
				/^\d{0,6}(\.\d{0,2})?$/,
				/^\d{0,7}(\.\d{0,2})?$/,
				/^\d{0,8}(\.\d{0,2})?$/,
				/^\d{0,9}(\.\d{0,2})?$/,
				/^\d{0,10}(\.\d{0,2})?$/,
				/^\d{0,11}(\.\d{0,2})?$/,
				/^\d{0,12}(\.\d{0,2})?$/,
				/^\d{0,13}(\.\d{0,2})?$/,
				/^\d{0,14}(\.\d{0,2})?$/,
				/^-?\d{0,3}(\.\d{0,2})?$/,
				/^-?\d{0,4}(\.\d{0,2})?$/,
				/^-?\d{0,5}(\.\d{0,2})?$/,
				/^-?\d{0,6}(\.\d{0,2})?$/,
				/^-?\d{0,7}(\.\d{0,2})?$/,
				/^-?\d{0,8}(\.\d{0,2})?$/,
				/^-?\d{0,9}(\.\d{0,2})?$/,
				/^-?\d{0,10}(\.\d{0,2})?$/,
				/^-?\d{0,11}(\.\d{0,2})?$/,
				/^-?\d{0,12}(\.\d{0,2})?$/,
				/^-?\d{0,13}(\.\d{0,2})?$/,
				/^-?\d{0,14}(\.\d{0,2})?$/
			],
			DoneExp: /^-?\d*(\.\d{0,2})?$/,
			Validate: function(aObj, aValue, aRegExp)
			{
				var k = aValue.match(/\./) ? 1 : 100;
				return (aValue == "." || CbOS.OperatedInput.Rules.Integer.Between(aValue, k * aObj.validationInfo.MinValue, k * aObj.validationInfo.MaxValue)) && aRegExp.test(aValue)
			},
			RealTime: function(aObj, aValue)
			{
				return  CbOS.OperatedInput.Rules.Integer.RealTime.apply(this, [aObj, aValue, 4])
			}
		},
		SSN:
		{
			RExp: /^\d{0,3}-?\d{0,2}-?\d{0,4}$/,
			DoneExp: /^\d{3}-?\d{2}-?\d{4}$/,
			Template: [[/^\d{3}$/,"-"],[/^\d{3}-\d{2}$/,"-"]]
		},
		Email:
		{
			RExp: /^[\w\s;.\[\]\-'@]*$/i
		},
		Custom:
		{
			RealTime: function(aObj, aValue)
			{
				return (aObj = aObj.validationInfo.RealTimeExp) && aObj.test(aValue);
			}
		},
		Time:
		{
			RExp: /^((((([01]?[0-9])|(2[0-3]))?)(:|(:[012345]?[0-9]))?) ?|(((0|(0?[1-9])|(1[012]))?)(:|(:([012345]?[0-9])? ?([ap]|[ap]m|m)?))?))$/i,
			DoneExp: /^(((([01]?[0-9])|(2[0-3])):[012345]?[0-9] ?)|(((0?[1-9])|(1[012])):[012345]?[0-9] ?([ap]m)?))$/i,
			Template: [[/^((\d{2})|[3-9])$/, ":"], [/^\d{1,2}:.{1,2} *[ap]$/, "m"], [/^.{1,2}:.{1,2} *[AP]$/, "M"]]
		},
		Date:
		{
			RExp: /^(0?|(0?[1-9])|(1[012]))(\/|\/((0?[1-9])|([12]?[0-9])|(3[01]))?((\/)|(\/[0-9]{0,4}))?)?$/,
			DoneExp: /^((0?[1-9])|(1[012]))\/((0?[1-9])|([12][0-9])|(3[01]))\/(([0-9]{1,2})|([0-9]{4}))$/,
			Template: [[/^((\d{2})|[2-9])$/, "/"], [/^\d{1,2}\/((\d{2})|([4-9]))$/,"/"]],
			RealTime: function(aObj, aValue)
			{
				return this.Validate(aObj, aValue, "RExp");
			},
			ClientVal: function(aObj, aValue)
			{
				return this.Validate(aObj, aValue, "DoneExp");
			},
			Validate: function(aObj, aValue, aValType)
			{
				return this[aValType].test(aValue)
			}
		},
		DateTime:
		{
			RExp: /^((((0?|(0?[1-9])|(1[012]))(\/|\/((0?[1-9])|([12]?[0-9])|(3[01]))?((\/)|(\/[0-9]{0,4}))?)?)?( ((((([01]?[0-9])|(2[0-3]))?)(:|(:[012345]?[0-9]))?) ?|(((0|(0?[1-9])|(1[012]))?)(:|(:([012345]?[0-9])? ?([ap]|[ap]m|m)?))?)))?)|((((([01]?[0-9])|(2[0-3]))?)(:|(:[012345]?[0-9]))?) ?|(((0|(0?[1-9])|(1[012]))?)(:|(:([012345]?[0-9])? ?([ap]|[ap]m|m)?))?)))$/i,
			DoneExp: /^((0?[1-9])|(1[012]))\/((0?[1-9])|([12][0-9])|(3[01]))\/(([0-9]{1,4}))( (((([01]?[0-9])|(2[0-3])):[012345]?[0-9] ?)|(((0?[1-9])|(1[012])):[012345]?[0-9] ?([ap]m)?)))?$/i,
			Template: [
						[/^((\d{2})|[2-9])$/, "/"],
						[/^\d{1,2}\/((\d{2})|([4-9]))$/,"/"],
						[/^.{1,2}\/.{1,2}\/\d{4}$/, " "],
						[/^.{1,2}\/.{1,2}\/.{2,4} ((\d{2})|[3-9])$/, ":"],
						[/^.{1,2}\/.{1,2}\/.{2,4} .{1,2}:.{1,2} *[ap]$/, "m"],
						[/^.{1,2}\/.{1,2}\/.{2,4} .{1,2}:.{1,2} *[AP]$/, "M"],
						[/^\d{1,2}:.{1,2} *[ap]$/, "m"],
						[/^.{1,2}:.{1,2} *[AP]$/, "M"]
				]
		}
	},
	GetCaretPos: function (aObj)
	{
		if (CbOS.is.Def(aObj.selectionStart))
			return aObj.selectionStart;
		if (CbOS.is.ie && document.selection)
		{
			var doc = CbOS.get.Doc(aObj);
			var t = false;
			var oldElem = doc.activeElement;
			if (oldElem != aObj)
			{
				aObj.focus();
				t = true;
			};
			var sel = doc.selection.createRange();
			if (aObj.type == 'textarea')
			{
				var clone = sel.duplicate();
				sel.collapse(true);
				clone.moveToElementText(aObj);
				clone.setEndPoint('EndToEnd', sel);
				if (t)
					oldElem.focus();
				return clone.text.length;
			}
			else
			{
				sel.collapse(true);
				sel.moveStart("textedit", -1);
				if (t)
					oldElem.focus();
				return sel.text.length;
			}
		};
		return 0;
	},
	GetSelectedText: function(aObj)
	{
		if(CbOS.is.Def(aObj.selectionStart))
			return aObj.value.substring(aObj.selectionStart, aObj.selectionEnd);
		if (CbOS.is.ie)
			return CbOS.get.Doc(aObj).selection.createRange().text;
		return "";
	},
	InsertString: function(aString, aChar, aPos)
	{
		return [aString.substr(0, aPos), aChar, aString.substr(aPos)].join("");
	},
	AllowDropFF: function(event)
	{
		var obj = event.target
		if (obj && obj.getAttribute("validate"))
		{
			if (!obj.getAttribute("RTV")) CbOS.OperatedInput.ReadValidationInfo(obj);
			if (obj.getAttribute("RTV")!="false")
			{
				window.dragTarget={oldText: obj.value, rangeOffset: event.rangeOffset};
				window.addEventListener("mouseover", CbOS.OperatedInput.DragDropComplete, true);
			}
		}
	},
	DragDropComplete: function(event)
	{
		var obj = event.target, validateble = obj.getAttribute("rtv");
		if (!validateble || (validateble=="false"))
			return
		window.removeEventListener("mouseover", CbOS.OperatedInput.DragDropComplete, true);
		var oldText=window.dragTarget.oldText,
			newText=obj.value||"", r,
			rangeOffset=window.dragTarget.rangeOffset,
			insertedText = newText.substr(rangeOffset, newText.length - oldText.length)

		newText = [newText.substr(0, rangeOffset), insertedText, oldText.substr(rangeOffset)];
		for (var i = insertedText.length; i > 0 ; i--)
		{
			if (CbOS.OperatedInput.TestData(obj, r = newText.join("")))
			{
				CbOS.set.Value(obj, r);
				return
			};
			newText[1] = newText[1].slice(0, -1);
		};
		CbOS.set.Value(obj, oldText);
	},
	DeleteString: function(aString, aPos, aDirection, aSelLen)
	{
		if (aDirection > 0 || aSelLen)
		{
			if (aSelLen == 0)
				aSelLen = 1;
			return aString.substr(0, aPos) + aString.substr(aPos + aSelLen);
		}
		return  aString.substr(0, aPos - 1) + aString.substr(aPos);
	},
	EnableSearch: function(aObj, aValid)
	{
		if (aValid || !aObj.value)
			CbOS.Validation.ErrorHide(aObj)
	},
	isNotChar: function(aEvent)
	{
		return (!aEvent.shiftKey) ?
			CbOS.is.In(aEvent.which, [0, 9, 16, 17, 18, 19, 20, 27, 33, 35, 34, 36, 45,144,145])
			:
			CbOS.is.In(aEvent.which, [9])
	},
	AllowType: function (aObj, aEvent)
	{
		var keyCode = aEvent.keyCode;
		
		if(keyCode == 13 && aObj.tagName!="TEXTAREA")
		{
			if(aObj.form.fireEvent)
				aObj.form.fireEvent("onsubmit")
			else
			{
				var oEvent = document.createEvent("HTMLEvents");
				oEvent.initEvent("submit", true, true);
				aObj.form.dispatchEvent(oEvent);
			}
			return false
		}
		if (aEvent.ctrlKey
			||
			aEvent.altKey
			||
			(
				aEvent.preventDefault && (aEvent.charCode == 0 || (CbOS.is.op9 && CbOS.OperatedInput.isNotChar(aEvent)))
				&&
				(
						!(keyCode == 46 || keyCode == 8)
					||
					(keyCode == 46 && aEvent.type == "keypress")
				)
			)
		)
			return;
			var newValue,
			selLen = CbOS.OperatedInput.GetSelectedText(aObj).length,
			curVal = aObj.value
			if (selLen == 0 && CbOS.is.InsertKeyPressed)
				selLen = 1
			caretPos = CbOS.OperatedInput.GetCaretPos(aObj);
		CbOS.OperatedInput.SetOIParameters(aObj, "autocomplit", true);
		if ((keyCode = aEvent.charCode || keyCode) == 8)
		{
			newValue = CbOS.OperatedInput.DeleteString(curVal, caretPos, -1, selLen);
			CbOS.OperatedInput.SetOIParameters(aObj, "autocomplit", false);
		}
		else if (keyCode == 46 && aEvent.type == "keydown")
		{
			newValue = CbOS.OperatedInput.DeleteString(curVal, caretPos, 1, selLen);
			CbOS.OperatedInput.SetOIParameters(aObj, "autocomplit", false);
		}
		else
		{
			newValue = curVal;
			if (selLen > 0)
				newValue = CbOS.OperatedInput.DeleteString(newValue, caretPos, 1, selLen);
			newValue = CbOS.OperatedInput.InsertString(newValue, String.fromCharCode(keyCode), caretPos);
		};
		CbOS.OperatedInput.SetOIParameters(aObj, "prevValue", curVal);
		if  (newValue.length != 0 && !CbOS.OperatedInput.TestData(aObj, newValue))
			CbOS.set.CBubble(aEvent);
		else
			CbOS.OperatedInput.SetOIParameters(aObj, "prevValue", newValue);
	},
	AllowInsert: function(aObj, aEvent)
	{
		var newText = aObj.value,
			oldText = aObj.OIParam.prevValue||"",
			insertedText
		if(newText != oldText)
		{
				if(CbOS.OperatedInput.TestData(aObj, newText))
				{
					CbOS.OperatedInput.SetOIParameters(aObj, "prevValue", newText);
					return
				}
			var dd = oldText.length - newText.length;
			for (var rangeOffset = 0; rangeOffset<oldText.length && oldText.charAt(rangeOffset) == newText.charAt(rangeOffset) ; ++rangeOffset );
			for (var j = oldText.length - 1; j >= rangeOffset && oldText.charAt(j) == newText.charAt(j - dd); --j);

			newText=[newText.substr(0, rangeOffset), insertedText = newText.substr(rangeOffset, j-rangeOffset+1-dd), oldText.substr(j+1)]
			for (var i = insertedText.length; i >= 0 ; i--)
				{
					r = newText.join("");
					if (CbOS.OperatedInput.TestData(aObj, r))
					{
						CbOS.OperatedInput.SetOIParameters(aObj, "prevValue", r);
						CbOS.set.Value(aObj, r);
						return;
					};
					newText[1] = newText[1].slice(0,-1);
				};
			}
			CbOS.set.Value(aObj, oldText);
	},
	HandleBS: function(aEvent)
	{
		if (aEvent.keyCode == 8 || aEvent.keyCode == 46)
			this.AllowType(aEvent.srcElement || aEvent.target, aEvent);
	},
	SetOIParameters: function(aObj, aParamName, aValue)
	{
		if (!aObj.OIParam)
			aObj.OIParam = {};
		aObj.OIParam[aParamName] = aValue;
	},
	AllowPaste: function(aObj, aEvent)
	{
		var clipData = aEvent.clipboardData || window.clipboardData;
		if (clipData)
		{
			with (window)
			{
				var cbValue = oldCBValue = clipData.getData('Text'),
			objValue = aObj.value,
			selLen = CbOS.OperatedInput.GetSelectedText(aObj).length,
			caretPos = CbOS.OperatedInput.GetCaretPos(aObj);
		CbOS.OperatedInput.SetOIParameters(aObj, "OldCBValue", oldCBValue);
		if (selLen > 0)
			objValue = this.DeleteString(objValue, caretPos, 1, selLen);
		var newVal = "";
		for (var i = Math.min(cbValue.length, aObj.maxLength || CbOS.set.MaxLength(aObj)) ; i >= 0; --i)
			if (CbOS.OperatedInput.TestData(
					aObj,
					newVal = CbOS.OperatedInput.InsertString(
						objValue,
						cbValue = cbValue.substr(0, i),
						caretPos
					)
				)
			)
				break;
		if (cbValue.length == 0)
		{
			aEvent.returnValue = false;
			clipData.setData('Text', oldCBValue);
		}
		else
		{
			if(clipData.setData('Text', cbValue))
				setTimeout("if (window.top && top.CbOS) CbOS.OperatedInput.RestoreCBValue('" + (aObj.id || (aObj.id = top.CbOS.get.PK())) + "', window)", 10);
			else{
				CbOS.OperatedInput.SetOIParameters(aObj, "prevValue", newVal);
				aObj.value=newVal;
				aObj.selectionStart=caretPos;
				aObj.selectionEnd = caretPos + cbValue.length;
				aEvent.returnValue = false;
				CbOS.set.CBubble(aEvent);
			}
		};
			}
		}
	},
	RestoreCBValue: function(aObj, aWin)
	{
		if (
			(aObj = CbOS.get.Obj(aObj, aWin))
			&&
			(aObj = aObj.OIParam)
		)
			aWin.clipboardData.setData('Text', aObj.OldCBValue || "");
	},
	AllowDrop: function(aObj, aEvent)
	{
		var cbValue = aEvent.dataTransfer.getData('Text');
		caretPos = CbOS.OperatedInput.GetCaretPos(aObj);
		for (var i = Math.min(cbValue.length, aObj.maxLength || CbOS.set.MaxLength(aObj)); i >= 0; --i)
			if (this.TestData(aObj, CbOS.OperatedInput.InsertString(aObj.value, (cbValue = cbValue.substr(0, i)), caretPos)))
				break;
		aEvent.dataTransfer.setData('Text', cbValue);
	},
	TestData: function(aObj, aNewValue)
	{
		var prmObj = aObj.OIParam
		if (prmObj && prmObj.timerID)
		return false;
		var ml;
		if (
			CbOS.is.Tag(aObj, "TEXTAREA")
			&& (ml = aObj.maxLength || CbOS.set.MaxLength(aObj))
			&& !(res = (aNewValue.length <= ml))
			)
			return false;
		var res = true, lRegExp = null, mask = null,
			maskId = aObj.validationInfo && (aObj.validationInfo.ValidationType || aObj.validationInfo.DataType),
			afterEventCommand = "";
		var condition;
		if (aObj.validationInfo.typeConditions)
		{
			for ( var i = 0; i < aObj.validationInfo.typeConditions.length; ++i )
				if ((condition = aObj.validationInfo.typeConditions[i][0]) && typeof(condition.test) == "function")
				{
					if(condition.test(aNewValue) && !aObj.validationInfo.typeConditions[i][1].apply(aObj, [aNewValue]))
					return false;
				}else
					if(typeof(condition) == "function" && condition.apply && condition.apply(aObj, [aNewValue])&& !aObj.validationInfo.typeConditions[i][1].apply(aObj, aNewValue))
					return false;
		}
		var temlArray;
		if
		(
			(mask = CbOS.OperatedInput.Rules[maskId])
			&&
			!(res = mask.RealTime ? mask.RealTime(aObj, aNewValue) : (lRegExp = mask.RExp).test(aNewValue))
			&&
			prmObj && prmObj.autocomplit
			&&
			(!CbOS.is.Def(aObj.validationInfo.UseTemplate) || aObj.validationInfo.UseTemplate == "true")
			&&
			(temlArray = aObj.validationInfo.Template || mask.Template)
		)
			for (var i = 0; i < temlArray.length; ++i )
			{
				var posibleValue = aNewValue.substr(0, aNewValue.length - 1) + temlArray[i][1] + aNewValue.substr(aNewValue.length - 1, 1);
				if (res = mask.RealTime ? mask.RealTime(aObj, posibleValue) : lRegExp.test(posibleValue))
				{
					CbOS.OperatedInput.AddTemplateCharacters(CbOS.get.Doc(aObj), aObj.id || (aObj.id = CbOS.get.PK()) , temlArray[i][1]);
					aNewValue = posibleValue;
					break;
				};
			};
		if (!res) return false;
		if (CbOS.is.Def(mask) && prmObj && prmObj.autocomplit && aObj.validationInfo.UseTemplate == "true" && mask.Template)
			for ( var temlArray = mask.Template, i = 0; i < temlArray.length; ++i )
				if (!(temlArray[i][0].test(aNewValue.substr(0, aNewValue.length - 2)) &&
					aNewValue.substr(aNewValue.length - 1, 1) == aNewValue.substr(aNewValue.length - 2, 1))&& temlArray[i][0].test(aNewValue))
				{
					afterEventCommand += "CbOS.OperatedInput.AddTemplateCharacters(document, '" + (aObj.id || (aObj.id = CbOS.get.PK())) + "', '" + temlArray[i][1]+"');";
					aNewValue += temlArray[i][1];
					break;
				};
		if (afterEventCommand && res)
		{
			if (prmObj && prmObj.timerID)
				clearTimeout(prmObj.timerID);
			CbOS.OperatedInput.SetOIParameters(aObj,
				'timerID',
 				setTimeout("if(window.CbOS){" +afterEventCommand + "var o = document.getElementById('" + (aObj.id || (aObj.id = CbOS.get.PK()))+"'); if (o) CbOS.OperatedInput.SetOIParameters(o, 'timerID', null);}", 10));
		}
		return res
	},
	AddTemplateCharacters: function(aDoc, aObjId, aStr)
	{
		var obj = CbOS.get.Obj(aObjId);
		if (obj)
			if (CbOS.is.ie && aDoc.selection)
			{
				var r = obj.createTextRange();
				r.collapse(false);
				r.text = aStr;
				r = obj.createTextRange();
				r.moveStart("textedit",1);
				r.select();
			} else if (obj.selectionStart)
			{
				var scrollTop = obj.scrollTop, scrollLeft = obj.scrollLeft;
				obj.value += aStr;
				if (obj.scrollTop != scrollTop) obj.scrollTop = scrollTop;
				if (obj.scrollLeft != scrollLeft) obj.scrollLeft = scrollLeft;
			}
	},
	ValidateValue: function(aObj, aNewValue)
	{
		if (!aObj.getAttribute("RTV")) CbOS.OperatedInput.ReadValidationInfo(aObj);
		if (aObj.getAttribute("RTV") == "true")
		{
			var maskId = aObj.validationInfo && (aObj.validationInfo.ValidationType || aObj.validationInfo.DataType);
			if (maskId)
				return CbOS.OperatedInput.Rules[maskId].ResultTest(aObj, aNewValue);
		}
	},
	GetErrorMessage: function(aObj)
	{
		var maskId = aObj.validationInfo && (aObj.validationInfo.ValidationType || aObj.validationInfo.DataType);
		if (maskId)
			return CbOS.OperatedInput.Rules[maskId].ErrorMessage;
	},
	timerID: null,
	InsertRem: function(aDoc, aObjId, aNewValue, aFullValue)
	{
		var s
		if (is.ie && aDoc.selection && (s = aDoc.getElementById(aObjId)) && s.OIParam && s.OIParam.autocomplit)
		{
			var r = s.createTextRange(),
				newText = aFullValue.substr(aNewValue.length);
			r.collapse(false);
			r.text = newText;
			r = s.createTextRange();
			r.moveStart("character", aFullValue.length - newText.length);
			r.select();
		};
	},
	FindStr: function(aStr, aArray)
	{
		var specialCharacters = /([\\\^\$\*\+\?\.\|\(\)\[\]\{\}])/ig;
		return function()
		{
			var r, re = new RegExp().compile("^" + aStr.replace(specialCharacters, "\\$1"), "i");
			for (var i = 0; i < aArray.length; ++i )
				if ((aStr = aArray[i][0]) && aStr.match(re))
					return i;
			return false
		}(aStr, aArray)
	},
	SetEventsHandlers: function(aObj)
	{
		with(CbOS.set)
		{
			Attach(aObj, "onkeydown",	"CbOS.OperatedInput.HandleBS(event)");
			Attach(aObj, "onkeypress",	"CbOS.OperatedInput.AllowType(this, event)");
			Attach(aObj, "onpaste",		"CbOS.OperatedInput.AllowPaste(this, event)");
			Attach(aObj, "ondrop",		"CbOS.OperatedInput.AllowDrop(this, event)");
			if(!(CbOS.is.ie||CbOS.is.sf3))
{
				Attach(aObj, "oninput",	"CbOS.OperatedInput.AllowInsert(this, event)");
}
		}
	},
	ReadValidationInfo: function()
	{
		var dateExp = /^[09]{2}\/[09]{2}\/[09]{4}$/,
			timeExp = /^[09]{2}:[09]{2} \[AP\]M$/,
			dateTimeExp = /^[09]{2}\/[09]{2}\/[09]{4} [09]{2}:[09]{2} \[AP\]M$/,
			card = /^.+_filter_Number$/,
			cardRealTimeExp = /^\d{0,4}-?\d{0,4}-?\d{0,4}-?\d{0,4}$/,
			cardProcent = /%/g,
			intExp = /^[09]+$/,
			digits = /^\\d\{\d\}$/,
			supportedTypes = ["PhoneEx", "Phone", "Integer", "Currency", "Decimal", "Decimal", "Time", "Date", "SSN", "Custom", "DateTime", "Color", "Email"];
		return function(aObj)
		{
			if (aObj.getAttribute("RTV"))
				return
			var validationInfo = aObj.getAttribute("validate");
			if (validationInfo && !CbOS.is.Def(eval("validationInfo = {"+validationInfo+"}")))
				return;
			var aMask;
			if(
				(aObj.tagName=="TEXTAREA" && aObj.getAttribute("MaxLength"))
				||
				(validationInfo && (aMask = validationInfo.ValidationType || validationInfo.DataType) && CbOS.is.In(aMask, supportedTypes))
			  )
			{
				var obj = aObj.validationInfo = CbOS.set.Param(validationInfo);
				if (aMask == "Currency")
					obj.DataType = "Decimal";
				else if (aMask == "Custom")
				{
					var conditions;
					if (obj.typeConditions)
					{
						var setEv = CbOS.set.Event;
						obj.typeConditions = setEv("return " + obj.typeConditions).apply();
						for (var i = 0; i < obj.typeConditions.length; ++i)
							if (typeof(obj.typeConditions[i][1]) != "function")
								obj.typeConditions[i][1] = setEv(obj.typeConditions[i][1]);
					}
					if (validationInfo.RealTimeExp)
						obj.RealTimeExp = new RegExp(validationInfo.RealTimeExp);
					else
					{
						if (digits.test(validationInfo.RegExp))
						{
							digits.exec(validationInfo.RegExp)
							obj.RealTimeExp = new RegExp( "^\\d{0," + RegExp.$1 + "}$");
						}
						else if (!obj.typeConditions)
						{
							aObj.setAttribute("RTV", "false");
							return false;
						}
					}
				};
				aObj.setAttribute("RTV", "true");
				if (!obj.UseTemplate)
					obj.UseTemplate = "true";
				this.SetOIParameters(aObj, "prevValue", aObj.value);
				CbOS.OperatedInput.SetEventsHandlers(aObj);
				return obj;
			};
			aObj.setAttribute("RTV", "false");
		}
	}(),
	WriteText: function (aText) {document.getElementById("tmp").innerHTML += aText + "\n<br>";},
	ReWriteText: function (aText) {document.getElementById("tmp").innerHTML = aText;}
};
if (window.addEventListener)
	window.addEventListener("dragdrop", top.CbOS.OperatedInput.AllowDropFF, true);
CbOS.Messages={}
CbOS.Messages.Validaton = {
	Get: function(aName)
	{
		aName = CbOS.Messages.Validaton[aName];
		for (var i = 1; i < arguments.length; ++i)
			aName = aName.replace(new RegExp("\\{" + i + "\\}", "g"),arguments[i])
		return aName
	},
	Custom: 'Wrong Value.',
	Email: 'Wrong email address.',
	CheckNumber: 'Wrong check number. Check number should consists only from digits <br /> and have exactly 16 digits long.',
	Phone: 'Wrong phone number. Phone/fax should be exactly 7 or 10 (with area code) digits long.<BR>Ex.: (232) 344-8984 or 232-344-8984',
	SSN: 'Wrong social security number. Social security number should be exactly 9 digits long. Ex.: 111-22-3333',
	Color: 'Wrong color value. Color number should consists<br> of 6 hexadecimal digits.',
	URL: 'Invalid URL.',
	Password: 'Incorrect password. Password must have at least 6 characters and contain at least 1 number or punctuation character.',
	Integer: 'Must be Integer.',
	Decimal: 'Must be Decimal.',
	Currency: 'Must be Currency.',
	Date: 'Must be Date.',
	Time: 'Must be Time.',
	DateTime: 'Must be Date and Time.',
	DateAndOrTime: 'Must be Date and/or Time.',
	BusinessObject: 'Item does not exist.',
	Mandatory: 'Field is mandatory.',
	Unique: 'Must be unique.',
	Between: 'Value should be between {1} and {2}.',
	Less: 'Value should be equal or less than {1}.',
	Greater: 'Value should be equal or greater than {1}.',
	PhoneEx: 'Ex.: 232-344-8984'
}


CbOS.Validation = {
	RestoreFocus: function(aFocus, aObj, aPos)
	{
		if (!aFocus)
			with (CbOS)
			{
				SM.run.Event(aObj, aObj);
				var err;
				try
				{
					aObj.focus()
					aPos.p = Math.max(0, aPos.p - (aPos.select = aPos.t.length))
					set.Position(aObj, 0, aPos);
				}
				catch(err){}
			}
	},
	RemoveError: function(aObj)
	{
		with (CbOS)
		{
			if(aObj.previousSibling)
				rem(aObj.previousSibling);
			else if(aObj.nextSibling)
				rem(aObj.nextSibling);
			rem(aObj);
		}
	},
	ErrorHide : function(aObj, aSkip, aFocus, aPos)
	{
		with (CbOS)
		{
			var div, errorMessage = aObj.getAttribute("ErrorMessageId");
			if (errorMessage)
			{
				div = get.Obj(errorMessage, document);
				aObj.getAttribute("ErrorContainerId", div.parentNode.id || (div.parentNode.id = get.PK()));
				aObj.removeAttribute("ErrorMessageId");
			}
			else
			{
				div = aObj;
				while (is.Tag(div.parentNode, "LI"))
					div = div.parentNode.parentNode;
				div = get.node.Child(div.parentNode, "DIV", "error");
			};
			if (div)
			{
				var obj = div.parentNode;
				if(aFocus != 'lock' && is.Tag(obj,["TD","TH"]))
				{
					var pos = aPos || get.Position(aObj),
						tr = obj.parentNode,
						dpsl = get.Style(tr,"display");
					set.Style(tr, "display", "none");
					CbOS.Validation.RemoveError(div);
					set.Style(tr, "display", dpsl);
					w.CbOS.Validation.RestoreFocus(aFocus, aObj, pos);
				}
				else
				{
					CbOS.Validation.RemoveError(div);
					if (!obj.childNodes.length)
						set.Style(obj, "display", "none")
				}
			}
		}
	},
	ErrorShow : function(aObj, aText, aSkip, aFocus, aPos)
	{
		with (CbOS)
		{
			var input = obj = aObj,
				errorPrefix = obj.getAttribute("ErrorPrefix");
			if (errorPrefix)
				aText = errorPrefix + " " + aText;
			if (obj.getAttribute("ErrorCName"))
			{
				var th = get.node.Parent(obj, "TH"),
					table = get.node.Parent(th, "TABLE");
				th = table.rows[th.parentNode.rowIndex + 1].cells[th.cellIndex];
				th = get.node.Child(th, "DIV") || th;
				aText = th.innerHTML + ": " + aText;
			};
			while ((obj= get.node.Parent(obj, "DIV", "cnt2")))
				btn.Cnt(obj = get.node.Child(get.node.Prev(obj, "DIV"), "A"));
			if (!aSkip)
			{
				obj = aObj;
				while(!is.Tag(obj,"BODY"))
				{
					var setAccess = obj.getAttribute("setAccess");
					if(setAccess)
						btn.State(obj, setAccess, false);
					if(obj.getAttribute("noAccess") == "true")
						break;
					obj = obj.parentNode;
				}
			};
			var errorContainer, errorMessage = aObj.getAttribute("ErrorMessageId");
			if (errorMessage)
			{
				errorMessage = get.Obj(errorMessage, document);
				errorContainer = errorMessage.parentNode
			}
			if (!errorMessage)
			{
				if ((errorContainer = aObj.getAttribute("ErrorContainerId")) && (errorContainer = get.Obj(errorContainer, document)))
				{
					if (errorContainer.childNodes.length)
						create.Element("BR", errorContainer);
					errorMessage = create.Element("DIV", errorContainer, "error", get.PK());
					aObj.setAttribute("ErrorMessageId", errorMessage.id);
					set.Style(errorContainer, "display", "block")
				}
			}
			if (!errorMessage)
			{
				while (is.Tag(aObj.parentNode, "LI"))
					aObj = aObj.parentNode.parentNode;
				errorMessage = (get.node.Child(aObj = aObj.parentNode, "DIV", "error") ||
					create.Element("DIV", create.Element("BR", aObj).parentNode, "error", get.PK()))
				input.setAttribute("ErrorMessageId", errorMessage.id)
				errorContainer=aObj
			}
			if (!errorContainer)
				errorContainer = is.Tag(aObj.parentNode, "LI") ? aObj.parentNode.parentNode.parentNode : aObj.parentNode;
			aObj = aObj.firstChild || aObj;
			if(!aObj.id)
				aObj.id = get.PK();
			CbOS.Validation.GetErrorMessageWidth(errorContainer, errorMessage);
			if (aFocus != 'lock' && is.Tag(errorMessage.parentNode, ["TD","TH"]))
			{
				var pos = aPos || get.Position(input);
				var tr = errorMessage.parentNode.parentNode;
				var dpsl = get.Style(tr,"display");
				set.Style(tr, "display", "none");
				errorMessage.innerHTML = aText;
				set.Style(tr, "display", dpsl);
				w.CbOS.Validation.RestoreFocus(aFocus, input, pos);
			}
			else
				errorMessage.innerHTML = aText;
		};
		return true;
	},
	GetErrorMessageWidth: function(aErrorContainer, aErrorMessage)
	{
		with (CbOS)
		{
			var freeSpace = 0;
			if ((get.Style(aErrorContainer, "styleFloat") || get.Style(aErrorContainer, "cssFloat")) == "left" && get.Style(aErrorContainer, "position") != "absolute")
			{
				var offsetRight = aErrorContainer.offsetLeft + aErrorContainer.offsetWidth;
				var rightSpace = freeSpace = aErrorContainer.parentNode.clientWidth;
				var childs = aErrorContainer.parentNode.childNodes;
				for (var i = 0; i < childs.length; ++i)
				{
					var curObj = childs[i];
					if (curObj != aErrorContainer && curObj.offsetLeft >= offsetRight)
						freeSpace = Math.min(freeSpace, curObj.offsetLeft);
				};
				if (rightSpace == freeSpace) return;
				freeSpace -= offsetRight;
			};
			set.Style(aErrorMessage, "width", aErrorContainer.offsetWidth + freeSpace - 1
				- get.Style(aErrorContainer, "padding-left", true)
				- get.Style(aErrorContainer, "padding-right", true)
				- get.Style(aErrorContainer, "border-left-width", true)
				- get.Style(aErrorContainer, "border-right-width", true)
			);
		}
	},
	ValueValidate : function(aObj, aSkip, aFocus, aNoService, aReValidate)
	{
		if (!aObj || !aObj.form || aObj.getAttribute("lockedByValidation"))
			return;
		var validationInfo = aObj.getAttribute("validate");
		with (CbOS)
		{
			if (validationInfo && !aObj.getAttribute("isFilter"))
			{
				if (get.node.Parent(aObj, "TR", "dmcFilter") && (input = aObj.form[aObj.name+":filtertype"]))
				{
					aObj.setAttribute("isFilter", "true");
					validationInfo = dmc.RestoreValidation(input, true);
				}
				else
					aObj.setAttribute("isFilter", "false")
			}

			var validationInfo = aObj.getAttribute("validate");
			if (validationInfo && !CbOS.is.Def(eval("validationInfo = {"+validationInfo+"}")))
				return;

			if (validationInfo && is.Def(eval("validationInfo = {"+validationInfo+"}")))
			{
				if (aReValidate && aObj.getAttribute("timeHoldValidate"))
				{
					del(aObj, "timeHoldValidate");
					CbOS.Validation.ErrorHide(aObj, aSkip, aFocus);
				};
				for (var o = aObj.parentNode; is.Obj(o); o = o.parentNode)
					if (get.Style(o, "display") == "none")
					{
						if (is.Cls(o, "dmcDMC"))
							o = o.parentNode;
						else
							return
					};
				var pos = get.Position(aObj),
					value = aObj.value.Trim();
				if (validationInfo.dmcCName)
				{
					var  o = get.node.Child(dmc.Question(aObj, validationInfo.dmcCName, true), "INPUT", null, ['hidden','radio']);
					if (o && (o.type == "radio"? !o.checked : o.value == 'false'))
						return CbOS.Validation.ErrorHide(aObj, aSkip, aFocus);
				};
				if (aNoService)
				{
					var errorMessage = aObj.getAttribute("ErrorMessageId");
					if (errorMessage && get.Obj(errorMessage, aObj))
					{
						if (!aSkip)
							while (!is.Tag(aObj, "BODY"))
							{
								var setAccess = aObj.getAttribute("setAccess");
								if(setAccess)
									btn.State(aObj, setAccess, false);
								if(aObj.getAttribute("noAccess") == "true")
									break;
								aObj = aObj.parentNode;
							}
						return true;
					}
				};
				with (CbOS.Validation)
				{
					var returnValue;
					if (value != (aObj.getAttribute("EmptyValue") || ""))
					{
						var minValue = validationInfo.MinValue,
							maxValue = validationInfo.MaxValue,
							type = validationInfo.DataType;
						switch (type)
						{
							case 'Integer':
								if (is.Int(value))
									value = to.Int(value);
								else
									returnValue = ErrorShow(aObj, CbOS.Messages.Validaton.Get('Integer'), aSkip, aFocus, pos);
								break;
							case 'Decimal':
							case 'Currency':
								if (is.Float(value) && value != ".")
									value = to.Float(value);
								else
									returnValue = ErrorShow(aObj, CbOS.Messages.Validaton.Get(type == 'Decimal' ? 'Decimal' : 'Currency'), aSkip, aFocus, pos);
								break;
							case 'Date':
								if (is.Date(value))
								{
									if (!get.Date(value))
									{
										var dt = value.replace(/ /g, "").split("/");
										if (dt[2].length < 4 && get.Date(value = dt[0].PadL(2) + "/" + dt[1].PadL(2) + "/" + get.Year(dt[2])))
											set.Value(aObj, value, null, true);
									};
									if ((value = get.Date(value)))
									{
										minValue = minValue && get.Date(minValue == 'current_date' ? (new Date()).DateFormat() : minValue);
										maxValue = maxValue && get.Date(maxValue == 'current_date' ? (new Date()).DateFormat() : maxValue);
										returnValue = ValidateMinMax(aObj,
											value,
											validationInfo,
											minValue,
											minValue && minValue.DateFormat(),
											maxValue,
											maxValue && maxValue.DateFormat(),
											aSkip,
											aFocus,
											pos
										)
										break;
									}
								};
								returnValue = ErrorShow(aObj, CbOS.Messages.Validaton.Get('Date'), aSkip, aFocus, pos);
								break;
							case 'Time':
								if (is.Time(value) && is.Def(value = get.Time(value)))
								{
									var curTime = new Date();
									curTime = curTime.getHours() * 60 + curTime.getMinutes();
									minValue = minValue
										&&
										(
											minValue == 'current_time'
											?
											curTime
											:
											get.Time(minValue)
										);
									maxValue = maxValue
										&&
										(
											maxValue == 'current_time'
											?
											curTime
											:
											get.Time(maxValue)
										);
									returnValue = ValidateMinMax(aObj,
										value,
										validationInfo,
										minValue,
										is.Def(minValue) && minValue.TimeFormat(),
										maxValue,
										is.Def(maxValue) && maxValue.TimeFormat(),
										aSkip,
										aFocus,
										pos
									)
									break;
								};
								returnValue = ErrorShow(aObj, CbOS.Messages.Validaton.Get('Time'), aSkip, aFocus, pos);
								break;
							case 'DateTime':
								var dateTime = value.split(" "),
									time = is.Time(dateTime[0])
										?
										dateTime.join(" ").Trim()
										:
										(dateTime.length > 1 ? (dateTime[2] ? dateTime[1] + " " +dateTime[2] : dateTime[1]).Trim() : null),
									dt = dateTime[0].split("/");
								if (
									(
										is.DTime(value)
										?
										!is.Def(get.Time(time))
										:
										(
											validationInfo.IsMandatory
											||
											(
												time
												?
												!is.Def(get.Time(time))
												||
												!is.Time(dateTime[0])
												:
												!is.Date(value)
											)
										)
									)
									||
									(
										is.Date(dateTime[0])
										&&
										!get.Date(dateTime[0])
										&&
										(
											dt[2].length == 4
											||
											!get.Date(dateTime[0] = dt[0].PadL(2) + "/" + dt[1].PadL(2) + "/" + get.Year(dt[2]))
										)
									)
								)
								{
									returnValue = ErrorShow(aObj,
															validationInfo.IsMandatory
																?
																CbOS.Messages.Validaton.Get('DateTime') :
																CbOS.Messages.Validaton.Get('DateAndOrTime'),
															aSkip,
															aFocus,
															pos);
									break
								};
								if (is.Date(dateTime[0]) && dt[2].length < 4)
								{
									if (time)
										dt[3] = time.split(":");
									set.Value(aObj,
										value =
											dateTime[0] + (time ?
											" " +
											dt[3][0].PadL(2) + ":" +
											dt[3][1].replace(/\D*/g, "").PadL(2) +
											dt[3][1].replace(/\d*/, "")
											:
											""
										),
										null, true);
								};
								if (is.Time(value))
									minValue = maxValue = null;
								else
								{
									minValue = minValue
										&&
										get.DateTime(
											minValue == 'current_time'
											?
											(new Date()).DateTimeFormat()
											:
											(
												minValue == 'current_date'
												?
												(new Date()).DateFormat() + " 0:0"
												:
												(
													is.Date(minValue)
													?
													minValue + " 0:0"
													:
													minValue
												)
											)
										);
									maxValue = maxValue
										&&
										get.DateTime(
											maxValue == 'current_time'
											?
											(new Date()).DateTimeFormat()
											:
											(
												maxValue == 'current_date'
												?
												(new Date()).DateFormat() + " 23:59"
												:
												(
													is.Date(maxValue)
													?
													maxValue + " 23:59"
													:
													maxValue
												)
											)
										);
									returnValue = ValidateMinMax(aObj,
										value,
										validationInfo,
										minValue,
										minValue && minValue.DateTimeFormat(),
										maxValue,
										maxValue && maxValue.DateTimeFormat(),
										aSkip,
										aFocus,
										pos
									)
								};
								break;
						};
						if (!returnValue)
						{
							if (is.In(type, ['Integer', 'Decimal', 'Currency']))
							{
								var min = is.Def(minValue) ? to.Float(minValue) : -Infinity,
									max = is.Def(maxValue) ? to.Float(maxValue) : Infinity,
									minus = (min < 0) * 1,
									maxLength = Math.min(15 + minus, (aObj.maxLength || (aObj.maxLength = 15 + minus))) - minus,
									num = (type == "Integer" ? 9 : 9.99).PadL(maxLength, 9);
									minValue = Math.max(min, -1 * num);
									maxValue = Math.min(max, 1 * num);
									returnValue = ValidateMinMax(aObj,
										value,
										validationInfo,
										minValue,
										minValue,
										maxValue,
										maxValue,
										aSkip,
										aFocus,
										pos
									)
							};
							if (!returnValue)
								switch (validationInfo.ValidationType)
								{
									case 'Custom':
										if (validationInfo.RegExp && !value.match(validationInfo.RegExp))
											returnValue = ErrorShow(aObj, validationInfo.ErrorMessage ? validationInfo.ErrorMessage.replace('{0}', 'Value') : CbOS.Messages.Validaton.Get('Custom'), aSkip, aFocus, pos);
										break;
									case 'Email':
										if (!value.match(/^(((((\w+ )+|(\((\w+( \w+)?)+\) ?)|(\'(\w+( \w+)?)+\' ?))?([\w-]+(?:\.[\w-]+)*))((@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?))|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?)))( *\; *\b|( *;?$)))+$/i))
											returnValue = ErrorShow(aObj, CbOS.Messages.Validaton.Get('Email'), aSkip, aFocus, pos);
										break;
									case 'CheckNumber':
										if (!value.match(/^\d{16}$/))
											returnValue = ErrorShow(aObj, CbOS.Messages.Validaton.Get('CheckNumber'), aSkip, aFocus, pos);
										break;
									case 'Phone':
										if (!value.match(/^(((\({1}\d{3}\){1})|\d{3}){1}(\s|-)?)?\d{3}(\s|-)?\d{4}$/))
											returnValue = ErrorShow(aObj, CbOS.Messages.Validaton.Get('Phone'), aSkip, aFocus, pos);
										break;
									case 'SSN':
										if (!value.match(/^\d{3}-?\d{2}-?\d{4}$/))
											returnValue = ErrorShow(aObj, CbOS.Messages.Validaton.Get('SSN'), aSkip, aFocus, pos);
										break;
									case 'Color':
										if (!value.match(/^[0-9A-Fa-f]{6}$/))
											returnValue = ErrorShow(aObj, CbOS.Messages.Validaton.Get('Color'), aSkip, aFocus, pos);
										break;
									case 'URL':
										if (!value.match(/^(http[s]?:\/\/)?[\w-]+(\.[\w-]+)*(:[\d]+)?(\/[\w#!:.?+=&%@!\-]*)*$/i))
											returnValue = ErrorShow(aObj, CbOS.Messages.Validaton.Get('URL'), aSkip, aFocus, pos);
										break;
									case 'Password':
										if (value.length < 6 || !value.match(/([A-Za-z]+[^A-Za-z]+)|([^A-Za-z]+[A-Za-z]+)/))
											returnValue = ErrorShow(aObj, CbOS.Messages.Validaton.Get('Password'), aSkip, aFocus, pos);
										break;
								}
						}
					}
					else
					{
						var rel = validationInfo.Related, isFilled;
						if (rel)
						{
							rel = rel.toArray();
							aObj.setAttribute("lockedByValidation", "true");
							for (var obj, i = 0; i < rel.length; ++i)
								if ((obj = aObj.form[rel[ i ]] || get.Obj(rel[ i ], aObj)))
								{
									if (obj.value == (obj.getAttribute("EmptyValue") || ""))
										w.CbOS.Validation.ValueValidate(obj, aSkip, true);
									else
										isFilled = true;
								};
							aObj.removeAttribute("lockedByValidation");
						};
						if (!rel || isFilled)
						{
							if ((validationInfo.IsMandatory || validationInfo.DataType == 'BusinessObject') && aObj.type == 'hidden' && aObj.nextSibling && aObj.nextSibling.getAttribute("serviceMethod") && aObj.nextSibling.value.Trim())
								returnValue = ErrorShow(aObj,  CbOS.Messages.Validaton.Get('BusinessObject'), aSkip, aFocus, pos);
							else if (validationInfo.IsMandatory)
								returnValue = ErrorShow(aObj, CbOS.Messages.Validaton.Get('Mandatory'), aSkip, aFocus, pos);
						}
					};
					if (validationInfo.Service)
					{
						var table, rows, cellIndex;
						if (validationInfo.Service.Unique)
						{
							var prev = is.Null(aObj.PreviousValue, aObj.CbOSPreviousValue, aObj.value).Trim();
							aObj.PreviousValue = value = String(value);
							rows = (table = get.node.Parent(aObj, "TABLE")).rows;
							cellIndex = get.node.Parent(aObj, ["TD", "TH"]).cellIndex;
							var dblPrev = [], dblThis = [];
							for (var i = 0; i < rows.length; ++i)
								if (is.Cls(rows[i], ["dmc0", "dmc1"]) && rows[i].getAttribute("RowID"))
								{
									var obj = get.node.Child(rows[i].cells[cellIndex], "INPUT", null, "text");
									if (obj)
									{
										var objValue = obj.value.Trim();
										if (value == objValue)
											dblThis.push(obj)
										else if (objValue == prev)
											dblPrev.push(obj)
									}
								};
							if (prev != value && dblPrev.length == 1)
								returnValue = w.CbOS.Validation.ValueValidate(dblPrev[0], aSkip, true) || returnValue;
							if (dblThis.length > 1)
							{
								for (var i = 0; i < dblThis.length; ++i)
									returnValue = ErrorShow(dblThis[i], CbOS.Messages.Validaton.Get('Unique'), aSkip, true) || returnValue;
								w.CbOS.Validation.RestoreFocus(aFocus, aObj, pos);
								return true
							};
						};
						if (!aNoService)
						{
							var out = set.Param([validationInfo.Service.Name, aObj.value], set.Param(validationInfo.Service.Attributes));
							if (validationInfo.Service.RowID && table)
							{
								out = set.Param([validationInfo.Service.RowID, get.node.Parent(aObj, "TR").getAttribute("RowID")], out)
								if (!table)
								{
									rows = (table = get.node.Parent(aObj, "TABLE")).rows;
									cellIndex = get.node.Parent(aObj, ["TD", "TH"]).cellIndex;
								}
								var rowIndex = get.node.Parent(aObj, "TR").rowIndex;
								var editedRowsID = aObj.form.elements[table.getAttribute("name") + ":editedRowsID"];
								out.aData = [];
								if(editedRowsID)
								{
									editedRowsID = editedRowsID.value.split(",");
									for (var rowId, obj, i = 0; i < rows.length; ++i)
										if (i != rowIndex && is.Cls(rows[i], ["dmc0", "dmc1"]) && (rowId = rows[i].getAttribute("RowID")) && is.In(rowId, editedRowsID) && (obj = get.node.Child(rows[i].cells[cellIndex], "INPUT", null, "text")))
										{
											var objValue = obj.value.Trim();
											out.aData.push('<Pair><First xsi:type="xsd:int">', rowId, '</First><Second xsi:type="xsd:string">', CbOS.set.HTMLEncode(obj.value.Trim()), '</Second></Pair>')
										}
								}
							}
							var pkService = get.PK();
							aObj.setAttribute('pkService', pkService);
							ajax.Post(aObj,
								validationInfo.Service.URL,
								{
									id: aObj.id || (aObj.id = get.PK()),
									pkService: pkService,
									ContentType: 'text/xml; charset=utf-8',
									SOAPAction: validationInfo.Service.Namespace + "/" + validationInfo.Service.Method,
									run: CbOS.Validation.Service
								},
								create.Soap(validationInfo.Service.Method,
									out,
									validationInfo.Service.Namespace
								)
							)
						}
					};
					if (validationInfo.DataVerification)
					{
						if (validationInfo.DataVerification.isString)
							validationInfo.DataVerification = CbOS.set.Event("return " +validationInfo.DataVerification);
						var text = validationInfo.DataVerification.apply(aObj);
						if (text)
							returnValue = ErrorShow(aObj, text, aSkip, aFocus, pos);
					}
					if (returnValue)
						return returnValue;
					ErrorHide(aObj, aSkip, aFocus, pos);
					if (validationInfo.DataVerification)
						RestoreFocus(aFocus, aObj, pos)
				}
			}
		}
	},
	Service: function()
	{
		with(CbOS)
		{
			var obj = arguments[0], xml = arguments[1], data = arguments[2];
			if(data.XML.status==200)
			{
				var err = xml.getElementsByTagName("soap:Body")[0].firstChild;
				var pkService = data.pkService;
				if(err && (err = err.lastChild) && (err = err.text) && (data = get.Obj(data.id, obj)) && data.getAttribute("pkService") == pkService)
					w.CbOS.Validation.ErrorShow(data, err, true)
			}
			else if (window.DebugMode)
				alert(Messages.InternalError);
			ajax.Loading.Hide(obj);
		}
	},
	ValidateMinMax: function(aObj, aValue, aValidationInfo, aMin, aMinTxt, aMax, aMaxTxt, aSkip, aFocus, aPos)
	{
		var isMin = CbOS.is.Def(aMinTxt),
			isMax = CbOS.is.Def(aMaxTxt);
		if (isMin && aValue < aMin)
			return CbOS.Validation.ErrorShow(aObj,
				isMax
				?
				aValidationInfo.rangeValueError
				||
				CbOS.Messages.Validaton.Get('Between', aMinTxt, aMaxTxt)
				:
				(
					aValidationInfo.minValueError
					||
					CbOS.Messages.Validaton.Get('Greater', aMinTxt)
				), aSkip, aFocus, aPos);
		if (isMax && aValue > aMax)
			return CbOS.Validation.ErrorShow(aObj,
				isMin
				?
				aValidationInfo.rangeValueError
				||
				CbOS.Messages.Validaton.Get('Between', aMinTxt, aMaxTxt)
				:
				(
					aValidationInfo.maxValueError
					||
					CbOS.Messages.Validaton.Get('Less', aMaxTxt)
				), aSkip, aFocus, aPos);
	}
};
CbOS.LoadingWait = {
	Init: function()
	{
		CbOS.set.Attach(window, "onbeforeunload", CbOS.LoadingWait.Show);
		CbOS.LoadingWait.timer = setTimeout("CbOS.LoadingWait.Hide", 2000);
	},
	Hide: function()
	{
		CbOS.set.DetachEvent(window, "onbeforeunload", CbOS.LoadingWait.Show);
		CbOS.LoadingWait.timer = null;
	},
	Show: function()
	{
		if (CbOS.LoadingWait.timer)
		{
			clearTimeout(CbOS.LoadingWait.timer);
			CbOS.LoadingWait.timer = null;
		};
		document.body.className = 'LoadingWait';
	}
}

onFormSubmit = function(aForm, aInputId)
{
	if(typeof event == 'object')
		event.returnValue=false
	var textInput = aForm[aInputId]
	if(!CbOS.OperatedInput.ValidateValue(textInput, textInput.value))
	{
		alert(CbOS.OperatedInput.GetErrorMessage(textInput))
		textInput.focus()
		return false
	};
	aForm.submit()
	CbOS.LoadingWait.Init();
	return true
}
