/*---------------------------------------------------------------------
	JavaScript DOM Dynamic Dropdown Menu JS

	REQUIREMENTS:
		Works in conjunction with /assets/css/dropdowns.css
		Utilizes functions found in /assets/js/functions.js
	
	USAGE:
		Make sure function InitMenuDropdowns() is called in the window.onload event 
		
-----------------------------------------------------------------------*/

/*-------------------------------
	general setup
---------------------------------*/
var bDebugDropdowns = false;
var sNavImgPath = "/assets/images/skin/basic/nav/";

var iMenuWidth = 0;
var iMainNavX = 0; 
var iMainNavY = 0; 

/*-------------------------------
	InitMenuDropdowns() - called from window.onload event
---------------------------------*/
InitMenuDropdowns = function() {
	//alert("InitMenuDropdowns");
	if (!document.getElementById) return
	InitMenuDropdownLists();
}

/*-------------------------------
	InitMenuDropdownLists()
---------------------------------*/
InitMenuDropdownLists = function() {
	//alert("InitMenuDropdownLists");
	/*---------------
		parse semantic lists; apply classes/rollover functions via DOM
	---------------*/
	var mainNavRoot = document.getElementById("Nav");
	
	iMenuWidth = mainNavRoot.offsetWidth;
	iMainNavX = GetAbsXPosByNode(mainNavRoot);
	iMainNavY = GetAbsYPosByNode(mainNavRoot);
	

	/*---------------
		Use DOM to add debug information to <div id="DebugInfo"></div>
	---------------*/
	if (bDebugDropdowns) {
		var debugInfoRoot = document.getElementById("DebugInfo");

		oDebugHeaderTag = document.createElement("h3");
		oDebugHeaderText = document.createTextNode("Debug Info");
		oDebugHeaderTag.appendChild(oDebugHeaderText);
		debugInfoRoot.appendChild(oDebugHeaderTag);

		oDebugTag = document.createElement("p");
		oDebugStrongTag = document.createElement("strong");
		oDebugStrongText = document.createTextNode("Main Nav Width: ");
		oDebugStrongTag.appendChild(oDebugStrongText);
		oDebugTag.appendChild(oDebugStrongTag);
		oDebugText = document.createTextNode(iMenuWidth);
		oDebugTag.appendChild(oDebugText);
		debugInfoRoot.appendChild(oDebugTag);

		oDebugTag = document.createElement("p");
		oDebugStrongTag = document.createElement("strong");
		oDebugStrongText = document.createTextNode("Main Nav Coordinates: ");
		oDebugStrongTag.appendChild(oDebugStrongText);
		oDebugTag.appendChild(oDebugStrongTag);
		oDebugText = document.createTextNode("(" + iMainNavX + ", " + iMainNavY + ")");
		oDebugTag.appendChild(oDebugText);
		debugInfoRoot.appendChild(oDebugTag);
	}

	/*---------------
		now that "Nav" is found, dive down and apply styles and events to semantic list menu items.
	---------------*/

	InitMenuDropdownListsDive(mainNavRoot.firstChild.firstChild);
}

/*-------------------------------
	addTextToDebug()
---------------------------------*/
function addTextToDebug(sText) {
	var debugInfoRoot = document.getElementById("DebugInfo");
	oDebugTag = document.createElement("small");
	oDebugBRTag = document.createElement("br");
	oDebugText = document.createTextNode(sText);
	oDebugTag.appendChild(oDebugText);
	debugInfoRoot.appendChild(oDebugTag);
	debugInfoRoot.appendChild(oDebugBRTag);
}

/*-------------------------------
	addNodeToDebug()
---------------------------------*/
function addNodeToDebug(oNode) {
	var debugInfoRoot = document.getElementById("DebugInfo");
	oDebugTag = document.createElement("small");
	oDebugBRTag = document.createElement("br");
	oDebugText = document.createTextNode("Node <"+oNode.nodeName+"> " + oNode.id);
	oDebugTag.appendChild(oDebugText);
	debugInfoRoot.appendChild(oDebugTag);
	debugInfoRoot.appendChild(oDebugBRTag);
}

