var visibleSubMenus = new Array();
var menuTimer;

function initializeMenu() {
	
	// initialize the timer
	menuTimer = new Timer(1000, hideAllSubMenus);
	document.onclick = hideAllSubMenus;
	
	// initialize main menu's
	var menu = document.getElementsByClassName('menu')[0];
	
	$A(menu.childNodes)
	.select(
		function (n) {
			return (n.id);
		}
	)
	.each(
		function(n) {
			var pageId = n.id.substring(5);
			var childMenu = $('page_children_' + pageId);
			
			if (childMenu) {
				var f = function() { 
					displaySubMenu(n, pageId, 0); 
				};
				
				Event.observe(n, 'mouseover', f);
				// n.onmouseover = f;
				
				initializeSubMenu(childMenu);
			}
		}
	);
}

// initialize the menu
addInitializer(initializeMenu);

function initializeSubMenu(menu, level) {
	if (! level)
		level = 1;
	
	menu.onmouseout = hideSubMenusAfterTimeout;
	menu.onmouseover = stopSubMenuTimer;
	
	$A(menu.childNodes)
	.select(
		function(n) {
			return (n.id != null);
		}
	)
	
	.each(
		function (n) {
				
			var pageId = n.id.substring(5);
			var childMenu = $('page_children_' + pageId);
			
			if (childMenu) {
				n.onmouseover = function() { 
					Element.addClassName(n, 'highlight');
					displaySubMenu(n, pageId, level);
				};
				
				var arrowElement = document.createElement('div');
				arrowElement.innerHTML = '&raquo';
				Element.addClassName(arrowElement, 'arrow');
				
				n.insertBefore(arrowElement, n.firstChild);
				
				initializeSubMenu(childMenu, level + 1);
			} else {
				
				n.onmouseover = function() { 
					Element.addClassName(n, 'highlight'); 
					hideSubMenusTillLevel(level);
				};
				
			}
			
			n.onmouseout = function() { 
				Element.removeClassName(n, 'highlight'); 
			};
		}
	);
}

function displaySubMenu(parent, nr, level) {
	
	if (! level)
		level = 0;
	
	var s  = $('page_children_' + nr);
	
	if (! s) 
		return;
	
	var p = parent.cumulativeOffset();
	
	// adjust the position
	var mainPos = $$('.main').first().cumulativeOffset();
	
	p = [p[0] - mainPos[0], p[1] - mainPos[1]];
		
	// if we are dealing with a menu
	if (Element.hasClassName(parent.parentNode, 'menu')) {
		
		hideAllSubMenus();
		
		// position this element
		s.style.left = p[0] + 'px';
		s.style.top = (p[1] + parent.offsetHeight + 4) + 'px';
		s.style.width = (parent.offsetWidth) + 'px';
		
		s.style.display = 'block';
		
		// set the width of the child elements
		$A(s.childNodes)
			.select(function(n) {
				return n.id != null
			})
			.each(function(n) {
				n.style.width = (parent.offsetWidth - 40) + 'px';
			});
	} else {
		
		hideSubMenusTillLevel(level);
		
		s.style.left = (p[0] + parent.parentNode.offsetWidth) + 'px';
		s.style.top = (p[1]) + 'px';
		s.style.width = (parent.offsetWidth) + 'px';
		s.style.marginLeft = '1px';
		s.style.display = 'block';
		
		// set the width of the child elements
		$A(s.childNodes)
			.select(function(n) {
				return n.id != null
			})
			.each(function(n) {
				n.style.width = (parent.offsetWidth) + 'px';
			}
		);
	}
	
	visibleSubMenus[level] = s;
}

function hideAllSubMenus() {
	var s;
	
	while (s = visibleSubMenus.pop()) {
		s.style.display = 'none';
	}
}

function hideSubMenusTillLevel(level) {
	for (var i = visibleSubMenus.length; i > level; i--) {
		var s = visibleSubMenus.pop();
		s.style.display = 'none';
	}
}

function hideSubMenusAfterTimeout() {
	menuTimer.start();
}

function stopSubMenuTimer() {
	menuTimer.stop();
}
