//**********************************************************************************
//*****	Author:		Anthony Patton, Noesis Software.
//*****	Date:		03-08-2006
//*****	Function:	The js needed for the Noesis menu system
//*****				Copyright Noesis Software 2006. ALL RIGHTS RESERVED.
//*****				Nic this code at your peril!
//**********************************************************************************

//debugger

//turns on the debug output
var DEBUG = false;
//the array of sub menu items
var SubMenuArray = new Array();
var KeepShowingSubMenu = false;
//the main menu item array (the top level bar)
var ItemArray = new Array();
var isFireFox = isFireFox();
	
function isFireFox()
{	
	
	if(navigator.appName  == "Netscape") 
	{ 
		return true; 
	}
	else 
	{ 
		return false; 
	}
}

function isFirefox3()
{
	var nVer = navigator.appVersion;
	var nAgt = navigator.userAgent;
	var browserName  = '';
	var fullVersion  = 0; 
	var majorVersion = 0;

	// In Internet Explorer, the true version is after "MSIE" in userAgent
	if ((verOffset=nAgt.indexOf("MSIE"))!=-1) {
	 browserName  = "Microsoft Internet Explorer";
	 fullVersion  = parseFloat(nAgt.substring(verOffset+5));
	 majorVersion = parseInt(''+fullVersion);
	}

	// In Opera, the true version is after "Opera" 
	else if ((verOffset=nAgt.indexOf("Opera"))!=-1) {
	 browserName  = "Opera";
	 fullVersion  = parseFloat(nAgt.substring(verOffset+6));
	 majorVersion = parseInt(''+fullVersion);
	}

	// In Firefox, the true version is after "Firefox" 
	else if ((verOffset=nAgt.indexOf("Firefox"))!=-1) {
	 browserName  = "Firefox";
	 fullVersion  = parseFloat(nAgt.substring(verOffset+8));
	 majorVersion = parseInt(''+fullVersion);
	}

	// In most other browsers, "name/version" is at the end of userAgent 
	else if ( (nameOffset=nAgt.lastIndexOf(' ')+1) < (verOffset=nAgt.lastIndexOf('/')) ) 
	{
	 browserName  = nAgt.substring(nameOffset,verOffset);
	 fullVersion  = parseFloat(nAgt.substring(verOffset+1));
	 if (!isNaN(fullVersion)) majorVersion = parseInt(''+fullVersion);
	 else {fullVersion  = 0; majorVersion = 0;}
	}

	// Finally, if no name and/or no version detected from userAgent...
	if (browserName.toLowerCase() == browserName.toUpperCase()
	 || fullVersion==0 || majorVersion == 0 )
	{
	 browserName  = navigator.appName;
	 fullVersion  = parseFloat(nVer);
	 majorVersion = parseInt(nVer);
	}

	if(browserName.toUpperCase() == "FIREFOX")
	{
		if(fullVersion == 3)
		{
			return true;
		}
	}
	
	return false;
}

//**********************************************************************************************
//MAIN-MENU FADE SWITCH; TRUE=FADE, FALSE=NO FADE
//**********************************************************************************************
var UseFade = false;

//**********************************************************************************************
//SUB-MENU COLOURS
//**********************************************************************************************
var SubMenuItemLowColour = "#3d27d3";//"#f2e6ef";
var SubMenuItemHiColour = "#929fe7";
var MenuItemFontColour = "white";
//**********************************************************************************************

//**********************************************************************************************
//MAIN-MENU COLOURS
//**********************************************************************************************
var MenuItemLowColour = "#3d27d3";//"#f2e6ef";
var MenuItemHiColour = "#929fe7";
var MainMenuBorderColour = "black";
//**********************************************************************************************

