///// ---------------------------------------------------------
///// These functions implement cross browser/missing features
///// ---------------------------------------------------------

	
	if (window.HTMLElement)
	{
		// implements firefox versions
		
		var dx_element = HTMLElement.prototype;
		var dx_capture_events = ["click",    "mousedown", "mouseup",    "mousemove", "mouseover", "mouseout" ];

		dx_element.setCapture = function()
		{
		    var self = this;
		    var flag = false;
		    this._capture = function(e)
		    {
			if (flag) {return}

			flag = true;
			var event = document.createEvent("MouseEvents");
			event.initMouseEvent(	e.type,
			    			e.bubbles, e.cancelable, e.view, e.detail,
						e.screenX, e.screenY, e.clientX, e.clientY,
						e.ctrlKey, e.altKey, e.shiftKey, e.metaKey,
						e.button, e.relatedTarget);

			self.dispatchEvent(event);
			flag = false;
		    };

		    for (var i=0; i<dx_capture_events.length; i++) window.addEventListener(dx_capture_events[i], this._capture, true);
		}

		dx_element.releaseCapture = function()
		{
			for (var i=0; i<dx_capture_events.length; i++) window.removeEventListener(dx_capture_events[i], this._capture, true);

			this._capture = null;
		}

		Node.prototype.removeNode = function removeNode()
		{
			bRemoveChildren=false;
			if(arguments[0] && arguments[0] == true) bRemoveChildren=true;
			
			if(bRemoveChildren)
			{
				for(var i = (this.childNodes.length - 1); i >= 0; i--)
				{
					this.childNodes[i].removeNode();
				}
			}
			this.parentNode.removeChild(this);
		}

		//implements IE transformNode in FireFox
		Node.prototype.transformNode = function (oXslDom)
		{
			//get a xslt processing object
			var oProcessor = new XSLTProcessor();
			oProcessor.importStylesheet(oXslDom);
			var oResultDom = oProcessor.transformToFragment(this, document);

			// get a xml serializer object
			var xmls = new XMLSerializer();

			// convert dom into string
			var sResult = xmls.serializeToString(oResultDom);
			//extract contents of transform iix node if it is present
			if (sResult.indexOf("<transformiix:result") > -1)
			{
				sResult = sResult.substring(sResult.indexOf(">") + 1, sResult.lastIndexOf("<"));
			}

			return sResult;
		}

		//implements IE transformNode in FireFox
		function transformMyNode(ob, oXslDom)
		{
			//get a xslt processing object
			var oProcessor = new XSLTProcessor();
			oProcessor.importStylesheet(oXslDom);
			var oResultDom = oProcessor.transformToFragment(ob, document);

			// get a xml serializer object
			var xmls = new XMLSerializer();

			// convert dom into string
			var sResult = xmls.serializeToString(oResultDom);
			//extract contents of transform iix node if it is present
			if (sResult.indexOf("<transformiix:result") > -1)
			{
				sResult = sResult.substring(sResult.indexOf(">") + 1, sResult.lastIndexOf("<"));
			}

			return sResult;
		}

		function transformMyNodeToObject(ob, oXslDom)
		{
			//get a xslt processing object
			var oProcessor = new XSLTProcessor();
			oProcessor.importStylesheet(oXslDom);
			var obTemp = oProcessor.transformToDocument(ob);
			return obTemp;
		}

		// this implements document.xml property for mozilla!!! -------------------------

		// this function will be called when accessing the property xml
		function _Node_getXML() 
		{
		    //create a new XMLSerializer
		    var objXMLSerializer = new XMLSerializer;

		    //get the XML string
		    var strXML = objXMLSerializer.serializeToString(this);

		    //return the XML string
		    return strXML;
		}

		Node.prototype.__defineGetter__("xml", _Node_getXML);
		
		function getNodeXMLString(nd)
		{
		
		    //create a new XMLSerializer
		    var objXMLSerializer = new XMLSerializer;

		    //get the XML string
		    var strXML = objXMLSerializer.serializeToString(nd);
		    //return the XML string
		    return strXML;
		}
		//-------------------------------------------------------------------------------
				
		//this implements loadXML(string) method for mozilla!!! -------------------------
		Document.prototype.loadXML = function(strXML) 
		{
			//create a DOMParser
			var oDOMParser = new DOMParser();

			//create new document from string
			var oDoc = oDOMParser.parseFromString(strXML, "text/xml");

			//make sure to remove all nodes from the document
			while (this.hasChildNodes())
			{
			    this.removeChild(this.lastChild);
			}

			//add the nodes from the new document
			for (var i=0; i < oDoc.childNodes.length; i++) 
			{

			    //import the node
			    var oImportedNode = this.importNode(oDoc.childNodes[i], true);

			    //append the child to the current document
			    this.appendChild(oImportedNode);
			}
		}
		
		function loadMyXML(oXMLDoc, strXML) 
		{
			//create a DOMParser
			var oDOMParser = new DOMParser();

			//create new document from string
			var oDoc = oDOMParser.parseFromString(strXML, "text/xml");

			//make sure to remove all nodes from the document
			while (oXMLDoc.hasChildNodes())
			{
			    oXMLDoc.removeChild(oXMLDoc.lastChild);
			}

			//add the nodes from the new document
			for (var i=0; i < oDoc.childNodes.length; i++) 
			{

			    //import the node
			    var oImportedNode = oXMLDoc.importNode(oDoc.childNodes[i], true);

			    //append the child to the current document
			    oXMLDoc.appendChild(oImportedNode);
			}
		}		
	}
	else
	{
		// IE only versions
		function getNodeXMLString(nd)
		{
			if (document.implementation.createLSSerializer)		
			{
				  // create serializer object
				  var xmlSerializer = document.implementation.createLSSerializer();
				  // serialize
				  var strXML = xmlSerializer.writeToString(nd);
				  return strXML;
			}
			return nd.xml;
		}

		function loadMyXML(oXMLDoc, strXML) 
		{
			
			if (document.implementation.createLSSerializer)		
			{
				//create a DOMParser
				var oDOMParser = new DOMParser();

				//create new document from string
				var oDoc = oDOMParser.parseFromString(strXML, "text/xml");

				//make sure to remove all nodes from the document
				while (oXMLDoc.hasChildNodes())
				{
				    oXMLDoc.removeChild(oXMLDoc.lastChild);
				}

				//add the nodes from the new document
				for (var i=0; i < oDoc.childNodes.length; i++) 
				{

				    //import the node
				    var oImportedNode = oXMLDoc.importNode(oDoc.childNodes[i], true);

				    //append the child to the current document
				    oXMLDoc.appendChild(oImportedNode);
				}
			
			}
			else oXMLDoc.loadXML(strXML);
		}

		function transformMyNode(ob, oXslDom)
		{
			
			if (document.implementation.createLSSerializer)		
			{
				// opera

				//get a xslt processing object
				var oProcessor = new XSLTProcessor();
				alert(oXslDom);
				try
				{
					oProcessor.importStylesheet(oXslDom);
				}
				catch (e)
				{
					alert("importStylesheet: "+e.message);
				}
				var oResultDom = oProcessor.transformToFragment(ob, document);
				// get a xml serializer object
				var xmls = document.implementation.createLSSerializer();

				// convert dom into string
				var sResult = xmls.xmlSerializer.writeToString(oResultDom);
				alert(sResult);
				//extract contents of transform iix node if it is present
				if (sResult.indexOf("<transformiix:result") > -1)
				{
					sResult = sResult.substring(sResult.indexOf(">") + 1, sResult.lastIndexOf("<"));
				}

				return sResult;
			}
			else return ob.transformNode(oXslDom); // ie
		}

		function transformMyNodeToObject(ob, oXslDom)
		{
			var ob2 = ob;
			if(arguments.length==3 && arguments[2]) ob2 = arguments[2];
			
			ob.transformNodeToObject(oXslDom, ob2);
			return ob2;
		}

	}
	
