//Make sure that the current page is at the very top of the frame.
 function isArray(a) 
 {
	return isObject(a) && a.constructor == Array;
 }

 function isObject(a) 
 {
	return (typeof a == 'object' && !!a) || isFunction(a);
 }
 
 function isFunction(a) 
 {
	return typeof a == 'function';
 }

function keyRestricted(event, strType, strCharList)
{
	//Note these only work for onKeyPress event.  onKeyUp and onKeyDown have different keyCode values for some reason.
	
	var strReturn = false;
	if (document.all)
	{
		var numkey = event.keyCode;
		var blnIsShiftKeyPressed = event.shiftKey;
	}
	else
	{
		var numkey = event.which;
		var blnIsShiftKeyPressed = event.modifiers & Event.SHIFT_MASK;
	}
	if (strCharList != "") var strChars = strCharList.split(",")

	//KEYCODES:
	//Numbers 0-9, regularkeys & numericpad: 48-57
	//Letters: a-z 97-122, and A-Z, 65-90
	//("-" 45), ("/" 47)
	//("." 46), ("," 44)

	switch (strType)
	{
		case "letters":
			if ((numkey==8) || (numkey==46) || ((numkey>=37) && (numkey<=40)))
			{
				if (((numkey>=65) && (numkey<=90)) && ((numkey>=97) && (numkey<=122))) strReturn = true;
			}
			break;
		case "numbers":
			if (blnIsShiftKeyPressed == false)
			{
				if ((numkey==0) || (numkey==8) || (numkey==46) || ((numkey>=37) && (numkey<=40)) || ((numkey>=48) && (numkey<=57))) strReturn = true;
			}
			break;
		case "numbersonly":
			if (blnIsShiftKeyPressed == false)
			{
				if (((numkey>=48) && (numkey<=57)) || (numkey==8) || (numkey==0)) strReturn = true;
			}
			break;
		case "date":
			if (blnIsShiftKeyPressed == false)
			{
				if (((numkey==8) || ((numkey>=37) && (numkey<=40))) || ((numkey==47) || (((numkey>=48) && (numkey<=57))))) strReturn = true;
			}
			break;
		case "phone":
			if (blnIsShiftKeyPressed == false)
			{
				if (((numkey==8) || ((numkey>=37) && (numkey<=40))) || ((numkey==45) || (((numkey>=48) && (numkey<=57))))) strReturn = true;
			}
			break;
		default:
			break;
	}
	return strReturn;
}

function trim(str)
{
	if (str != "") 
	    return str.replace(/^\s*|\s*$/g,"");
    else
        return str
}

//Expand and Collapse
function expcol(parentDiv, rowName, picName, rowVal, intHeight, e)
{
	var rootImgFolder = document.getElementById("rootImageFolder" + rowVal);
	var cpbox = document.getElementById("popbox");
	var curRow = document.getElementById(rowName + rowVal);
	var curImg = document.getElementById(picName + rowVal);
	if (parentDiv != "") var objParentDiv = document.getElementById(parentDiv);
	if (curImg.src.search(/plus.gif/gi) >= 0)
	{
		curRow.style.display = "block";
		if (curImg.src.search(/plus.gif/gi) >= 0) curImg.src = "../images/minus.gif";
		if (rootImgFolder) 
		{
			if (rootImgFolder.src.search(/folder/gi) >= 0) rootImgFolder.src = "../images/folderopen.gif";
		}
		curImg.alt = "Click here to collapse this tree";
	}
	else
	{
		curRow.style.display = "none";
		if (curImg.src.search(/minus.gif/gi) >= 0) curImg.src = "../images/plus.gif";
		if (rootImgFolder) 
		{
			if (rootImgFolder.src.search(/folder/gi) >= 0) rootImgFolder.src = "../images/folder.gif";
		}
		curImg.alt = "Click here to expand this tree";
	}
}

//finds current XML version on client machine
function findXMLVersion()
{
	var xmlVersion = ["4.0", "3.0", "2.6", "2.5", "2", "Microsoft", "MSXML"];
	var xmlDoc = "<?xml version=\"1.0\"?><Test>hellow World</Test>";
	var i, objXml, objXmlDom, strRetVal="";

	for (i=0; i <= xmlVersion.length-1; i++)
	{
		if (xmlVersion[i] == "Microsoft")
		{
			try 
			{
				objXML = new ActiveXObject("Microsoft.XMLDOM");
				objXML.async = false;
				if (objXML.loadXML(xmlDoc))
				{
					if (strRetVal == "") strRetVal = "Microsoft";
				}
			}
			catch (e)
			{
			}
		}
		else if (xmlVersion[i] == "MSXML")
		{
			try 
			{
				objXML = new ActiveXObject("Msxml.DOMDocument");
				objXML.async = false;
				if (objXML.loadXML(xmlDoc))
				{
					if (strRetVal == "") strRetVal = "Msxml";
				}
			}
			catch (e)
			{
			}
		}
		else if (xmlVersion[i] == "2")
		{
			try 
			{
				objXML = new ActiveXObject("Msxml2.DOMDocument");
				objXML.async = false;
				if (objXML.loadXML(xmlDoc))
				{
					if (strRetVal == "") strRetVal = "Msxml2";
				}
			}
			catch (e)
			{
			}
		}
		else
		{
			try 
			{
				objXML = new ActiveXObject("Msxml2.DOMDocument." + xmlVersion[i]);
				objXML.async = false;
				if (objXML.loadXML(xmlDoc))
				{ 
					if (strRetVal == "") strRetVal = "Msxml2";
				}
			}
			catch (e)
			{
			}	
		}
	}
	return strRetVal;
}