//**********************************************************************************************
//adds the info '?' item to the menu bar
//**********************************************************************************************
function AddInfoItem()
{
	var infoItem = document.createElement("span");
	var MainMenu = document.getElementById("MenuBar");
	
	var padding = document.createElement("span");
		
	//set the pointer
	padding.style.cursor = "pointer";
	
	padding.style.border = "solid 1px";
	padding.style.borderColor = MenuItemLowColour;
	padding.id = "padding";
	//padding.style.width="80%";
	
	infoItem.style.cursor = "pointer";
	
	infoItem.style.border = "solid 1px";
	infoItem.style.borderColor = MenuItemLowColour;
	infoItem.cellpadding = "1";
	infoItem.cellspacing = "1";
	infoItem.innerHTML = "?";
	infoItem.align="right";
	infoItem.id="infoItem";
	infoItem.style.zindex="99";
	if(isFireFox)
	{
		infoItem.setAttribute("onClick", "InfoClick();", 0);
	}
	else
	{
		infoItem.attachEvent("onclick", InfoClick);
	}
	MainMenu.appendChild(padding);
	MainMenu.appendChild(infoItem);
}

function InfoClick()
{
	alert('Noesis Software 2006. All rights reserved.\rYip, this menu was coded by Noesis, If you like it drop us an email and we will tell you how to use it.');
}

var EntryCount = 0;
var MenuTable;
var menuBar;
var headerTable;
var beingCalledAlready = false;
var _cntHolder = 0;
var _menuWindowHolder;
var _colapseDropdownMenu_timer;
var _expandDropdownMenu_timer;

//**********************************************************************************************
//does the mouse over of the main menu
//**********************************************************************************************
function MouseOverMainMenu(event)
{
	var direction = 0;
	var DropdownMenu;
	var SourceElement;
	
	if(isFireFox)
	{
		SourceElement = event.target;
	}
	else
	{
		SourceElement = event.srcElement;
	}
	
	DropdownMenu = document.getElementById(SourceElement.id + "-content");
	DropdownMenu.style.display="block";
	DropdownMenu.expanding = false;
	
	//animate the menu window so it scrolls down.
	
	DropdownMenu.height = DropdownMenu.offsetHeight;
	window.clearInterval(DropdownMenu.expandTimer); //wipe out the timer
	
	DropdownMenu.expandTimer = window.setInterval(function(){ TimerIncrement(DropdownMenu, direction, DropdownMenu.expandTimer, SourceElement) }, 10);
	
}

//**********************************************************************************************
//does the mouse out of the main menu
//**********************************************************************************************
function MouseOutMainMenu(SourceElementName)
{
	var SourceElement = document.getElementById(SourceElementName);
	var direction = 1;	
	
	if(SourceElement.tagName == "DT") //menu title
	{
		DropdownMenu = document.getElementById(SourceElement.id + "-content");
	}
	if(SourceElement.tagName == "DD") //menu list
	{
		DropdownMenu = SourceElement;
		var holder = SourceElement.id.split("-");
		SourceElement = document.getElementById(holder[0]);
	}
			
	//exit clause, becuase this event is called multiple times.
	if(DropdownMenu.collapsing) 
	{	
		return;
	}
	else
	{
	}
	
	if(DropdownMenu.expandTimer) window.clearInterval(DropdownMenu.expandTimer);	
	if(DropdownMenu.colapseTimer) window.clearInterval(DropdownMenu.colapseTimer);	
	DropdownMenu.collapsing = false;
	DropdownMenu.height = 0;
	
	//animate the menu window so it scrolls up.
	DropdownMenu.colapseTimer = window.setInterval(function(){ TimerIncrement(DropdownMenu, direction, DropdownMenu.colapseTimer, SourceElement) }, 10);	
	
	
}


//**********************************************************************************************
//cancels the scroll up
//**********************************************************************************************
function CancelHide(SourceElementName)
{
	var SourceElement = document.getElementById(SourceElementName);
	var direction = 0;
	var dropdownHeader;
	var holder = SourceElement.id.split("-");
	dropdownHeader = document.getElementById(holder[0]);
	
	window.clearInterval(SourceElement.colapseTimer);
	window.clearInterval(SourceElement.expandTimer);
	SourceElement.collapsing = false;
	SourceElement.expanding = false;
	if(SourceElement.height < SourceElement.offsetHeight)
	{
		SourceElement.expandTimer = window.setInterval(function(){ TimerIncrement(SourceElement, direction, DropdownMenu.expandTimer, dropdownHeader) }, 10);
	}
	
}