// Global methods friendly to both IE and Mozilla ------------------------------------------------

	// event.offsetX is IE only and does not corresond to event.layerX (Firefox)
	// this method will return the correct offsetX value for both browsers
	function getOffsetX(e)
	{
		if (!e) e = window.event;
		if (!e.target) return e.offsetX; // ie way

		var oElement = e.target;
		var nTotalOffsetLeft = 0;
		while (oElement.offsetParent)
		{
			nTotalOffsetLeft += oElement.offsetLeft ;
			oElement = oElement.offsetParent ;
		}

		return (e.pageX - nTotalOffsetLeft); // firefox way
	}

	// event.offsetY is IE only and does not corresond to event.layerY (Firefox)
	// this method will return the correct offsetY value for both browsers
	function getOffsetY(e)
	{
		if (!e) e = window.event;
		if (!e.target) return e.offsetY; // ie way

		var oElement = e.target ;
		var nTotalOffsetTop = 0 ;
		while (oElement.offsetParent)
		{
			nTotalOffsetTop += oElement.offsetTop ;
			oElement = oElement.offsetParent ;
		}

		return (e.pageY - nTotalOffsetTop); // firefox way
	}

	// stops event propagation
	function cancelEventPropagation(e)
	{
		if (!e) e = window.event;

		if (typeof(e.cancelBubble) != "undefined")  e.cancelBubble = true;
		if (e.preventDefault) e.preventDefault();
		if (typeof(e.returnValue) != "undefined")  e.returnValue = false;
		if (e.stopPropagation) e.stopPropagation();

		return e;
	}

	// gets child node length - removing whitespace text nodes
	function len(oDocFrag)
	{
		if(!document.all)
		{
			if(oDocFrag.childNodes.length > 1)
			{
				for(var i=0; i < oDocFrag.childNodes.length; i++)
				{
					if(oDocFrag.childNodes[i].nodeType == 3)
					{
						oDocFrag.removeChild(oDocFrag.childNodes[i]);
					}
				}
			}
		}
		return oDocFrag.childNodes.length;
	}

	function removeNodeChildren(node)
	{
		var len = node.childNodes.length;
				        
		while (node.hasChildNodes())
		{
			node.removeChild(node.firstChild);
		}
		node.parentNode.removeChild(node);
	}

	function getChildElementById(element,tag,theId)
	{
		var counter = 0;
		var holderArray = element.getElementsByTagName(tag);
		for(var i=0; i < holderArray.length; i++)
		{
			if(holderArray[i].id == theId)
			{
				return holderArray[i];
			}
		}
	}

	function getAllChildElementById(element,tag,theId)
	{
		var counter = 0;
		var holderArray = element.getElementsByTagName(tag);
		var foundArray = new Array();
		for(var i=0; i < holderArray.length; i++)
		{
			if(holderArray[i].id == theId)
			{
				foundArray[foundArray.length] = holderArray[i];
			}
		}
		return foundArray;
	}


	function getParentElementById(element,theId)
	{
		if(!element.parentNode)
		{
			return null;
		}
		else if(element.parentNode.id == theId) 
		{
			return element.parentNode;
		}
		else
		{
			return getParentElementById(element.parentNode,theId);
		}
	}

	function getParentElementByoRef(element)
	{
		if(!element.parentNode)
		{
			return null;
		}
		else if(element.parentNode.oRef) 
		{
			return element.parentNode.oRef;
		}
		else
		{
			return getParentElementByoRef(element.parentNode);
		}
	}
	function parentCiLayer(element)
	{
		if(!element.parentNode)
		{
			return null;
		}
		else if(element.parentNode.ciLayer)
		{
			return element.parentNode;
		}
		else
		{
			return parentCiLayer(element.parentNode);
		}
	}
	function getElementsByClassName(element, tag, classId) 
	{
		var retnode = [];
		var myclass = new RegExp('\\b'+classId+'\\b');
		var elem = element.getElementsByTagName(tag);

		for (var i = elem.length-1; i >= 0; i--) 
		{
			if (myclass.test( elem[i].className )) retnode.push( elem[i] );
		}

		return retnode;
	}
	
	// identify which element is associated with current event 
	function whichElement(e)
	{
		if (!e) var e = window.event;

		var targ = null;			
		if (e.target) targ = e.target;
		else if (e.srcElement) targ = e.srcElement;
		
		if (targ.nodeType == 3) targ = targ.parentNode; // defeat Safari bug
		
		return targ;
		
		//var tname = targ.tagName
		//alert("You clicked on a " + tname + " element:"+targ.id)
	}
	function getFramework(framework)
	{
		if(window.ActiveXObject)
		{
			return framework.selectNodes("htmldata")[0].childNodes[0].text;
		}
		else if(document.implementation && document.implementation.createDocument)
		{
			return framework.selectNodes("htmldata/text()")[1].nodeValue;
		}
	}
	function createDocumentObject()
	{
		// if argument passed use it, otherwise default to false
		bASync=false;
		if(arguments[0] && arguments[0] == true) bASync=true;
		if (window.ActiveXObject)
		{
			// MSIE version
			docOb = new ActiveXObject("Microsoft.XMLDOM");
		}
		else if(document.implementation && document.implementation.createDocument)
		{
			// Mozilla version
			docOb = document.implementation.createDocument("", "", null);
		}
	
		//set documents synchronous mode	
		docOb.async = bASync;
		return docOb;

	}
	function preloadDoc(docPath, oDoc)
	{
		oDoc.load(docPath);
	}
	function getDoc(obj)
	{
		if (!obj) return null;

		if (obj.document) 
		{
			return obj.document;
		}	
		else if (obj.ownerDocument) 
		{
			return obj.ownerDocument;
		}	
		else return null;
	}
	
	function getDocWin(objDoc)
	{
		if (!objDoc) return null;

		if (objDoc.parentWindow) 
		{
			return objDoc.parentWindow;
		}	
		else if (objDoc.defaultView) 
		{
			return objDoc.defaultView;
		}	
		else return null;
	}
		
	function getPosX(obj)
	{
		var abbleft = 0;
		if (obj.offsetParent)
		{
			while (obj.offsetParent)
			{
				abbleft += obj.offsetLeft;
				obj = obj.offsetParent;
			}

			// FF supports .document/ defaultView whilst IE supports .ownerdocument/parentWindow
			var objDoc = getDoc(obj);				
			var objParentWin = getDocWin(objDoc);
			
			
			if (objParentWin && objParentWin.frameElement)
			{
				if (objParentWin.name != 'main')
				{
					abbleft += getPosX(objParentWin.frameElement);
				}
			}
			
		}
		return abbleft;
	}

	function getPosY(obj)
	{
		var abbtop = 0;
		if (obj.offsetParent)
		{
			while (obj.offsetParent)
			{
				abbtop += obj.offsetTop;
				obj = obj.offsetParent;

			}
			// FF supports .document/ defaultView whilst IE supports .ownerdocument/parentWindow
			var objDoc = getDoc(obj);				
			var objParentWin = getDocWin(objDoc);

			if (objParentWin.frameElement) 
			{
				if (objParentWin.name != 'main')
				{
					abbtop += getPosY(objParentWin.frameElement); 
				}	
			}	
		}
		return abbtop;
	}	
	
	function getPixelHeight(obj)
	{
		if (typeof(obj.style.pixelHeight) != "undefined") return obj.style.pixelHeight;
		else return obj.style.height.split("px")[0]-0;
	}	
	
	function getPixelWidth(obj)
	{
		if (typeof(obj.style.pixelWidth) != "undefined") return obj.style.pixelWidth;
		else return obj.style.width.split("px")[0]-0;
	}
	
	function getDocHeight(obj)
	{
		if (obj.defaultView)
		{
			return obj.body.scrollHeight;
		}
		else if (obj.parentWindow)
		{
			return obj.body.offsetHeight;;
		}
	}
	
	function IsChildElementOfParent(e, id)
	{
	// this method detects if you have clicked in an element within the specified parent id
	// if it is, will return a non-null object
	
		if (e.srcElement) 
		{
			// ie
			return getParentElementById(e.srcElement, id);
		}	
		else if (e.target) 
		{
			// ff/netscape
			return getParentElementById(e.target, id);
		}	
	}
	
	function getWindowHeight()
	{
		var myHeight = 0;
		if( typeof( window.innerWidth ) == 'number' ) 
		{
			//Non-IE
			myHeight = window.innerHeight;
		} 
		else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) 
		{
			//IE 6+ in 'standards compliant mode'
			myHeight = document.documentElement.clientHeight;
		} 
		else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) 
		{
			//IE 4 compatible
			myHeight = document.body.clientHeight;
		}	
		return myHeight;
	}
	
	function getWindowWidth()
	{
		var myWidth = 0;
		
		if( typeof( window.innerWidth ) == 'number' ) 
		{
			//Non-IE
			myWidth = window.innerWidth;
		} 
		else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) 
		{
			//IE 6+ in 'standards compliant mode'
			myWidth = document.documentElement.clientWidth;
		} 
		else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) 
		{
			//IE 4 compatible
			myWidth = document.body.clientWidth;
		}
		
		return myWidth;
	}
	 
	function loadXMLDoc(url, bIsAsync) 
	{
		loadMyXMLReq = null;
		// branch for native XMLHttpRequest object
		if(window.XMLHttpRequest && !(window.ActiveXObject)) 
		{
	    		try 
	    		{
				loadMyXMLReq = new XMLHttpRequest();
	        	} 
	        	catch(e) 
	        	{
	        		alert(e.message);
				loadMyXMLReq = false;
	        	}
	    	// branch for IE/Windows ActiveX version
	    	} 
	    	else if(window.ActiveXObject) 
	    	{
			loadMyXMLReq = new ActiveXObject("Microsoft.XMLDOM");
		}
					
		
		if(loadMyXMLReq) 
		{
			if (window.ActiveXObject) 
			{
				loadMyXMLReq.async = bIsAsync;
				loadMyXMLReq.load(url);				
			}
			else
			{
				try
				{
					loadMyXMLReq.onreadystatechange = processReqChange;
					loadMyXMLReq.open("GET", url, bIsAsync);
					loadMyXMLReq.send("");
				}
				catch (e)
				{
					if (window.console && window.console.log) window.console.log(e.message);
				}
				if (loadMyXMLReq.responseXML) return loadMyXMLReq.responseXML;
			}	
		}
		return loadMyXMLReq;
	}
	
	function getBrowser()
	{
		var d, dom, ie, ie4, ie5x, moz, mac, win, lin, old, ie5mac, ie5xwin, op;
	
		d = document;
		n = navigator;
		na = n.appVersion;
		nua = n.userAgent;
		win = ( na.indexOf( 'Win' ) != -1 );
		mac = ( na.indexOf( 'Mac' ) != -1 );
		lin = ( nua.indexOf( 'Linux' ) != -1 );
	
		if ( !d.layers )
		{
			dom = ( d.getElementById );
			op = ( nua.indexOf( 'Opera' ) != -1 );
			konq = ( nua.indexOf( 'Konqueror' ) != -1 );
			saf = ( nua.indexOf( 'Safari' ) != -1 );
			moz = ( nua.indexOf( 'Gecko' ) != -1 && !saf && !konq);
			ie = ( d.all && !op );
			ie4 = ( ie && !dom );
	
			/*
			ie5x tests only for functionality. ( dom||ie5x ) would be default settings. 
			Opera will register true in this test if set to identify as IE 5
			*/
	
			ie5x = ( d.all && dom );
			ie5mac = ( mac && ie5x );
			ie5xwin = ( win && ie5x );
		}
		
		if (konq) return "konqueror";
		else if (op) return "opera";
		else if (saf) return "safari";
		else if (moz) return "mozilla";
		else if (ie) return "msie";
		else if (ie4) return "msie4";
		else return "bastard";
}