<!--
/************************************************************************************
 **
 **		document object model
 **
 ************************************************************************************/


/************************************************************************************
 **		Constants
 **/
var BEFORE_BEGIN 	= 'beforebegin';
var AFTER_BEGIN 	= 'afterbegin';
var BEFORE_END		= 'beforeend';
var AFTER_END		= 'afterend';


/************************************************************************************
 **		Global identefiers
 **/
var isIE = !isIE ? Boolean(navigator.appName.toLowerCase().indexOf('microsoft internet explorer') != (-1)) : isIE;


/************************************************************************************
 **		Insert adjacent element
 **/
function insertAdjacentElementEx(oNode, strWhere, oParsedNode) {
	 try {
		switch (strWhere.toLowerCase()) {
			case BEFORE_BEGIN:
				oNode.parentNode.insertBefore(oParsedNode, oNode);
				break;
				
			case AFTER_BEGIN:
				oNode.insertBefore(oParsedNode, oNode.firstChild);
				break;
				
			case BEFORE_END:
				oNode.appendChild(oParsedNode);
				break;
				
			case AFTER_END:
				if (oNode.nextSibling) { 
					oNode.parentNode.insertBefore(oParsedNode, oNode.nextSibling);
				}
				else {
					oNode.parentNode.appendChild(oParsedNode);
				}
				break;
		 }
	 }
	 catch(e) {
	 }
}
	
	
/************************************************************************************
 **		Insert adjacent html
 **/	
function insertAdjacentHTMLEx(oNode, strWhere, strHTML) {
	 try {
		var oRange = oNode.ownerDocument.createRange();
		var oParsedNode = null;
		
		/* set range */
		oRange.setStartBefore(oNode);
		
		/* get html element */
		oParsedNode = oRange.createContextualFragment(strHTML);
		
		/* insert element */
		insertAdjacentElementEx(oNode, strWhere, oParsedNode);
	 }
	 catch(e) {
	 }
}
		
		
/************************************************************************************
 **		Insert adjacent text
 **/		
function insertAdjacentTextEx(oNode, strWhere, txtStr) {
	 try {
		var oTextoNode = document.createTextoNode(txtStr);
	
		/* insert text node */
		insertAdjacentElementEx(oNode, strWhere, oTextoNode);
	 }
	 catch(e) {
	 }
}
 
 
/************************************************************************************
 **		Swap nodes
 **/
function swapNodes(oNode1, oNode2) {
	 try {
		var oTempNode1 = oNode1.cloneNode(1);
		var oParentNode = oNode1.parentNode;
		
		/* swap */
		var oTempNode2 = oParentNode.replaceChild(oTempNode1, oNode2);
		
		oParentNode.replaceChild(oTempNode2, oNode1);
		oParentNode.replaceChild(oNode1, oTempNode1);
		
		/* free resources */
		delete (oTempNode1);
		delete (oTempNode2);
		
		oTempNode1 = null;
		oTempNode2 = null;
	 }
	 catch(e) {
	 }
}
 
 
/************************************************************************************
 **		Get element from point
 **/
function getElementFromPoint(pointX, pointY) {
	 try {
		if (document.elementFromPoint) {
			/* ie */
			document.elementFromPoint(pointX, pointY);
		}
		else {
			document.__oTarget__ = null;
			
			/* add event listener */
			document.addEventListener("mousemove", __onMouseMoveCallback__, false);
			
			/* create event object */
			var oEvent = document.createEvent("MouseEvents");
			
			/* get documents box object */
			var oBox = document.getBoxObjectFor(document.documentElement);
			
			/* initialize event */
			oEvent.initMouseEvent("mousemove", true, false, document.defaultView, 0, pointX + oBox.screenX, pointY + oBox.screenY, pointX, pointY, false, false, false, false, 0, null);
			
			/* dispatch event */
			document.dispatchEvent(oEvent);
			
			/* remove event listener */
			document.removeEventListener("mousemove", this.elementFromPoint__handler, false);
			
			/* return object */
			return document.__oTarget__;	
		}
	 }
	 catch(e) {
		return null;
	 }
}

function __onMouseMoveCallback__(event) {
	 document.__oTarget__ = event.explicitOriginalTarget;
	
	 /* ignore text nodes */
	 if (document.__oTarget__.nodeType == document.__oTarget__.TEXT_NODE) {
		document.__oTarget__ = document.__oTarget__.parentNode;
	 }
	
	 /* return body instead of html */
	 if ((document.__oTarget__.nodeName.toLowerCase() == "html") && 
		 (document.documentElement.nodeName.toLowerCase() == "html")) {
		document.__oTarget__ = document.getElementsByTagName("BODY").item(0);
	 }
	
	 /* prevent from bubbleling */
	 event.preventDefault();
	 event.stopPropagation(); 
} 
//-->
