/*
Copyright XVII 2003 - 2005
www.xvii.co.uk

MenuSystem: Manager
	This file is responsible for:
		- Loading Items & Placing Them Correctly
		- Maintaining Hierarchy
		- Calling Navigation Items
*/

var gToRoot = "";
var NI_Instance = new Array();
NI_Instance[0] = new NavigationItem();

function MenuManager(ItemId, EventType, CategoryId)
	{
	var MenuTree = GetTree(0, MenuArrayInstance.Navigation, 1, 1);
	RecalculatePositions(MenuTree, 0, CategoryId);
	UpdatePosX();
	
	if(EventType == 0)
		{
		//--MOUSEOVER--//
		
		//Tell brothers and sisters not to die.
		var Siblings = GetSiblings(ItemId, CategoryId, MenuArrayInstance.Navigation);
		var GotChildren = new Array();
		for(var x = 0; x < Siblings.length; x++)
			{
			var UniqueID = Siblings[x];
			clearTimeout(NI_Instance[UniqueID].Suicide);
			NI_Instance[UniqueID].SlideIn();
			if(NI_Instance[UniqueID].SpawnedChildren == 1 && UniqueID != ItemId)
				GotChildren.push(UniqueID);
			}
			
		
				
		//--END INTERCOUNTY CODE--//
			
		//Set over flag on self
		NI_Instance[ItemId].Over = 1;
		
		//Get children
		var ImmediateChildren = GetTree(ItemId, MenuArrayInstance.Navigation, 1, 1, CategoryId);
		
		//Set SpawnedChildren flag on self
		if(ImmediateChildren.length > 0) NI_Instance[ItemId].SpawnedChildren = 1;
		
		//Hide siblings children
		for(var x = 0; x < GotChildren.length; x++)
			{
			var UniqueID = GotChildren[x];
			var Nieces = GetTree(UniqueID, MenuArrayInstance.Navigation, 255, 1, CategoryId);
			HideTree(Nieces);
			}
		
		//Spawn Children
		if(NI_Instance[ItemId].SlideStatus != 2)
			{
	 		for(var x = 0; x < ImmediateChildren.length; x++)
	 			{
	 			var UniqueID = ImmediateChildren[x][0];
	 			NI_Instance[UniqueID].SlideIn();
	 			}
			}
 		}
	else if(EventType == 1)
		{
		//--MOUSEOUT--//
		
		
		
		//Tell brothers and sisters to die
		if(NI_Instance[ItemId].SpawnedChildren != 1)
			{
			var Siblings = GetSiblings(ItemId, CategoryId, MenuArrayInstance.Navigation);
			for(var x = 0; x < Siblings.length; x++)
				{
				var UniqueID = Siblings[x];
				NI_Instance[UniqueID].Die();
				}
			}
		
		//Set over flag on self to 0
		NI_Instance[ItemId].Over = 0;
		}
	}

function TryThis(CategoryId)
	{
	//--INTERCOUNTY CODE--//
	var DistantFamily = GetDistantFamily(1, CategoryId, MenuArrayInstance.Navigation);
	for(var x = 0; x < DistantFamily.length; x++)
		{
		var UniqueID = DistantFamily[x];
		//NI_Instance[UniqueID].DieNow();
		}
	}
	
function DeathCall(ItemId)
	{
	
	//Find out who parent is...
	for(var x = 0; x < MenuArrayInstance.Navigation.length; x++)
		{
		if(MenuArrayInstance.Navigation[x][0] == ItemId)
			{
			var Parent = MenuArrayInstance.Navigation[x][2];
			var CategoryId = MenuArrayInstance.Navigation[x][1];
			x = MenuArrayInstance.Navigation.length;
			}
		}
	
	//Find out parent's siblings
	var Siblings = GetSiblings(Parent, CategoryId, MenuArrayInstance.Navigation);
	var FoundOver = false;
	for(var x = 0; x < Siblings.length; x++)
		{
		var UniqueID = Siblings[x];
		if(NI_Instance[UniqueID].Over == 1)
			FoundOver = true;
		}
		
	if(FoundOver == false)
		{
		for(var x = 0; x < Siblings.length; x++)
			{
			var UniqueID = Siblings[x];
			NI_Instance[UniqueID].Die();
			}
		}
	}	