//dynamically fill object and display
function RebuildMain(objFilled, strPath, strPassfilterValue, nodeStatus)
{
	var strBuild="", strAnswer="";
	if (document.all)
		var poster = new ActiveXObject(findXMLVersion() + ".XMLHTTP")
	else
		var poster = new XMLHttpRequest();
	
	if (objFilled != "") objFilled = document.getElementById(objFilled);
	if (strPassfilterValue == "")
		strBuild = "<?xml version=\"1.0\"?><template />";
	else
	{
		switch (nodeStatus)
		{
			case "doDelete":
				strBuild = "<?xml version=\"1.0\"?><template>" + strPassfilterValue + "</template>";
				break;
			case "getTable":
				strBuild = "<?xml version=\"1.0\"?><template>" + strPassfilterValue + "</template>";
				break;
			case "getValue":
				strBuild = "<?xml version=\"1.0\"?><template>" + strPassfilterValue + "</template>";
				break;
			case "verifyDragToTargetID":
				strBuild = "<?xml version=\"1.0\"?><template>" + strPassfilterValue + "</template>";
				break;
			case "copymoveconfirm":
				strBuild = "<?xml version=\"1.0\"?><template>" + strPassfilterValue + "</template>";
				break;
			default:
				strBuild = "<?xml version=\"1.0\"?><template>" + strPassfilterValue + "||" + nodeStatus + "</template>";
				break;
		}
	}

	poster.open("POST", strPath, "false");
	poster.onreadystatechange=function() {
		//States of readyState:
		//0 - UNINITIALIZED, The object has been created, but not initialized (open method has not been called).
		//1 - LOADING, The object has been created, but the send method has not been called.
		//2 - LOADED, The send method has been called and the status and headers are available, but the response is not yet available.
		//3 - INITIALIZED, Some data has been received. You can call responseBody and responseText to get the current partial results.
		//4 - COMPLETED, All the data has been received, and the complete data is available in responseBody and responseText.

		if (poster.readyState == 4)
		{
		    if (poster.status == 200)
		    {
			    strBuild = strAnswer + poster.responseText;
			    if (objFilled != "") objFilled.innerHTML = strBuild;
		    }
		}
	}
	poster.send(strBuild);
	if ((nodeStatus == "verifyDragToTargetID") || (nodeStatus == "getTable") || (nodeStatus == "doDelete")) return strBuild;
}