//**********************************************************************************************
//recursivly calls itself to perform the menu animation.
//**********************************************************************************************
function TimerIncrement(menu, direction, timer, SourceElement)
{
	
	if(menu.height <= 0 && direction == 0) 
	{
		menu.height = 0;
		window.clearInterval(menu.expandTimer);
		menu.expanding = false;
		return;
	}
	
	if(!menu)
	{
		//if the menu is null for any reason terminate and reset
		menu.height = 0;
		if(direction == 0) window.clearInterval(menu.expandTimer);
		if(direction == 1) window.clearInterval(menu.colapseTimer);
		DropdownMenu.collapsing = false;
		return;
	}
	
	if(menu.height >= menu.offsetHeight && direction == 1) 
	{
		menu.height = menu.offsetHeight;
		window.clearInterval(menu.colapseTimer);
		menu.collapsing = false;
		return;
	}
	
	if(direction == 0)
	{
		menu.height-=3;
		menu.expanding = true;
	}
	else
	{
		menu.height+=3;	
		menu.collapsing = false;
	}
	
	menu.style.clip = "rect(" + menu.height + "px, auto, auto, auto)";
	menu.style.opacity = (menu.offsetHeight - menu.height)/menu.offsetHeight;
	menu.style.filter = 'alpha(opacity=' + menu.style.opacity * 100 + ')';
	if(isFireFox) //FireFox
	{
		if(isFirefox3) //FireFox 3
		{
			//set the menu windows position
			menu.style.top = ((SourceElement.offsetTop - menu.height) + SourceElement.offsetHeight) + "px";
			menu.style.left = (SourceElement.offsetLeft) -41  + "px";
		}
		else //FireFox or IE
		{
			//set the menu windows position
			menu.style.top = ((SourceElement.offsetTop - menu.height) + SourceElement.offsetHeight) + "px";
			menu.style.left = (SourceElement.offsetLeft) -41  + "px";
		}
	}
	else //IE
	{
		var tmp = document.getElementById("bar");
		var comp = SourceElement.parentNode;
		menu.style.top = ((tmp.offsetTop + SourceElement.offsetHeight) - menu.height)+ "px";
		menu.style.left = (comp.offsetLeft + tmp.offsetLeft) -41 + "px";
	}

	
}

function DL_GetElementLeft(eElement)
{
    var nLeftPos = eElement.offsetLeft;          // initialize var to store calculations
    var eParElement = eElement.offsetParent;     // identify first offset parent element  
    while (eParElement != null)
    {                                            // move up through element hierarchy
        nLeftPos += eParElement.offsetLeft;      // appending left offset of each parent
        eParElement = eParElement.offsetParent;  // until no more offset parents exist
    }
    return nLeftPos;                             // return the number calculated
}

function DL_GetElementTop(eElement)
{
    var nTopPos = eElement.offsetTop;            // initialize var to store calculations
    var eParElement = eElement.offsetParent;     // identify first offset parent element  
    while (eParElement != null)
    {                                            // move up through element hierarchy
        nTopPos += eParElement.offsetTop;        // appending top offset of each parent
        eParElement = eParElement.offsetParent;  // until no more offset parents exist
    }
    return nTopPos;                              // return the number calculated
}



function IEMenuClick()
{
	//this is for ie only
	if(isFireFox)
	{
		return;
	}
	
	var action = event.srcElement.getAttribute("action");
	DoMenuClick(action);
	
}


//**********************************************************************************************
//Hightlights the main menu items
//**********************************************************************************************
function SetSubMenuStyles()
{
	//get the new menu at the SourceElement's position
	var DropdownMenu = document.getElementById("MenuWindow");
	
	DropdownMenu.style.position = "absolute";
	DropdownMenu.style.visibility = "visible";
	DropdownMenu.style.display = "";
	DropdownMenu.style.border = "solid 1px " + MainMenuBorderColour;
	DropdownMenu.style.color = MenuItemFontColour;
	
}





//**********************************************************************************************
//clears out the menuwindow div, in prep for loading with different item entries
//**********************************************************************************************
function ClearAllSubMenuItems()
{
	var DropdownMenu = document.getElementById("MenuWindow");
	var i=0;
	
	while(document.getElementById("submenuItem"+i) != null)
	{
		DropdownMenu.removeChild(document.getElementById("submenuItem"+i))
		i++
	}	
	if(document.getElementById("childMenuPadding") != null) DropdownMenu.removeChild(document.getElementById("childMenuPadding"));
	
}

