$F = (function(){
	var dataBrowser = [{
				string: navigator.userAgent,
				subString: "OmniWeb",
				versionSearch: "OmniWeb/",
				identity: "OmniWeb"
			}, {
				string: navigator.vendor,
				subString: "Apple",
				identity: "Safari"
			}, {
				prop: window.opera,
				identity: "Opera"
			}, {
				string: navigator.vendor,
				subString: "iCab",
				identity: "iCab"
			}, {
				string: navigator.vendor,
				subString: "KDE",
				identity: "Konqueror"
			}, {
				string: navigator.userAgent,
				subString: "Firefox",
				identity: "FF",
				versionSearch: "Firefox"
			}, {
				string: navigator.vendor,
				subString: "Camino",
				identity: "Camino"
			}, {		// for newer Netscapes (6+)
				string: navigator.userAgent,
				subString: "Netscape",
				identity: "NS"
			}, {
				string: navigator.userAgent,
				subString: "MSIE",
				identity: "MSIE",
				versionSearch: "MSIE"
			}, {
				string: navigator.userAgent,
				subString: "Gecko",
				identity: "Mozilla",
				versionSearch: "rv"
			}, { 		// for older Netscapes (4-)
				string: navigator.userAgent,
				subString: "Mozilla",
				identity: "Netscape",
				versionSearch: "Mozilla"
			}],
		dataOS = [
			{
				string: navigator.platform,
				subString: "Win",
				identity: "Win"
			}, {
				string: navigator.platform,
				subString: "Mac",
				identity: "Mac"
			}, {
				string: navigator.platform,
				subString: "Linux",
				identity: "Linux"
			}],
		psTempVersion = 0,
		oBrowser = {
				browser : "unknown",
				version : "unknown",
				os : "unknown"
			};

		function psSearchString (aData)
			{
				var oData, dataString, dataProp;
				for (var i=0, L=aData.length; i<L; i++)
					{
						oData = aData[i];
						dataString = oData.string;
						dataProp = oData.prop;
						psTempVersion = oData.versionSearch || oData.identity;
						if (dataString)
							{
								if (dataString.indexOf(oData.subString) != -1)
								return oData.identity;
							}
						else
							if (dataProp)
								return oData.identity;
					}
			}

		function psSearchVersion(sDataString)
			{
				var index = sDataString.indexOf(psTempVersion);
				if (index == -1) return;
				return parseFloat(sDataString.substring(index + psTempVersion.length + 1));
			}

		oBrowser.browser = psSearchString(dataBrowser) || "unknown";
		oBrowser.version  = psSearchVersion(navigator.userAgent) || psSearchVersion(navigator.appVersion) || "unknown";
		oBrowser.os = psSearchString(dataOS) || "unknown";
		oBrowser["is"+oBrowser.browser] = true;
		if (oBrowser.version != "unknown")
			oBrowser["is"+oBrowser.browser+parseInt(oBrowser.version)] = true;
		oBrowser["is"+oBrowser.os] = true;
		
	return {
		browserInfo : oBrowser,
		loadSequence : function()
			{
				var aSequence = arguments;
				//TODO 
			},

		getFirstElementChild : function(oObject)
			{
				/*@cc_on @if (@_win32)
					return oObject.firstChild;
				/*@else @*/
					var i=-1, L=oObject.childNodes.length;
					while(i < L)
						if (oObject.childNodes[++i].nodeType == 1)
							return oObject.childNodes[i];
				/*@end @*/
				return null;
			},
		getLastElementChild : function(oObject)
			{
				/*@cc_on @if (@_win32)
					return oObject.lastChild;
				/*@else @*/
					var i=oObject.childNodes.length;
					while(i > 0)
						if (oObject.childNodes[--i].nodeType == 1)
							return oObject.childNodes[i];
				/*@end @*/
				return null;
			},

		getGlobalXY: function(oObject)
			{
				var oTemp = oObject, nX =0, nY = 0;
				while(oTemp)
					{
						/*@cc_on @if (@_win32)
							nX += oTemp.offsetLeft;
							nY += oTemp.offsetTop;
						/*@else @*/
							nX += oTemp.offsetLeft;
							nY += oTemp.offsetTop;
						/*@end @*/
						oTemp = oTemp.offsetParent;
					}
				return {x : nX, y : nY};
			},
		
		setGlobalXY : function(oObject, x, y)
			{
				if (oObject)
					{
						if ( ! (x === undefined || x === null))
							{
								/*@cc_on @if (@_win32)
									oObject.style.posLeft = x;
								/*@else @*/
									oObject.style.left = x+'px';
								/*@end @*/
							}
						if ( ! (y === undefined || y === null))
							{
								/*@cc_on @if (@_win32)
									oObject.style.posTop = y;
								/*@else @*/
									oObject.style.top = y+'px';
								/*@end @*/
							}
					}
			},

		setGlobalCenter : function(oObject)
			{
//				if (oObject && oObject.style.position == 'absolute')
					{
						var
							//nWidth = parseInt(document.body.clientWidth),
							//nHeight = parseInt(document.body.clientHeight),
							nWidth = parseInt(
								/*@cc_on @if (@_win32) 
									document.body.clientWidth
								/*@else @*/
									window.innerWidth
								/*@end @*/
								),
							nHeight = parseInt(
								/*@cc_on @if (@_win32) 
									document.body.clientHeight
								/*@else @*/
									window.innerHeight
								/*@end @*/
							),
							
							nObjWidth = parseInt(oObject.clientWidth ? oObject.clientWidth : 
								/*@cc_on @if (@_win32) 
									oObject.style.posWidth
								/*@else @*/
									oObject.style.width
								/*@end @*/
								),
							nObjHeight = parseInt(oObject.clientHeight ? oObject.clientHeight :
								/*@cc_on @if (@_win32)
									oObject.style.posHeight
								/*@else @*/
									oObject.style.height
								/*@end @*/
							);
						this.setGlobalXY(oObject, (nWidth - nObjWidth) / 2, (nHeight- nObjHeight) / 2);
					}
			},

		attachEvent: function(oObject, sEvent, fHandler, bState)
			{
				bState = bState ? false : true;
				/*@cc_on @if (@_win32)
					if (oObject.attachEvent)
						{
							return oObject.attachEvent('on'+sEvent, fHandler);
						}
				/*@else @*/
					if (oObject.addEventListener)
						return oObject.addEventListener(sEvent, fHandler, bState);
				/*@end @*/
				return false;
			},

		detachEvent: function(oObject, sEvent, fHandler, bState)
			{
				bState = bState ? false : true;
				/*@cc_on @if (@_win32)
					if (oObject.detachEvent)
						{
							return oObject.detachEvent('on'+sEvent, fHandler);
						}
				/*@else @*/
					if (oObject.removeEventListener)
						return oObject.removeEventListener(sEvent, fHandler, bState);
				/*@end @*/
				return false;
			},
		
		stopEvent : function (oEvent)
			{
						/*@cc_on @if (@_win32)
							if (!oEvent)
								oEvent = window.event;
							if (oEvent);
								{		
									oEvent.cancelBubble = true;
									oEvent.returnValue = false;
								}
						/*@else @*/
							if (oEvent)
								{
									oEvent.preventDefault();
									oEvent.stopPropagation();
								}
						/*@end @*/
			},

		contains: function(oElement, oChild)
			{
				if (!oChild || !oElement || oElement === oChild)
					return false;
				/*@cc_on @if (@_win32)
					return oElement.contains(oChild);
				/*@else @*/
					var oTemp = oChild;
					while (oTemp && oTemp.parentNode && oTemp !== document.body)
						{
							if (oTemp === oElement)
								break;
							oTemp = oTemp.parentNode;
						}
					return oTemp === oElement;
				/*@end @*/
			},

		setCookie : function(sName, sValue, nTime)
			{
				var sExpires = '';
				if (nTime)
					{
						var nDate = new Date();
						nDate.setTime(nDate.getTime()+(nTime*60*60*1000));
						sExpires = "; expires="+nDate.toGMTString();
					}
				/*@cc_on @if (!@_win32) @*/
					sValue = encodeURI(sValue);
				/*@end @*/
				document.cookie = sName+"="+sValue+sExpires+"; path=/";
			},
		
		getCookie : function(sName)
			{
				var
					NE = sName + "=",
					aCookies = document.cookie.split(';');
				for(var i=0; i < aCookies.length; i++)
					{
						var sElem = aCookies[i];
						while(sElem.charAt(0)==' ')
							sElem = sElem.substring(1, sElem.length);
						if (sElem.indexOf(NE) == 0)
							{
							/*@cc_on @if (@_win32)
								return sElem.substring(NE.length, sElem.length);
							@else @*/
								return decodeURI(sElem.substring(NE.length, sElem.length));
							/*@end @*/
							}
					}
				return null;
			},

		removeCookie : function(sName)
			{
				this.setCookie(sName, "", -1);
			},

		onLoad : function(oFunction)
			{
				if (window)
					{
						this.attachEvent(window, 'load', oFunction);
					}
			},
		getSearchField : function(oInput, sValue, sCssFilled, sCssEmpty)
			{
				var
					that = this,
					pbSaveOriginal = (oInput && oInput.value == sValue),
					psValue = sValue,
					poInput = oInput,
					psCssFilled = sCssFilled,
					psCssEmpty = sCssEmpty;
					
				function pOnFocus()
					{
						if (!pbSaveOriginal && poInput.value == psValue)
							{
								poInput.value = '';
								poInput.className = psCssFilled;
							}
					}
				
				function pOnBlur()
					{
						if (poInput.value == '' || poInput.value == psValue)
							{
								poInput.value = psValue;
								poInput.className = psCssEmpty;
							}
						else
							poInput.className = psCssFilled;
					}
				if (poInput)
					{
						$F.attachEvent(poInput, 'focus', function() {
									return pOnFocus()
								});
				
						$F.attachEvent(poInput, 'blur', function() {
									return pOnBlur()
								});
				
						$F.attachEvent(poInput, 'keydown', function() {
									//return pOnBlur()
								});
						pOnBlur();
					}
			}
	}})();