//==================================================================================================================

	//This is a series of function used for moving HTML Elements on the page, namely DIVs correctly.

	var dragObj = new Object();
	dragObj.zIndex = 0;

	function dragStart(e, id, strScope)
	{
		var el, x, y;
		if (id)
			dragObj.elNode = document.getElementById(id);
		else 
		{
			if (document.all) 
				dragObj.elNode = window.event.srcElement;
			else 
				dragObj.elNode = e.target;

			//If this is a text node, use its parent element
			if (dragObj.elNode.nodeType == 3) dragObj.elNode = dragObj.elNode.parentNode;
		}
		dragObj.elScope = strScope;
		
		if (dragObj.elNode)
		{
            if (dragObj.elNode.style.position != "absolute") 
            {
                var xyCoordinate = findPosRelativeToParent(dragObj.elNode)
                var arrCoordinate = xyCoordinate.split("||");
                dragObj.elNode.style.position = "absolute";
                dragObj.elNode.style.left = arrCoordinate[0];
                dragObj.elNode.style.top = arrCoordinate[1];
            }
        }
        
		// Save starting positions of cursor and element.
		dragObj.elWidth = parseInt(dragObj.elNode.style.width);
		dragObj.elHeight = parseInt(dragObj.elNode.style.height);
		dragObj.elStartLeft = parseInt(dragObj.elNode.style.left, 10);
		dragObj.elStartTop = parseInt(dragObj.elNode.style.top, 10);
		if (isNaN(dragObj.elStartLeft)) dragObj.elStartLeft = 0;
		if (isNaN(dragObj.elStartTop)) dragObj.elStartTop = 0;
		dragObj.diffValX = (e.clientX - dragObj.elStartLeft);
		dragObj.diffValY = (e.clientY - dragObj.elStartTop);
		
		// Capture mousemove and mouseup events on the page.
		if (document.all) 
		{
			document.attachEvent("onmousemove", dragGo);
			document.attachEvent("onmouseup", dragStop);
			window.event.cancelBubble = true;
			window.event.returnValue = false;
		}
		else
		{
			document.addEventListener("mousemove", dragGo, true);
			document.addEventListener("mouseup", dragStop, true);
			e.preventDefault();
		}
	}

	function dragGo(event) 
	{
		var x, y, newLeft, newRight, newTop, newBottom, intWinHeight, intWinWidth;
	    if (document.all)
	        var curObjTarget = event.srcElement;
	    else
	        var curObjTarget = event.target;
	    
	    if ((curObjTarget.tagName != "BODY") && (curObjTarget.tagName != "HTML"))
	    {
	        var objContainer = getRelativeObjScrollAmount(curObjTarget);
		    if (document.all) 
		    {
                //alert(dragObj.elScope);
                if (dragObj.elScope == "element")
                {
                    if (objContainer.tagName != "BODY")
                    {
                        var intWinHeight = objContainer.clientHeight-2;
                        var intWinWidth = objContainer.clientWidth;
                    }
                    else
                    {
                        if (window.event)
                        {
                            window.event.cancelBubble = true;
			                window.event.returnValue = false;
                        }
                    }
                }
                else
                {
                    var intWinHeight = document.body.clientHeight-5;
                    var intWinWidth = document.body.clientWidth;
                }
		    }
		    else
		    {
                //alert(dragObj.elScope);
                if (dragObj.elScope == "element")
                {
                    if (objContainer.tagName != "BODY")
                    {
                        var intWinHeight = objContainer.clientHeight;
                        var intWinWidth = objContainer.clientWidth;
                    }
                    else
                    {
                        if (window.event)
                        {
                            window.event.cancelBubble = true;
			                window.event.returnValue = false;
                        }
                    }
                }
                else
                {
                    var intWinHeight = document.body.clientHeight-5;
                    var intWinWidth = document.body.clientWidth-5;
                }
		    }
		    //alert(intWinWidth + " : " + intWinHeight);
		}
		
		//Move drag element by the same amount the cursor has moved.
		newLeft = (event.clientX - dragObj.diffValX);
		newTop = (event.clientY - dragObj.diffValY);
		newRight = (newLeft + dragObj.elWidth);
		newBottom = (newTop + dragObj.elHeight);
		if ((newLeft>=0) && (newTop>=0) && (newRight<=intWinWidth) && (newBottom<=intWinHeight))
		{
			dragObj.elNode.style.left = newLeft + "px";
			dragObj.elNode.style.top = newTop + "px";
		}
	    if (newLeft<0) dragObj.elNode.style.left = "0px";
	    if (newTop<0) dragObj.elNode.style.top = "0px";
        if (newRight>intWinWidth) dragObj.elNode.style.left = (intWinWidth - dragObj.elWidth) + "px";
        if (newBottom>intWinHeight) dragObj.elNode.style.top = (intWinHeight - dragObj.elHeight) + "px";
		
		if (document.all) 
		{
			window.event.cancelBubble = true;
			window.event.returnValue = false;
		}
		else
			event.preventDefault();
	}

	function dragStop(event) 
	{
		// Stop capturing mousemove and mouseup events.
		if (document.all) 
		{
			document.detachEvent("onmousemove", dragGo);
			document.detachEvent("onmouseup", dragStop);
		}
		else 
		{
			document.removeEventListener("mousemove", dragGo, true);
			document.removeEventListener("mouseup", dragStop, true);
		}
	}