/*-------------------------------
	InitMenuDropdownListsDive()
---------------------------------*/
InitMenuDropdownListsDive = function(oCurrentNode) {
    //addNodeToDebug(oCurrentNode);

    if (oCurrentNode.nodeName == "UL") {
        if (!cssClassActions('check', oCurrentNode, "SelectedSubs")) {
            cssClassActions('add', oCurrentNode, 'MenuListOff');
        }
    }

    if (oCurrentNode.nodeName == "LI") {
        //addEvent(oCurrentNode, 'mouseover', MenuListItemOnMouseOver, false);
        //addEvent(oCurrentNode, 'mouseout', MenuListItemOnMouseOut, false);

        /*	Following onmouseover and onmouseout replace 2 addEvent() function calls above until I can figure out why 
        IE doesnt get correct LI target when attachEvent is used. */
        oCurrentNode.onmouseover = function() {
            for (j = 0; j < this.childNodes.length; j++) {
                if (this.childNodes[j].nodeName == "UL") {
                    if (this.childNodes[j].className != 'SelectedSubs') {
                        this.childNodes[j].className = 'MenuListOver';

                        if (navigator.appVersion.indexOf('MSIE') != -1 && navigator.appVersion.indexOf('8.0') == -1) {

                            var parentOffset;

                            parentOffset = this.offsetParent.offsetTop;

                            if (this.offsetParent.offsetTop == 0) {
                                //alert("1");
                                this.childNodes[j].style.top = this.offsetTop + 'px';
                            }
                            //parentOffset == 151 || parentOffset == 136 && this.parentNode.outerHTML.indexOf('MenuListOff') == -1
                            else if (parentOffset != 0 && this.parentNode.outerHTML.indexOf('SelectedSubs') != -1) {
                                //alert(this.parentNode.outerHTML);
                                //alert(this.parentNode.innerHTML);
                                this.childNodes[j].style.top = (this.offsetTop - this.offsetParent.offsetTop) + 'px';
                            }
                            else {
                                //alert(this.parentNode.outerHTML);
                                //alert(this.parentNode.innerHTML);
                                //alert(parentOffset)

                                var topPos;

                                topPos = (this.offsetTop - this.offsetParent.offsetTop - 150);
                                //alert(topPos);
                                if (topPos <= 0) {
                                    topPos = this.offsetTop;
                                }
                                this.childNodes[j].style.top = topPos + 'px';
                            }
                        }
                        else {
                            this.childNodes[j].style.top = this.offsetTop + 'px';
                        }

                        this.childNodes[j].style.left = this.offsetLeft + iMenuWidth + 'px';
                    }
                }
            }
        }
        oCurrentNode.onmouseout = function() {
            for (j = 0; j < this.childNodes.length; j++) {
                if (this.childNodes[j].nodeName == "UL") {
                    if (this.childNodes[j].className != 'SelectedSubs') {
                        this.childNodes[j].className = 'MenuListOff';
                    }
                }
            }
        }

    }

    if (oCurrentNode.nodeName == "A") {
        if (cssClassActions('check', oCurrentNode, "MenuLink")) {
            addEvent(oCurrentNode, 'mouseover', MenuLinkOnMouseOver, false);
            addEvent(oCurrentNode, 'mouseout', MenuLinkOnMouseOut, false);
        }
        if (cssClassActions('check', oCurrentNode, "NavImg")) {
            addEvent(oCurrentNode, 'mouseover', NavImgOnMouseOver, false);
            addEvent(oCurrentNode, 'mouseout', NavImgOnMouseOut, false);

            //	Use letter-spacing image replacement for Win IE 5.0; Use text-indent image replacement for all browsers except Win IE 5.0
            oCurrentNode.style.backgroundImage = "url(" + sNavImgPath + oCurrentNode.id + ".gif)";
            oCurrentNode.style.letterSpacing = "-1000em";
            oCurrentNode.style.textIndent = "-9000px";
        }
        if (bDebugDropdowns) {
            var oDebugCoordinatesText = document.createTextNode("([" + GetAbsXPosByNode(oCurrentNode) + "], [" + GetAbsYPosByNode(oCurrentNode) + "])");
            oCurrentNode.appendChild(oDebugCoordinatesText);
        }
    }

    /*---------------
    Gotta deal with XML whitespace in DOM: Recursion
    ---------------*/
    if (getFirstChild(oCurrentNode)) {
        InitMenuDropdownListsDive(getFirstChild(oCurrentNode));
    }
    if (getNextSibling(oCurrentNode)) {
        InitMenuDropdownListsDive(getNextSibling(oCurrentNode));
    }
}

 