//**********************************************************************************************
//creates my html debug output window
//**********************************************************************************************
function DebugWindow(DebugInfo)
{
	var DebugWindow = document.getElementById("DebugWindow");
	if(DebugWindow == null)
	{
		DebugWindow = document.createElement("textarea");
	}
	
	DebugWindow.setAttribute("ID", "DebugWindow", 0);
	DebugWindow.setAttribute("Align", "center", 0);
	DebugWindow.style.border = "solid 1px limegreen";
	DebugWindow.style.font = "8pt Lucida Console";
	DebugWindow.style.padding = "3px";
	DebugWindow.style.backgroundColor = "navy";
	DebugWindow.style.width = "95%";
	DebugWindow.style.color = "limegreen";
	DebugWindow.style.height = "680px";
	DebugWindow.value += DebugInfo + "\n";
	document.body.appendChild(DebugWindow);
}

//**********************************************************************************************
//fires when the mouse is over the sub menu window div
//**********************************************************************************************
function SubMenuMouseOver(event)
{
	//stop the menu from hiding.
	direction = 0;
	window.clearTimeout(_dropdownTimer);
	
	var srcElement;
	if(isFireFox)
	{
		srcElement = event.target;
	}
	else
	{
		srcElement = event.srcElement;
	}
	
	//DebugWindow("mousein:" + srcElement.id);
	if(srcElement != null)
	{
		if(srcElement.id == "MenuBar" || srcElement.id == "padding")
		{
			//do nothing with the top menu bar
			return;
		}
	}
	
	var MenuWindow = document.getElementById("MenuWindow");
	var MenuBar = document.getElementById("MenuBar");
	//get the parent menu id I we can keep it highlighted
	var SourceElement = document.getElementById(MenuWindow.getAttribute("ParentMenu"));
	
	//set the main menu item as highlighted
	MenuWindow.style.visibility = "visible"
	
	if(srcElement != null)
	{
		//highlight only the sub menu items, not their parent menu window
		if(srcElement.id != "MenuWindow")
		{
			srcElement.style.backgroundColor = SubMenuItemHiColour;
		}
	}
	
	SourceElement.style.backgroundColor = MenuItemHiColour;
	SourceElement.style.border = "solid 1px " + MainMenuBorderColour;
}

//**********************************************************************************************
//fires when the mouse is out the sub menu window div
//**********************************************************************************************
function SubMenuMouseOut(event)
{
	var srcElement;
	if(isFireFox)
	{
		srcElement = event.target;
	}
	else
	{
		srcElement = event.srcElement;
	}

	//DebugWindow("mouseout target:" + event.toElement.outerHTML);

	if(srcElement != null)
	{
		ResetMainMenuStyles();
		srcElement.style.backgroundColor = SubMenuItemLowColour;
		
		var DropdownMenu = document.getElementById("MenuWindow");
		DropdownMenu.style.visibility = "hidden";
	}
	
}


//**********************************************************************************************
//resets the main menu items styles to neutral
//**********************************************************************************************
function ResetMainMenuStyles()
{
	//get each main menu item in a list
	var MainMenuItemCount;
	for(MainMenuItemCount = 0; MainMenuItemCount < ItemArray.length; MainMenuItemCount++)
	{
		var MenuItem = document.getElementById(MainMenuItemCount);
		if(MenuItem )
		{
			//set the style for each main menu item
			MenuItem.style.backgroundColor = MenuItemLowColour;
			MenuItem.style.borderColor = MenuItemLowColour;
		}
	} 
}

//**********************************************************************************************
//performs the action required for a menu click, runs the supplied code.
//**********************************************************************************************
function DoMenuClick(code)
{
	eval(code);
}

//**********************************************************************************************
//Follows the supplied link href
//**********************************************************************************************
function FollowHref(hRef)
{
	//DebugWindow(hRef);
	window.location.href = hRef;
}

//**********************************************************************************************
//debug function to display all an objects attributes
//**********************************************************************************************
function Debug_ListObjectsAttributes(HTMLObject)
{
	var allAttr = HTMLObject.attributes;
	var i =0;
	
	DebugWindow("-----------------------------------------------------");
	
	for(i = 0;i < allAttr.length; i++)
	{
		DebugWindow(allAttr[i].name + " = " + allAttr[i].value);
	}
	

}