//==================================================================================================================

	//This is a series of function used for generating dynamic menus.
	var objRootMenuStart = "", histMenuActive = "";
	var cancelTimeOut = new Array(1);
	cancelTimeOut[0] = new Array();
	cancelTimeOut[1] = new Array();
	function genMenu(e, curObj, menuStatus, navMenuDirection, lastNavMenuDirection, extraXPosSpace, extraYPosSpace, targetMenuName, menuImportPage, passValstoImportMenuPage, dispDimensionsExact)
	{
	    var newHistMenuActive = ""
	    objTestArea = document.getElementById("testarea");
        if (menuStatus == "on")
        {
            curObj.style.cursor = "pointer";
            //objTestArea.innerHTML += "UBOUND S: " + cancelTimeOut[1].length + "<br>"
            for (var t=0; t<=cancelTimeOut[1].length-1; t++)
            {
                //objTestArea.innerHTML += "OPEN: " + targetMenuName + " - " + cancelTimeOut[0][t] + "<br>";
                if (targetMenuName.toLowerCase() == cancelTimeOut[0][t].toLowerCase())
                {
                    newHistMenuActive = eval("histMenuActive.replace(/" + targetMenuName + ",/gi, \"-\")");
                    window.clearTimeout(cancelTimeOut[1][t]);
                    //objTestArea.innerHTML += "OPEN1: " + targetMenuName + " - CANCEL: " + cancelTimeOut[0][t] + " - " + cancelTimeOut[1][t] + "<br>";
                    cancelTimeOut[0].splice(t, 1);
                    cancelTimeOut[1].splice(t, 1);
                    t--
                }
            }
   
            if (newHistMenuActive.search(/-/gi) > 0)
            {
                //objTestArea.innerHTML += "UBOUND M: " + cancelTimeOut[1].length + "<br>"
                var newHistMenuSeq = newHistMenuActive.slice(0, newHistMenuActive.search(/-/gi));
                for (var v=0; v<=cancelTimeOut[1].length-1; v++)
                {
                    //objTestArea.innerHTML += "OPEN: " + v + " : " + targetMenuName + " - " + cancelTimeOut[0][v] + "<br>";
                    if (eval("newHistMenuSeq.toLowerCase().search(/" + cancelTimeOut[0][v].toLowerCase() + ",/gi) >= 0"))
                    {
                        window.clearTimeout(cancelTimeOut[1][v]);
                        //objTestArea.innerHTML += "OPEN2: " + targetMenuName + " - CANCEL: " + cancelTimeOut[0][v] + " - " + cancelTimeOut[1][v] + "<br>";
                        cancelTimeOut[0].splice(v, 1);
                        cancelTimeOut[1].splice(v, 1);
                        v--
                    }
                }
            }
            //objTestArea.innerHTML += "UBOUND E: " + cancelTimeOut[1].length + "<br>"
   
            //-----------------------------------------------------------------------------------------------------
            if (!document.getElementById(targetMenuName))
            {
                //objTestArea.innerHTML += "BEFORE CREATE HIST: " + histMenuActive + "<br>";
                if (histMenuActive.search(/,/gi) >= 0)
                {
                    var arrHistMenuActive = histMenuActive.slice(0, histMenuActive.length-1).split(",");
                    var arrLastActiveMenu = arrHistMenuActive[arrHistMenuActive.length-1].split(":");
                    var lastActiveMenuTreeLevel = parseInt(arrLastActiveMenu[1]);
                    var arrTargetMenuName = targetMenuName.split(":");
                    var targetMenuNameTreeLevel = parseInt(arrTargetMenuName[1]);
                    //objTestArea.innerHTML += histMenuActive + " --- " + arrHistMenuActive[arrHistMenuActive.length-1] + "<br>"
                    //objTestArea.innerHTML += arrHistMenuActive[arrHistMenuActive.length-1] + " --- " + targetMenuName + "<br>"
                    if (lastActiveMenuTreeLevel == targetMenuNameTreeLevel) 
                    {
                        histMenuActive = eval("histMenuActive.replace(/" + arrHistMenuActive[arrHistMenuActive.length-1] + ",/gi, \"\")");
                        //objTestArea.innerHTML += arrHistMenuActive[arrHistMenuActive.length-1] + " : " + document.getElementById(trim(arrHistMenuActive[arrHistMenuActive.length-1])) + "<br>";
                        if (document.getElementById(arrHistMenuActive[arrHistMenuActive.length-1]))
                        {
                            var objDestroy = document.getElementById(arrHistMenuActive[arrHistMenuActive.length-1]);
                            document.body.removeChild(objDestroy);
                            for (var y=0; y<=cancelTimeOut[1].length-1; y++)
                            {
                                if (cancelTimeOut[0][y].toLowerCase() == arrHistMenuActive[arrHistMenuActive.length-1].toLowerCase())
                                {
                                    window.clearTimeout(cancelTimeOut[1][y]);
                                    cancelTimeOut[0].splice(y, 1);
                                    cancelTimeOut[1].splice(y, 1);
                                    y--
                                }
                            }
                        }
                    }
                }
                histMenuActive += targetMenuName + ",";
                //objTestArea.innerHTML += "AFTER CREATE HIST: " + histMenuActive + "<br>";
                
                if (document.all)
                {
                    var intWidth = document.body.clientWidth;
                    var intHeight = document.body.clientHeight;
                }
                else
                {
                    var intWidth = window.innerWidth;
                    var intHeight = window.innerHeight;
                }
                //alert(intWidth + " : " + intHeight);
        	
                curObjWidth = curObj.offsetWidth;
                curObjHeight = curObj.offsetHeight;
                var arrLoc = findPos(curObj, navMenuDirection, lastNavMenuDirection).split("||");
                var xPos = arrLoc[0];
                var yPos = arrLoc[1];
                
                var createdDIV = document.createElement("DIV");
                createdDIV.id = targetMenuName;
                createdDIV.style.position = "absolute";
                createdDIV.style.zIndex = 9;
                var objLoadingDisplay = "<DIV style=\"background-color:#FFFFFF;border:1px solid #000000;width:60px;padding:3px;\">";
                objLoadingDisplay += "<DIV style=\"text-align:center;\"><IMG SRC=\"images/spinner.gif\"></DIV>";
                objLoadingDisplay += "<DIV style=\"margin-top:7px;text-align:center;font-family:arial;font-weight:bold;font-size:8pt;\">Loading...</DIV>";
                objLoadingDisplay += "</DIV>";
                createdDIV.innerHTML = objLoadingDisplay;
                document.body.appendChild(createdDIV);
                
                var strVals = intHeight + "|*|" + intWidth + "|*|" + navMenuDirection + "|*|" + lastNavMenuDirection + "|*|" + xPos + "|*|" + yPos + "|*|";
                strVals += extraXPosSpace + "|*|" + extraYPosSpace + "|*|" + targetMenuName;
                displayDynamicWindow(strVals, createdDIV, curObj, histMenuActive, objTestArea)

                //------------------------------------------------------------------------------------------------------

                if (document.all)
                    var poster = new ActiveXObject(findXMLVersion() + ".XMLHTTP")
                else
                    var poster = new XMLHttpRequest();	
                var strBuild = "<?xml version=\"1.0\"?><template>" + passValstoImportMenuPage + "</template>";
                poster.open("POST", menuImportPage, true);
                poster.onreadystatechange=function() {
                    if (poster.readyState == 4)
                    {
                        //alert(poster.responseText);
                        if (poster.status == 200)
                        {
                            createdDIV.innerHTML = poster.responseText;
                            if ((dispDimensionsExact == "") || (dispDimensionsExact == "no") || (dispDimensionsExact == "xonly") || (dispDimensionsExact == "yonly"))
                            {
                                var strVals = intHeight + "|*|" + intWidth + "|*|" + navMenuDirection + "|*|" + lastNavMenuDirection + "|*|" + xPos + "|*|" + yPos + "|*|";
                                strVals += extraXPosSpace + "|*|" + extraYPosSpace + "|*|" + targetMenuName;
                                displayDynamicWindow(strVals, createdDIV, curObj, histMenuActive, objTestArea)
                            }
                            else
                            {
                                createdDIV.style.left = parseInt(extraXPosSpace) + "px";
                                createdDIV.style.top = parseInt(extraYPosSpace) + "px";
                            }
                            if (dispDimensionsExact == "xonly") createdDIV.style.left = parseInt(extraXPosSpace) + "px";
                            if (dispDimensionsExact == "yonly") createdDIV.style.top = parseInt(extraYPosSpace) + "px";
                            
                            //alert(createdDIV.style.left + " : " + createdDIV.style.top);
                            if (createdDIV) createdDIV.style.visibility = "visible";
                        } 
                    }
                }
                poster.send(strBuild);
            }
        }
        else
        {
            var valDelay = 250;
            if (document.all)
                var tarElement = e.toElement;
            else 
                var tarElement = e.relatedTarget;
            //var blnCurObjIsParent = chkifParent(curObj, tarElement);
            //objTestArea.innerHTML += blnCurObjIsParent + " : " + curObj.tagName + " : " + (curObj == tarElement) + " : " + tarElement.tagName + "<br>"
            //if ((blnCurObjIsParent==false) && (curObj != tarElement))
            //{      
                var iUbound = cancelTimeOut[0].length;
                var iTOUbound = cancelTimeOut[1].length;
                if (trim(histMenuActive) != "")
                {
                    newHistMenuActive = histMenuActive.slice(0, histMenuActive.length-1);
                    if (newHistMenuActive.search(/,/gi) >= 0)
                    {
                        var arrHistMenuActive = newHistMenuActive.split(",");
                        for (var i=0; i<=arrHistMenuActive.length-1; i++)
                        {
                            cancelTimeOut[0][iUbound+i] = arrHistMenuActive[i];
                            cancelTimeOut[1][iTOUbound+i] = window.setTimeout("closeMenu('" + arrHistMenuActive[i] + "')", valDelay);
                            //objTestArea.innerHTML += "CLOSE2: " + cancelTimeOut[0][iUbound+i] + " - " + cancelTimeOut[1][iTOUbound+i] + "<br>";
                        }
                    }
                    else
                    {
                        cancelTimeOut[0][iUbound] = newHistMenuActive;
                        cancelTimeOut[1][iTOUbound] = window.setTimeout("closeMenu('" + newHistMenuActive + "')", valDelay);
                        //objTestArea.innerHTML += "CLOSE1: " + cancelTimeOut[0][iUbound] + " - " + cancelTimeOut[1][iTOUbound] + "<br>";
                    }
                }
                //objTestArea.innerHTML += "---------------------<br>"
            //}
        }
	}

    function displayDynamicWindow(strVals, createdDIV, curObj, histMenuActive, objTestArea)
    {
        var arrVals = strVals.split("|*|");
        var intHeight = arrVals[0];
        var intWidth = arrVals[1];
        var navMenuDirection = arrVals[2];
        var lastNavMenuDirection = arrVals[3];
        var xPos = arrVals[4];
        var yPos = arrVals[5];
        var extraXPosSpace = arrVals[6];
        var extraYPosSpace = arrVals[7];
        var targetMenuName = arrVals[8];
        
        var objRelativeParent = getRelativeObjScrollAmount(curObj);
        if (objRelativeParent)
        {
            //alert(objRelativeParent.tagName + " : " + objRelativeParent.scrollTop);
            var valRelParentScrollTop = objRelativeParent.scrollTop;
            var valRelParentScrollLeft = objRelativeParent.scrollLeft;
            //alert(valRelParentScrollLeft + " : " + valRelParentScrollTop);
        }
             
        //objTestArea.innerHTML += "CREATED ID: " + createdDIV.id + "<br>";
        var createdDIVWidth = createdDIV.offsetWidth;
        var createdDIVHeight = createdDIV.offsetHeight;
        var getCurObjParentHist =  eval("histMenuActive.replace(/" + targetMenuName + ",/gi, \"\")");
        if (getCurObjParentHist != "")
        {
            var arrCurObjParentHist = getCurObjParentHist.slice(0, getCurObjParentHist.length-1).split(",");
            var objParentCheck = document.getElementById(arrCurObjParentHist[arrCurObjParentHist.length-1]);
            if (objParentCheck)
            {
                var arrLocALT = findPos(objParentCheck, navMenuDirection, lastNavMenuDirection).split("||");
                if ((navMenuDirection == "left") || (navMenuDirection == "right"))
                    xPos = arrLocALT[0];
                else
                {
                    xPos = arrLocALT[0];
                    yPos = arrLocALT[1];
                }
                curObjWidth = objParentCheck.offsetWidth;
                curObjHeight = objParentCheck.offsetHeight;
            }
        }  
                
        switch (navMenuDirection)
        {
            case "right":
                if (valRelParentScrollLeft) xPos = (parseInt(xPos) - parseInt(valRelParentScrollLeft));
                if (valRelParentScrollTop) yPos = (parseInt(yPos) - parseInt(valRelParentScrollTop));
                
                //show menu on right side if there is enough space to do so
                createdDIV.style.left = (parseInt(xPos) + parseInt(curObjWidth) + parseInt(extraXPosSpace));
                var bottomMenuEndPoint = (parseInt(yPos) + parseInt(createdDIVHeight) + parseInt(extraYPosSpace));
                var topMenuStartPoint = (parseInt(yPos) + parseInt(curObjHeight) - parseInt(createdDIVHeight) - parseInt(extraYPosSpace));
                if (bottomMenuEndPoint > intHeight)
                    createdDIV.style.top = (parseInt(yPos) + parseInt(curObjHeight) - parseInt(createdDIVHeight) - parseInt(extraYPosSpace));
                else
                    createdDIV.style.top = (parseInt(yPos) + parseInt(extraYPosSpace));

                var rightMenuEndPoint = (parseInt(xPos) + parseInt(curObjWidth) + parseInt(extraXPosSpace) + parseInt(createdDIVWidth));
                if (rightMenuEndPoint > intWidth)
                {
                    //show menu on left side if there isn't enough room on the right side
                    createdDIV.style.left = (parseInt(xPos) - parseInt(createdDIVWidth) - parseInt(extraXPosSpace));
                    
                    var bottomMenuEndPoint = (parseInt(yPos) + parseInt(createdDIVHeight) + parseInt(extraYPosSpace));
                    var topMenuStartPoint = (parseInt(yPos) + parseInt(curObjHeight) - parseInt(createdDIVHeight) - parseInt(extraYPosSpace));
                    if (bottomMenuEndPoint > intHeight)
                        createdDIV.style.top = (parseInt(yPos) + parseInt(curObjHeight) - parseInt(createdDIVHeight) - parseInt(extraYPosSpace));
                    else
                        createdDIV.style.top = (parseInt(yPos) + parseInt(extraYPosSpace));
                }
                break;
            case "left":
                if (valRelParentScrollLeft) xPos = (parseInt(xPos) - parseInt(valRelParentScrollLeft));
                if (valRelParentScrollTop) yPos = (parseInt(yPos) - parseInt(valRelParentScrollTop));
                
                //show menu on left side if there is enough space to do so
                createdDIV.style.left = (parseInt(xPos) - parseInt(createdDIVWidth) - parseInt(extraXPosSpace));
                
                var bottomMenuEndPoint = (parseInt(yPos) + parseInt(createdDIVHeight) + parseInt(extraYPosSpace));
                var topMenuStartPoint = (parseInt(yPos) + parseInt(curObjHeight) - parseInt(createdDIVHeight) - parseInt(extraYPosSpace));
                if (bottomMenuEndPoint > intHeight)
                    createdDIV.style.top = (parseInt(yPos) + parseInt(curObjHeight) - parseInt(createdDIVHeight) - parseInt(extraYPosSpace));
                else
                    createdDIV.style.top = (parseInt(yPos) + parseInt(extraYPosSpace));
                    
                var leftMenuStartPoint = (parseInt(xPos) - parseInt(createdDIVWidth)- parseInt(extraXPosSpace));
                if (leftMenuStartPoint < 0)
                {
                    //show menu on right side if there isn't enough room on the left side
                    createdDIV.style.left = (parseInt(xPos) + parseInt(curObjWidth) + parseInt(extraXPosSpace));
                    
                    var bottomMenuEndPoint = (parseInt(yPos) + parseInt(createdDIVHeight) + parseInt(extraYPosSpace));
                    var topMenuStartPoint = (parseInt(yPos) + parseInt(curObjHeight) - parseInt(createdDIVHeight) - parseInt(extraYPosSpace));
                    if (bottomMenuEndPoint > intHeight)
                        createdDIV.style.top = (parseInt(yPos) + parseInt(curObjHeight) - parseInt(createdDIVHeight) - parseInt(extraYPosSpace));
                    else
                        createdDIV.style.top = (parseInt(yPos) + parseInt(extraYPosSpace));
                }
                break;
            case "bottom":
                if (valRelParentScrollLeft) xPos = (parseInt(xPos) - parseInt(valRelParentScrollLeft));
                if (valRelParentScrollTop) yPos = (parseInt(yPos) - parseInt(valRelParentScrollTop));
            
                var rightMenuEndPoint = (parseInt(xPos) + parseInt(createdDIVWidth) + parseInt(extraXPosSpace));
                var leftMenuStartPoint = (parseInt(xPos) + parseInt(curObjWidth) - parseInt(createdDIVWidth) - parseInt(extraXPosSpace));
                if (rightMenuEndPoint > intWidth)
                    createdDIV.style.left = (parseInt(xPos) + parseInt(curObjWidth) - parseInt(createdDIVWidth) - parseInt(extraXPosSpace));
                else if (leftMenuStartPoint < 0) 
                    createdDIV.style.left = (parseInt(xPos) + parseInt(extraXPosSpace));
                else
                    createdDIV.style.left = (parseInt(xPos) + parseInt(extraXPosSpace))   
                //show menu on bottom side if there is enough space to do so
                createdDIV.style.top = (parseInt(yPos) + parseInt(curObjHeight) + parseInt(extraYPosSpace));

                var bottomMenuEndPoint = (parseInt(yPos) + parseInt(curObjHeight) + parseInt(extraYPosSpace) + parseInt(createdDIVHeight));
                if (bottomMenuEndPoint > intHeight)
                {
                    var rightMenuEndPoint = (parseInt(xPos) + parseInt(createdDIVWidth) + parseInt(extraXPosSpace));
                    var leftMenuStartPoint = (parseInt(xPos) + parseInt(curObjWidth) - parseInt(createdDIVWidth) - parseInt(extraXPosSpace));
                    if (rightMenuEndPoint > intWidth) 
                        createdDIV.style.left = (parseInt(xPos) + parseInt(curObjWidth) - parseInt(createdDIVWidth) - parseInt(extraXPosSpace));
                    else if (leftMenuStartPoint < 0) 
                        createdDIV.style.left = (parseInt(xPos) + parseInt(curObjWidth) + parseInt(extraXPosSpace));
                    else
                        createdDIV.style.left = (parseInt(xPos) + parseInt(extraXPosSpace))
                    
                    //show menu on top side if there isn't any space on the bottom side
                    createdDIV.style.top = (parseInt(yPos) - parseInt(curObjHeight) - parseInt(extraYPosSpace));
                }
                break;
            case "top":
                if (valRelParentScrollLeft) xPos = (parseInt(xPos) - parseInt(valRelParentScrollLeft));
                if (valRelParentScrollTop) yPos = (parseInt(yPos) - parseInt(valRelParentScrollTop));
                
                var rightMenuEndPoint = (parseInt(xPos) + parseInt(createdDIVWidth) + parseInt(extraXPosSpace));
                var leftMenuStartPoint = (parseInt(xPos) + parseInt(curObjWidth) - parseInt(createdDIVWidth) - parseInt(extraXPosSpace));
                if (rightMenuEndPoint > intWidth) 
                    createdDIV.style.left = (parseInt(xPos) + parseInt(curObjWidth) - parseInt(createdDIVWidth) - parseInt(extraXPosSpace));
                else if (leftMenuStartPoint < 0) 
                    createdDIV.style.left = (parseInt(xPos) + parseInt(extraXPosSpace));
                else
                    createdDIV.style.left = (parseInt(xPos) + parseInt(extraXPosSpace))
                
                //show menu on top side if there is enough space to do so
                createdDIV.style.top = (parseInt(yPos) - parseInt(curObjHeight) - parseInt(extraYPosSpace));
                
                var topMenuStartPoint = (parseInt(yPos) - parseInt(curObjHeight) - parseInt(extraYPosSpace) - parseInt(createdDIVHeight));
                if (topMenuStartPoint < 0)
                {
                    var rightMenuEndPoint = (parseInt(xPos) + parseInt(createdDIVWidth) + parseInt(extraXPosSpace));
                    var leftMenuStartPoint = (parseInt(xPos) + parseInt(curObjWidth) - parseInt(createdDIVWidth) - parseInt(extraXPosSpace));
                    if (rightMenuEndPoint > intWidth) 
                        createdDIV.style.left = (parseInt(xPos) + parseInt(curObjWidth) - parseInt(createdDIVWidth) - parseInt(extraXPosSpace));
                    else if (leftMenuStartPoint < 0) 
                        createdDIV.style.left = (parseInt(xPos) + parseInt(curObjWidth) + parseInt(extraXPosSpace));
                    else
                        createdDIV.style.left = (parseInt(xPos) + parseInt(extraXPosSpace))
                    
                    //show menu on bottom side if there isn't enough room on the top side
                    createdDIV.style.top = (parseInt(yPos) + parseInt(curObjHeight) + parseInt(extraYPosSpace));
                }
                break;
            default:
                break;
        }
    }

	function closeMenu(targetMenuName, tarParentID, tarParentTAGNAME)
	{
	    var curMenuDIV = document.getElementById(targetMenuName);
	    if (curMenuDIV) document.body.removeChild(curMenuDIV);
	    
	    histMenuActive = eval("histMenuActive.replace(/" + targetMenuName + ",/gi, \"\")");
	    //objTestArea.innerHTML += "DESTROY HIST: " + histMenuActive + "<br>";
	}
	
	function findPos(obj, navMenuDirection, lastNavMenuDirection) 
	{
	    var curleft = curtop = 0;
	    if (obj.offsetParent) 
	    {
	        do
	        {
	            curleft += obj.offsetLeft;
	            curtop += obj.offsetTop;
	            switch (navMenuDirection)
	            {
	                case "left":
	                    if (parseInt(obj.style.paddingLeft)) curleft -= parseInt(obj.style.paddingLeft);
	                    break;
	                case "right":
	                    if (parseInt(obj.style.paddingLeft)) curleft += parseInt(obj.style.paddingLeft);
	                    break;
	                case "top":
	                    if (parseInt(obj.style.paddingTop)) curtop -= parseInt(obj.style.paddingTop);
	                    break;
	                case "bottom":
	                    if (parseInt(obj.style.paddingTop)) curtop += parseInt(obj.style.paddingTop);
	                    break;
	                default:
	                    break;
	            }
	        }
	        while (obj = obj.offsetParent) 
	    }
	    var retVal = curleft + "||" + curtop;
	    return retVal
    }

	function findPosRelativeToParent(obj) 
	{
	    var curleft = curtop = 0;
	    if (obj.offsetParent) 
	    {
	        do
	        {
	            if (obj.style.position == "relative") break;
	            curleft += obj.offsetLeft;
	            curtop += obj.offsetTop;
	        }
	        while (obj = obj.offsetParent) 
	    }
	    var retVal = curleft + "||" + curtop;
	    return retVal;
    }

    function getRelativeObjScrollAmount(curObj)
    {
        var blnContinue = true;
        while (blnContinue)
        {
            if (curObj.parentNode)
            {
                curObj = curObj.parentNode;
                if (curObj.style.position == "relative") blnContinue = false;
            }
            if (trim(curObj.tagName) == "BODY") blnContinue = false;
        }
        return curObj;
    }

    function findParentObj(curObj)
    {
        var blnContinue = true;
        while (blnContinue)
        {
            if (curObj.parentNode)
            {
                curObj = curObj.parentNode;
                if (curObj.id)
                {
                    if (trim(curObj.tagName.toUpperCase()) == "DIV")
                    {
                        //alert(curObj.id);
                        if (curObj.style.position == "absolute") blnContinue = false;
                    }
                }
            }
            if (trim(curObj.tagName) == "BODY") blnContinue = false;
        }
        return curObj;
    }
    
    function findFirstTagName(objParent, tagName)
    {
        var objReturn = "";
        if (objParent.childNodes)
        {
            for (var i=0; i<=objParent.childNodes.length; i++)
            {
                if (objParent.childNodes[i])
                {
                    if (objParent.childNodes[i].tagName)
                    {
                        //alert(objParent.childNodes[i].tagName)
                        if (objParent.childNodes[i].tagName.toLowerCase() == tagName.toLowerCase())
                        {
                            objReturn = objParent.childNodes[i];
                            break;
                        }
                    }
                }
            }
        }
        return objReturn;
    }
    
    function chkifParent(curObj, tarElement)
    {
        var blnContinue = true, blnIsParent = false;
        if (tarElement)
        {
            var objTarget = tarElement;
            while (blnContinue)
            {
                if (objTarget.tagName)
                {
                    if (objTarget.tagName != "BODY")
                    {
                        if (objTarget.parentNode)
                        {
                            objTarget = objTarget.parentNode;
                            if (objTarget.tagName == "BODY")
                                break;
                            else
                            {
                                if (curObj == objTarget) 
                                {
                                    blnContinue = false
                                    blnIsParent = true;
                                }
                            }
                        }
                    }
                    else
                        break;
                }
                else
                    break;
            }
            return blnIsParent;
        }
    }