/*---------------
	Highlight Parent
---------------*/
function HighlightParents(oNode) {
	oParentListItem = oNode.parentNode.parentNode.parentNode;
	for (k=0; k < oParentListItem.childNodes.length; k++) {
		if (oParentListItem.childNodes[k].nodeName=="A") {
			cssClassActions('swap',oParentListItem.childNodes[k],'MenuLink','MenuLinkOver');
			if (cssClassActions('check',oParentListItem.childNodes[k],"NavImg")) {
				swapCSSBkgdImg(oParentListItem.childNodes[k],sNavImgPath+oParentListItem.childNodes[k].id+'_over.gif');	
			}
			HighlightParents(oParentListItem.childNodes[k]);
		}
	}
}

function UnHighlightParents(oNode) {
	oParentListItem = oNode.parentNode.parentNode.parentNode;
	for (k=0; k < oParentListItem.childNodes.length; k++) {
		if (oParentListItem.childNodes[k].nodeName=="A") {
			cssClassActions('swap',oParentListItem.childNodes[k],'MenuLinkOver','MenuLink');
			if (cssClassActions('check',oParentListItem.childNodes[k],"NavImg")) {
				swapCSSBkgdImg(oParentListItem.childNodes[k],sNavImgPath+oParentListItem.childNodes[k].id+'.gif');	
			}
			HighlightParents(oParentListItem.childNodes[k]);
		}
	}
}


/*---------------
	Event Functions
---------------*/
function NavImgOnMouseOver(e) {
	//alert('NavImgOnMouseOver ' + TargetObj(e));
	swapCSSBkgdImg(TargetObj(e),sNavImgPath+TargetObj(e).id+'_over.gif');
}

function NavImgOnMouseOut(e) {
	//alert('NavImgOnMouseOut ' + TargetObj(e));
	swapCSSBkgdImg(TargetObj(e),sNavImgPath+TargetObj(e).id+'.gif');
}

function MenuLinkOnMouseOver(e) {
	//alert('MenuLinkOnMouseOver ' + TargetObj(e));
	cssClassActions('swap',TargetObj(e),'MenuLink','MenuLinkOver');
	HighlightParents(TargetObj(e));
}

function MenuLinkOnMouseOut(e) {
	//alert('MenuLinkOnMouseOut ' + TargetObj(e));
	cssClassActions('swap',TargetObj(e),'MenuLinkOver','MenuLink');
	UnHighlightParents(TargetObj(e));
}

function MenuListItemOnMouseOver(e) {
	//alert('MenuListItemOnMouseOver ' + TargetObj(e).nodeName);
	
	//	Test IE Hack
	var oListItemNode = TargetObj(e);
	if (oListItemNode.attachEvent) {
		oListItemNode = TargetObj(e).parentNode;
	}
	addTextToDebug('<'+oListItemNode.nodeName+'> = ' + oListItemNode.id)
	
	for (k=0; k < oListItemNode.childNodes.length; k++) {
		if (oListItemNode.childNodes[k].nodeName=="UL") {
			if (!cssClassActions('check',oListItemNode.childNodes[k],"SelectedSubs")) {
				cssClassActions('swap',oListItemNode.childNodes[k],'MenuListOff','MenuListOver');
				oListItemNode.childNodes[k].style.top = oListItemNode.offsetTop + 'px';
				oListItemNode.childNodes[k].style.left = oListItemNode.offsetLeft + iMenuWidth + 'px';
			}
		}
	}	
}

function MenuListItemOnMouseOut(e) {
	//alert('MenuListItemOnMouseOut ' + TargetObj(e));
	
	//	Test IE Hack
	var oListItemNode = TargetObj(e);
	if (oListItemNode.attachEvent) {
		oListItemNode = TargetObj(e).parentNode;
	}
	
	for (k=0; k <oListItemNode.childNodes.length; k++) {
		if (oListItemNode.childNodes[k].nodeName=="UL") {
			if (!cssClassActions('check',oListItemNode.childNodes[k],"SelectedSubs")) {
				cssClassActions('swap',oListItemNode.childNodes[k],'MenuListOff','MenuListOver');
			}
		}
	}
}


/*---------------
	Add to window.onload event
---------------*/
addEvent(window, 'load', InitMenuDropdowns, false);

/*---------------------------------------------------------------------
	end NSS Dynamic Dropdown Menu JS
-----------------------------------------------------------------------*/