function NavigationItemManager(UniqueID, EventType)
	{
	alert(UniqueID);
	}
	
	
function InitialiseNavigation(SetToRoot)
	{
	//--Update Image Locations--//
	if(SetToRoot.length > 0)
		UpdatePaths(SetToRoot);
	
	//--Retrieve Menu In Hierarchal Form
	var MenuTreeTwo = GetTree(0, MenuArrayInstance.Navigation, 5, 1, 2);
	var MenuTreeThree = GetTree(0, MenuArrayInstance.Navigation, 5, 1, 3);
	var MenuTreeFour = GetTree(0, MenuArrayInstance.Navigation, 5, 1, 4);
	
	//var MenuTreeTwo = GetTree(0, MenuArrayInstance.Navigation, 5, 1, 2);
	
	//--Calculate Positions of Block-Level Containers--//
	CalculatePositions(MenuTreeTwo, 0, 240);
	CalculatePositions(MenuTreeThree, 0, 300);
	CalculatePositions(MenuTreeFour, 0, 330);
	
	//--Recalculate To Account For Centred Page--//
	RecalculatePositions(MenuTreeTwo, 0, 2);
	RecalculatePositions(MenuTreeThree, 0, 3);
	RecalculatePositions(MenuTreeFour, 0, 4);
	
	//--Output Navigation to HTML--//
	DrawNavigation();
	
	//--Create Navigation Item Object Instances--//
	CreateNavigationItems(MenuTreeTwo);
	CreateNavigationItems(MenuTreeThree);
	CreateNavigationItems(MenuTreeFour);
		
	//CreateNavigationItems(MenuTreeTwo);	
	
	}
	
function HideFlash()
	{
	var FlashContainer = document.getElementById("flash01");
	FlashContainer.style.display = "none";
	
	var Image = document.getElementById("image01");
	Image.style.display = "inline";
	}
	
function UpdatePaths(ToRoot)
	{
	for(var x = 0; x < MenuArrayInstance.Navigation.length; x++)
		{
		//Update Image Paths
		var CurrentString = MenuArrayInstance.Navigation[x][3];
		var EndofElement = CurrentString.substring(10, CurrentString.length);
		var NewStart = "<img src=\"" + ToRoot;
		var NewString = NewStart.concat(EndofElement);
		MenuArrayInstance.Navigation[x][3] = NewString;
		
		//Update link paths
		var CurrentString = MenuArrayInstance.Navigation[x][9];
		var NewString = ToRoot.concat(CurrentString);
		MenuArrayInstance.Navigation[x][9] = NewString;
		
		//Store in global
		gToRoot = ToRoot;
		}
	}
	
function CreateNavigationItems(myBranch)
	{
	for(var y = 0; y < myBranch.length; y++)
		{
		var UniqueID = myBranch[y][0];
		
		//--Create Instance--//
		NI_Instance[UniqueID] = new NavigationItem(UniqueID);
		
		if(typeof myBranch[y][5] == "object")
			CreateNavigationItems(myBranch[y][5]);
		}
	}	

function CalculatePositions(myBranch, StartX, StartY)
	{
	var cX = StartX;
	var cY = StartY;
	
	for(var y = 0; y < myBranch.length; y++)
		{
		var OriginalIndex = myBranch[y][4];
		MenuArrayInstance.Navigation[OriginalIndex][6] = cX;
		MenuArrayInstance.Navigation[OriginalIndex][7] = cY;
		
		cY = parseInt(cY) + parseInt(MenuArrayInstance.Navigation[OriginalIndex][8]);
		
		if(typeof myBranch[y][5] == "object")
			{
			//Increase X	
			CalculatePositions(myBranch[y][5], cX + 120, cY);
			cY = parseInt(cY) + 15;
			}
		}
	}
	
function RecalculatePositions(myBranch, StartX, CategoryId)
	{
	var ParentCategoryId = "mNav" + (CategoryId - 1);
	
	//Get X position of PCId
	if(StartX == 0)
		{
		var CategoryElement = document.getElementById(ParentCategoryId);
		StartX = findPosX(CategoryElement) + 150;
		}
		
	for(var y = 0; y < myBranch.length; y++)
		{
		var OriginalIndex = myBranch[y][4];
		MenuArrayInstance.Navigation[OriginalIndex][6] = StartX;
		
		if(typeof myBranch[y][5] == "object")
			{
			//Increase X
			RecalculatePositions(myBranch[y][5], StartX + 120, CategoryId);
			}
		}
	
	}
	
