			
			// Notes: Only one menu for each level can be open at a time 
		
			// GLOBALS
			
			//alert('Loading Side Nave Menu');


			// MenuStatus (-1 = completely closed, 0 = level 0 open (default), 1 = level 1 open, 2 = level 2 open)
			MenuStatuses = new Array();
			MenuItems = new Array();
			MenuBreadcrumbs = new Array();
			MenuDivs = new Array();
			MenuItemWidths = new Array();
			MenuItemHeights = new Array();
			MenuStrings = new Array(); // Needs to be set before initialize!

			function initialize()
			{	
				for(TempAlias in MenuStrings)
				{
					if(MenuStrings[TempAlias]!='')
					{ 
						//alert("Initalizing the "+TempAlias+" menu with '"+MenuStrings[TempAlias]+"'");
						initializeMenu(TempAlias, MenuStrings[TempAlias]);
						setMenuItemDimensions(TempAlias, 177,25,202,20,202,20);
					}
				}

			}// initialize

			function setMenuItemDimensions(AliasIN, Level0WidthIN, Level0HeightIN, Level1WidthIN, Level1HeightIN, Level2WidthIN, Level2HeightIN)
			{
				MenuItemWidths[AliasIN] = new Array();
				MenuItemHeights[AliasIN] = new Array();

				MenuItemWidths[AliasIN][0] = Level0WidthIN;
				MenuItemHeights[AliasIN][0] = Level0HeightIN;
				MenuItemWidths[AliasIN][1] = Level1WidthIN;
				MenuItemHeights[AliasIN][1] = Level1HeightIN;
				MenuItemWidths[AliasIN][2] = Level2WidthIN;
				MenuItemHeights[AliasIN][2] = Level2WidthIN;
			}// setMenuItemDimensions

			function initializeMenu(AliasIN, MenuItemsStringIN)
			{
				//MenuIndex = getMenuIndexWithAlias(AliasIN);
				MenuStatuses[AliasIN] = 0; // the one attached the page is defaulted to open
				
				LevelCount = setMenuItems(AliasIN,MenuItemsStringIN);

				//alert('There are '+LevelCount+' levels');
				MenuDivs[AliasIN] = new Array();
				MenuBreadcrumbs[AliasIN] = new Array();
				for(var li=0; li<=LevelCount; li++)
				{
					MenuBreadcrumbs[AliasIN][li] = -1;
					if(!document.getElementById(AliasIN+'_menu_'+li)) 
					{
						//alert('Making '+AliasIN+'_menu_'+li);
						MenuDivs[AliasIN][li] = document.createElement('div');
						MenuDivs[AliasIN][li].id = AliasIN+'_menu_'+li;
					}
					else MenuDivs[AliasIN][li] = document.getElementById(AliasIN+'_menu_'+li);
				}
			}


			function displayMenu(AliasIN, LevelIN, ItemIndexIN, MenuItemsIN)
			{
				// Hide any level higher than this one?
				
				if (MenuStatuses[AliasIN]<LevelIN)
				{
					MenuStatuses[AliasIN] = LevelIN;
				}

				//alert(AliasIN+'_menu_'+LevelIN);
				
				var TempMenuDiv = MenuDivs[AliasIN][LevelIN];
				var TempParentDiv = MenuDivs[AliasIN][LevelIN-1];
				
				var MenuContent = "<ul>\n";

				for(ii in MenuItemsIN)
				{
					var iInt = (parseInt(ii)+0);
					MenuContent += "<li class=\""+AliasIN+"-menu-"+LevelIN+"-passive-li\""
						+" onmouseover =\"mouseOverMenu('sidenav',"+LevelIN+",'"+iInt+"');\""
						+" onclick=\"clickMenu('sidenav',"+LevelIN+",'"+iInt+"');\">&nbsp;"+MenuItemsIN[iInt][0]
						+"</li>\n";
						//+" onmouseout=\"mouseOutMenu('sidenav',"+LevelIN+");\"" 
				}

				
				TempMenuDiv.innerHTML=MenuContent;
				
				TempMenuDiv.style.position="absolute";
				TempMenuDiv.style.display="block";
				TempMenuDiv.style.visibility="visible";
			
				
				if(TempParentDiv.style.left) TempParentX = parseInt(removeSuffix(TempParentDiv.style.left, 'px'));
				else
				{
					TempParentX = getImageX(AliasIN+'_menu_'+(LevelIN-1)+'_img_top_left');	
				}
				
				if(TempParentDiv.style.top) TempParentY = parseInt(removeSuffix(TempParentDiv.style.top, 'px'));
				else
				{
					TempParentY = getImageY(AliasIN+'_menu_'+(LevelIN-1)+'_img_top_left')+1;	
				}

				//alert('TempParentX:'+TempParentX);
				//alert('TempParentY:'+TempParentY);

				TempMenuDiv.style.left=''+(TempParentX+MenuItemWidths[AliasIN][LevelIN-1])+'px';
				TempMenuDiv.style.top=''+(TempParentY+MenuItemHeights[AliasIN][LevelIN-1]*ItemIndexIN)+'px';
				//TempMenuDiv.style.width="400px";
				//TempMenuDiv.style.height="100px";
				//TempMenuDiv.style.background="red";


			}// displayMenu

			function hideMenu(AliasIN, LevelIN)
			{
				hideElement(AliasIN+'_menu_'+LevelIN);
			}// hideMenu


			function mouseOverMenu(AliasIN, LevelIN, ItemIndexIN)
			{
				LevelIN = 0+parseInt(LevelIN);
				ItemIndexIN = 0+parseInt(ItemIndexIN);
				
				if(!ItemIndexIN) ItemIndexIN = 0;

				MenuStatuses[AliasIN] = LevelIN;

				for(var li=LevelIN+1; li<3; li++)
				{
					if(typeof(MenuBreadcrumbs[AliasIN])!='undefined') MenuBreadcrumbs[AliasIN][li] = -1; 
					hideMenu(AliasIN, li);
				}	
		
				// Deal with the current
				
				// Go back one level to retrieve the "current menu" (the one that was moused over)	
				CurrentLIs = document.getElementById(AliasIN+'_menu_'+LevelIN).getElementsByTagName('li');
				if((typeof(MenuBreadcrumbs[AliasIN])!='undefined') && (MenuBreadcrumbs[AliasIN][LevelIN]>-1))
				{
					CurrentLIs[MenuBreadcrumbs[AliasIN][LevelIN]].className = AliasIN+'-menu-'+LevelIN+'-passive-li';
					//alert('Previous Contents are '+CurrentLIs[MenuBreadcrumbs[AliasIN][LevelIN]]+' has class '+AliasIN+'-menu-'+LevelIN+'-passive-li');
				}
				//else alert('MenuBreadcrumb: '+MenuBreadcrumbs[AliasIN][LevelIN]);
				
				CurrentLIs[ItemIndexIN].className = AliasIN+'-menu-'+LevelIN+'-active-li';

				MenuBreadcrumbs[AliasIN][LevelIN] = -1;
					
				var CurrentMenuItems = getMenuItemsUsingBreadcrumb(AliasIN);
				//alert('There are '+CurrentMenuItems.length+' current menu items.');
				var ItemContentType = (typeof CurrentMenuItems[ItemIndexIN][2]).toLowerCase();
	

				MenuBreadcrumbs[AliasIN][LevelIN] = ItemIndexIN;
				//alert('Breadcrumb changed to '+getMenuBreadcrumbString(AliasIN));
				var OpeningMenuItems = getMenuItemsUsingBreadcrumb(AliasIN);
				
				
				// First recognize if this item has a submenu
				if(ItemContentType=='object')
				{
					displayMenu(AliasIN, LevelIN+1, ItemIndexIN, OpeningMenuItems);
				}
				//else alert('This one is a '+ItemContentType+' '+CurrentMenuItems[ItemIndexIN][1]);

			}// mouseOverMenu
			

			function clickMenu(AliasIN, LevelIN, ItemIndexIN)
			{
				TempIndex = MenuBreadcrumbs[AliasIN][LevelIN];	
				MenuBreadcrumbs[AliasIN][LevelIN] = -1; 
				var CurrentMenuItems = getMenuItemsUsingBreadcrumb(AliasIN);
				MenuBreadcrumbs[AliasIN][LevelIN] = TempIndex;
				//alert("Clicked on '"+trim(CurrentMenuItems[ItemIndexIN][0])+"' which results in "+CurrentMenuItems[ItemIndexIN][1]);
				window.location=CurrentMenuItems[ItemIndexIN][1];
	
			}// clickMenu

			function getMenuItemsUsingBreadcrumb(AliasIN)
			{
				var TempMenuItems = MenuItems[AliasIN];
				// Just use the breadcrumb
				for(var li=0; li<MenuBreadcrumbs[AliasIN].length; li++)
				{
					//alert('MenuBreadcrumbs '+li+' is '+MenuBreadcrumbs[AliasIN][li])
					if(MenuBreadcrumbs[AliasIN][li] == -1)
					{
						return TempMenuItems;
					}
					else TempMenuItems = TempMenuItems[MenuBreadcrumbs[AliasIN][li]][2];
				}
				return TempMenuItems;
			}// getMenuItemsUsingBreadcrumb	


			function getMenuBreadcrumbString(AliasIN)
			{
				StringOUT = '';
				for(var li=0; li<MenuBreadcrumbs[AliasIN].length; li++)
				{
					StringOUT += li+'->'+MenuBreadcrumbs[AliasIN][li]+' ';
				}
				return StringOUT;
			}// getMenuBreadcrumb


			function mouseOutMenu(AliasIN, LevelIN)
			{
				MenuStatuses[AliasIN] =	0;


				setTimeout("closeMenuUsingStatus('"+AliasIN+"')",200);
			}// mouseOutMenu

			function closeMenuUsingStatus(AliasIN)
			{
				LevelCount = getLevelCount(AliasIN);	
				for(var li=(LevelCount-1); li>MenuStatuses[AliasIN]; li--)
				{
					//alert("Attempting to close "+AliasIN+" level "+li+" menu");
					hideMenu(AliasIN,li);
				}
				
				// If status is at level 0, set the class on the particular one to non-hover (passive)
				if(MenuStatuses[AliasIN]<1)
				{
					CurrentLIs = document.getElementById(AliasIN+'_menu_0').getElementsByTagName('li');
					CurrentLIs[MenuBreadcrumbs[AliasIN][0]].className = AliasIN+'-menu-0-passive-li';
				}
			}// closeMenuUsingStatus

			function setMenuItems(AliasIN, ItemsIN)
			{
				// Go through the ItemsIN and set the MenuItems global appropriately

				//ItemsIN = ;
			
				LevelCount = getLevelCount(AliasIN);

				MenuBreadcrumbs[AliasIN] = new Array();
				for(var li=0; li<LevelCount; li++)
				{
					//alert('HI! MenuBreadcrumbs '+li+' is initialized');
					MenuBreadcrumbs[AliasIN][li] = -1; // unselected
				} 
				MenuItems[AliasIN] = getMenuItemsArrayFromString(ItemsIN,0);
				return LevelCount; 
				//alert('type of MenuItems['+AliasIN+'] = '+(typeof MenuItems[AliasIN]));
				
			}// setMenuItems


			function getLevelCount(AliasIN)
			{
				return 3;
			}// getLevelCount


			function getMenuItemsArrayFromString(ItemsStringIN,LevelIN)
			{

				var MenuItemsOUT = new Array();

				//alert("Entered getMenuItemsArrayFromString with:\n"+ItemsStringIN);
				ItemDelimiter = '##';

				ItemsStringLength = ItemsStringIN.length;
				ItemDelimiterLength = ItemDelimiter.length;
				// If the last characters are the delimiter then remove it
				if(ItemsStringIN.lastIndexOf(ItemDelimiter)>=(ItemsStringLength-ItemDelimiterLength))
				{
					ItemsStringIN = ItemsStringIN.substring(0,ItemsStringLength-ItemDelimiterLength);
					//alert("Ends in delimiter!\n It is now: "+ItemsStringIN);
				}
				var Items = ItemsStringIN.split(ItemDelimiter);

				var ItemCount = 0;
				var SubmenuString = '';
				var TempLevel = 0;
				var TempItemParts = new Array();

				for(ii in Items)
				{
					var TempItemString = Items[ii];
					//alert(ii+' is '+TempItemString+' ('+ItemCount+')');
					if(typeof TempItemString != 'undefined')
					{
						TempItemParts = TempItemString.split('||');
						if (TempItemParts[0].toLowerCase()=="}menu")
						{
							TempLevel--;

							// Only add as an actual item if at templevel 0
							if(TempLevel==0)
							{
								//BuildingSubmenuString
								MenuItemsOUT[ItemCount] = new Array();
								MenuItemsOUT[ItemCount][0] = SubmenuLabel;
								MenuItemsOUT[ItemCount][1] = SubmenuLink;
								MenuItemsOUT[ItemCount][2] = getMenuItemsArrayFromString(SubmenuString,LevelIN+1);
								//alert(LevelIN+':'+ItemCount+' is '+SubmenuString);
								//alert('an object of size '+MenuItemsOUT[ItemCount][1].length);
								SubmenuString = '';
								ItemCount++;
							}
							else SubmenuString += TempItemString+ItemDelimiter; // Do not need to append delimiter here


						}
						else if(TempItemParts[2].toLowerCase()=="menu{")
						{
							if(TempLevel==0)
							{
								SubmenuLabel = TempItemParts[0];
								SubmenuLink = TempItemParts[1];
								SubmenuString = '';
							}
							else SubmenuString += TempItemString+ItemDelimiter;
							
							TempLevel++;
						}
						else
						{
							// Regular items
							// Only add if at templevel 0
							if(TempLevel==0)
							{
								MenuItemsOUT[ItemCount] = new Array();
								MenuItemsOUT[ItemCount][0] = TempItemParts[0];
								MenuItemsOUT[ItemCount][1] = TempItemParts[1];
								//alert(LevelIN+':'+ItemCount+' is '+TempItemString);
								ItemCount++;
							}
							else SubmenuString += TempItemString+ItemDelimiter;

						}
					}// if valid TempItem
				}
				if(TempLevel!=0)alert('WARNING: Menu items string does not end on level 0. (Missing "}menu" item?)');

				//alert(ItemsStringIN+" returns an array of size "+MenuItemsOUT.length);

				return MenuItemsOUT;

			}// getMenuItemsArrayFromString