function UpdatePosX()
	{
	for(var x = 0; x < MenuArrayInstance.Navigation.length; x++)
		{
		var ElementEntity = document.getElementById(MenuArrayInstance.Navigation[x][0]);
		ElementEntity.style.left = MenuArrayInstance.Navigation[x][6] + "px";
		}
	}
	
function findPosX(myObject)
	{
	var cLeft = 0;
	if(myObject.offsetParent)
		{
		while(myObject.offsetParent)
			{
			cLeft += myObject.offsetLeft;
			myObject = myObject.offsetParent;
			}
		}
	return(cLeft);
	}


function GetDistantFamily(ItemId, CategoryId, Menu)
	{
	//Who's my parent?
	var Siblings = new Array();
	for(var x = 0; x < Menu.length; x++)
		{
		if(Menu[x][0] == ItemId)
			{
			var Parent = Menu[x][2];
			x = Menu.length;
			}
		}
	
	for(var x = 0; x < Menu.length; x++)
		{
		if(Menu[x][2] == Parent && Menu[x][1] != CategoryId)
			Siblings.push(Menu[x][0]);
		}
	
	return(Siblings);
	}
	
//todo:: This is "by category id"
function GetSiblings(ItemId, CategoryId, Menu)
	{
	//Who's my parent?
	var Siblings = new Array();
	for(var x = 0; x < Menu.length; x++)
		{
		if(Menu[x][0] == ItemId)
			{
			var Parent = Menu[x][2];
			x = Menu.length;
			}
		}
	
	for(var x = 0; x < Menu.length; x++)
		{
		if(Menu[x][2] == Parent && Menu[x][1] == CategoryId)
			Siblings.push(Menu[x][0]);
		}
	
	return(Siblings);
	}
	
function GetElders(ItemId, CategoryId, Menu)
	{
	var Elders = new Array();
	//Who's my parent?
	for(var x = 0; x < Menu.length; x++)
		if(Menu[x][0] == ItemId){
			var Parent = Menu[x][2];
			x = Menu.length;}
			
	//Who's my granddaddy?
	for(var x = 0; x < Menu.length; x++)
		if(Menu[x][0] == Parent){
			var Granddad = Menu[x][2];
			x = Menu.length;}
		
	//Who are the elders?
	for(var x = 0; x < Menu.length; x++)
		if(Menu[x][2] == Granddad && Menu[x][1] == CategoryId)
			Elders.push(Menu[x][0]);
		
	return(Elders);
	}
	
function GetTree(RootID, Menu, DepthLimit, _DEPTH, CategoryId)
	{
	var Tree = new Array();
	for(var x = 0; x < Menu.length; x++)
		{
		if(Menu[x][2] == RootID)
			{
			if(typeof CategoryId == "number")
				{
				if(Menu[x][1] == CategoryId)
					{
					if(typeof Menu[x][4] != "number")
					Menu[x][4] = x;
					
					Tree.push(Menu[x]);
					}
				}
			else
				{
				if(typeof Menu[x][4] != "number")
					Menu[x][4] = x;
					
				Tree.push(Menu[x]);
				}
			}
		}
	
	if(_DEPTH < DepthLimit)
		for(var tCount = 0; tCount < Tree.length; tCount++)
			{
			var TempTree = new Array();
			TempTree = GetTree(Tree[tCount][0], Menu, DepthLimit, _DEPTH + 1);
			Tree[tCount].push(TempTree);
			}
		
	return(Tree);
	}
	
function HideTree(myBranch)
	{
	for(var y = 0; y < myBranch.length; y++)
		{
		var ChildID = myBranch[y][0];
		NI_Instance[ChildID].SuddenDeath();
		
		if(typeof myBranch[y][5] == "object")
			{
			HideTree(myBranch[y][5]);
			}
		}
	}
	
function DrawTree(myBranch)
	{
	for(var y = 0; y < myBranch.length; y++)
		{
		document.write("<li>");
		document.write(myBranch[y][3]);
		document.write("</li>");
		if(typeof myBranch[y][5] == "object")
			{
			document.write("<ul>");
			DrawTree(myBranch[y][5]);
			document.write("</ul>");
			}
		}
	}

function LightMe(itemId)
	{
	var ImageId = "im_" + itemId;
	var ElementEntity = document.getElementById(ImageId);
	var CurrentSource = ElementEntity.src;
	var myIndex = CurrentSource.indexOf("Slide");
	var PathStart = CurrentSource.substring(0, myIndex);
	var StringEnd = CurrentSource.substring(myIndex, CurrentSource.length - 4);
	var NewEnd = "_Lit.png";
	var NewPath = PathStart.concat(StringEnd, NewEnd);
	ElementEntity.src = NewPath;
	}
	
function LightOut(itemId)
	{
	var ImageId = "im_" + itemId;
	var ElementEntity = document.getElementById(ImageId);
	var CurrentSource = ElementEntity.src;
	var myIndex = CurrentSource.indexOf("Slide");
	var PathStart = CurrentSource.substring(0, myIndex);
	var StringEnd = CurrentSource.substring(myIndex, CurrentSource.length - 8);
	var NewEnd = ".png";
	var NewPath = PathStart.concat(StringEnd, NewEnd);
	ElementEntity.src = NewPath;
	}
	
function DrawNavigation()
	{
	for(var x = 0; x < MenuArrayInstance.Navigation.length; x++)
		{
		//--Create Style String--//
		var StyleString = "style=\"";
		StyleString = StyleString + "position: absolute; ";
		StyleString = StyleString + "left: " + MenuArrayInstance.Navigation[x][6] + "px; ";
		StyleString = StyleString + "top: " + MenuArrayInstance.Navigation[x][7] + "px; ";
		StyleString = StyleString + "cursor: hand; cursor: pointer;";
		StyleString = StyleString + "\"";
		
		//MouseOverString = "onmouseover=\"NavigationItemManager(" + x + "," + 0 + ");\" ";
		
		MouseOverString = "onmouseover=\"";
		MouseOverString = MouseOverString + "LightMe(" + MenuArrayInstance.Navigation[x][0] + ");";
		MouseOverString = MouseOverString + "MenuManager(" + MenuArrayInstance.Navigation[x][0] + ", 0, " + MenuArrayInstance.Navigation[x][1] + ");\" ";
		
		MouseOutString = "onmouseout=\"";
		MouseOutString = MouseOutString + "LightOut(" + MenuArrayInstance.Navigation[x][0] + ");";
		MouseOutString = MouseOutString + "MenuManager(" + MenuArrayInstance.Navigation[x][0] + ", 1, " + MenuArrayInstance.Navigation[x][1] + ");\" ";
		
		MouseClickString = "onclick=\"";
		MouseClickString = MouseClickString + "window.location=\'" + MenuArrayInstance.Navigation[x][9] + "\'\"";
		
		
		//--Create Navigation DIV Tag String--//
		var TagString = "<div id=\"" + MenuArrayInstance.Navigation[x][0] + "\" ";
		TagString = TagString + "class=\"" + SettingsInstance.NavigationItemClass + "\" ";
		TagString = TagString + MouseOverString;
		TagString = TagString + MouseOutString;
		TagString = TagString + MouseClickString;
		TagString = TagString + StyleString;
		TagString = TagString + ">" + MenuArrayInstance.Navigation[x][3] + "</div>";
		
		//--Create Link String--//
		var Hyperlink = "<a href=\"";
		Hyperlink = Hyperlink + MenuArrayInstance.Navigation[x][9] + "\">";
		
		//--Output to HTML--//
		document.write(Hyperlink);
		document.write(TagString);
		document.write("</a>");
		}
	}
	
/*function DrawDiv(myBranch)
	{
	for(var y = 0; y < myBranch.length; y++)
		{
		var Id = "Sam_" + myBranch[y][0]
		document.write("<div id=\"" + Id + "\" >&nbsp;</div>");
		if(typeof myBranch[y][5] == "object")
			{
			DrawDiv(myBranch[y][5]);
			}
		}
	}*/
		
//function DrawNavigationMembers(ChildClassName, LeftPosition)
//	{
	//TODO: Left position is too static to my requirements of this system.
	
//	var NavigationTree = GetTree(0, MenuArrayInstance.Navigation);
//	DrawDiv(NavigationTree);
	//alert(document.getElementById("Sam_1").id);
//	}

