 // global menu state
 var menuReady = false;

 // carry over some critical menu style sheet attribute values
 var CSSRuleValues = {	menuItemHeight:"18px",
			menuItemLineHeight:"1.4em",
			menuWrapperBorderWidth:"2px",
			menuWrapperPadding:"3px",
			defaultBodyFontSize:"12px"
 };

 function mm_getElementStyle(elem, IEStyleProp, CSSStyleProp) {
	if (elem.currentStyle) {
        	return elem.currentStyle[IEStyleProp];
	} else if (window.getComputedStyle) {
        	var compStyle = window.getComputedStyle(elem, "");
		return compStyle.getPropertyValue(CSSStyleProp);
	}
	return "";
 }

 // create hash table-like lookup for menu objects with id string indexes
 function mm_makeHashes() {
	for (var i = 0; i < mm_items.length; i++) {
        	mm_items[mm_items[i].elemId] = mm_items[i];
	        mm_items[mm_items[i].mBarImgId] = mm_items[i];
	}
 }

 // assign menu label image event handlers
 function mm_assignLabelEvents() {
	var elem;
	for (var i = 0; i < mm_items.length; i++) {
		elem = document.getElementById(mm_items[i].mBarImgId);
		elem.onmouseover = mm_swap;
		elem.onmouseout = mm_swap;
	}
 }

 // invoked from init(), generates the menu div elements and their contents.
 // all this action is invisible to user during construction
 function mm_makeMenus() {
	var menuDiv, menuItem, itemLink, mbarImg, textNode, offsetLeft, offsetTop;
    
	// determine key adjustment factors for the total height of menu divs
    
	var menuItemH = 24;
	var bodyFontSize = parseInt(mm_getElementStyle(document.body, "fontSize", "font-size"));
	var heightAdjust = parseInt(CSSRuleValues.menuWrapperPadding) + parseInt(CSSRuleValues.menuWrapperBorderWidth);

	if (navigator.appName == "Microsoft Internet Explorer" && 
		navigator.userAgent.indexOf("Win") != -1 && 
		(typeof document.compatMode == "undefined" || 
		document.compatMode == "BackCompat")) {
			heightAdjust = -heightAdjust;
		}
   
	// use menus array to drive div creation loop
	for (var i = 0; i < mm_items.length; i++) {
        	menuDiv = document.createElement("div");
		menuDiv.id = "popupmenu" + i;
		// preserve menu's ID as property of the menus array item
		mm_items[i].elemId = "popupmenu" + i;
		menuDiv.className = "menuWrapper";
		if (mm_items[i].menuItems.length > 0) {
			menuDiv.style.height = (menuItemH * mm_items[i].menuItems.length) - 
			heightAdjust + "px";
		} else {
			// don't display any menu div lacking menu items
			menuDiv.style.display = "none";
		}
		// define event handlers
		menuDiv.onmouseover = mm_keepMenu;
		menuDiv.onmouseout = mm_requestHide;

		// set stacking order in case other layers are around the page
		menuDiv.style.zIndex = 1000;
        
		// assemble menu item elements for inside menu div
		for (var j = 0; j < mm_items[i].menuItems.length; j++) {
			menuItem = document.createElement("div");
			menuItem.id = "popupmenuItem_" + i + "_" + j;
			menuItem.className = "menuItem";
			menuItem.onmouseover = mm_toggleHighlight;
			menuItem.onmouseout = mm_toggleHighlight;
			menuItem.onclick = mm_hideMenus;
			menuItem.style.top = menuItemH * j + "px";
			itemLink = document.createElement("a");
			itemLink.href = _locale_lang+'/'+mm_items[i].menuItems[j].href;
			itemLink.className = "menuItem";
			itemLink.onmouseover = mm_toggleHighlight;
			itemLink.onmouseout = mm_toggleHighlight;
			textNode = document.createTextNode(mm_items[i].menuItems[j].text);
			itemLink.appendChild(textNode);
			menuItem.appendChild(itemLink);
			menuDiv.appendChild(menuItem);
		}
		// append each menu div to the body
		document.body.appendChild(menuDiv);
	}
	mm_makeHashes();
	mm_assignLabelEvents();
	// pre-position menu
	for (i = 0; i < mm_items.length; i++) {
        	mm_positionMenu(mm_items[i].elemId);
	}
	menuReady = true;
 }

 // initialize global that helps manage menu hiding
 var timer;

 // invoked from mouseovers inside menus to cancel hide
 // request from mouseout of menu bar image et al.
 function mm_keepMenu() {
	clearTimeout(timer);
 }

 function mm_cancelAll() {
	mm_keepMenu();
	menuReady = false;
 }

 // invoked from mouseouts to request hiding all menus
 // in 1/4 second, unless cancelled
 function mm_requestHide() {
	timer = setTimeout("mm_hideMenus()", 250);
 }

 // "brute force" hiding of all menus and restoration
 // of normal menu bar images
 function mm_hideMenus() {
	for (var i = 0; i < mm_items.length; i++) {
		var menu = document.getElementById(mm_items[i].elemId)
		menu.style.visibility = "hidden";
	}
 }

 // set menu position just before displaying it
 function mm_positionMenu(menuId){
	// use the menu bar image for position reference of related div
	var mBarImg = document.getElementById(mm_items[menuId].mBarImgId);
	var offsetTrail = mBarImg;
	var offsetLeft = -8;
	var offsetTop = 6;
	while (offsetTrail) {
		offsetLeft += offsetTrail.offsetLeft;
		offsetTop += offsetTrail.offsetTop;
		offsetTrail = offsetTrail.offsetParent;
	}
	if (navigator.userAgent.indexOf("Mac") != -1 && 
		typeof document.body.leftMargin != "undefined") {
			offsetLeft += document.body.leftMargin;
			offsetTop += document.body.topMargin;
		}
		var menuDiv = document.getElementById(menuId);
		menuDiv.style.left = offsetLeft + "px";
		menuDiv.style.top = offsetTop + 36 + "px";
 }

 // display a particular menu div
 function mm_showMenu(menuId) {
	if (menuReady) {
        	mm_keepMenu();
		mm_hideMenus();
		mm_positionMenu(menuId);
		var menu = document.getElementById(menuId);
		menu.style.visibility = "visible";
	}
 }

 // menu bar image mm_swapping, invoked from mouse events in menu bar
 // mm_swap style sheets for menu items during rollovers
 function mm_toggleHighlight(evt) {
	evt = (evt) ? evt : ((event) ? event : null);
	if (typeof menuReady != "undefined") {
        	if (menuReady && evt) {
			var elem = (evt.target) ? evt.target : evt.srcElement;
			if (elem.nodeType == 3) {
				elem = elem.parentNode;
			}

			if (evt.type == "mouseover") {
				mm_keepMenu();
				elem.className ="menuItemOn";
			} else {
				elem.className ="menuItem";
				mm_requestHide();
			}

			evt.cancelBubble = true;
		}
	}
 }

 function mm_swap(evt) {
	evt = (evt) ? evt : ((event) ? event : null);
	if (typeof menuReady != "undefined") {
		if (evt && (document.getElementById && document.styleSheets) && menuReady) {
			var elem = (evt.target) ? evt.target : evt.srcElement;
			if (elem.className == "menuImg") {
				if (evt.type == "mouseover") {
					mm_showMenu(mm_items[elem.id].elemId);
				} else if (evt.type == "mouseout") {
					mm_requestHide();
				}

				evt.cancelBubble = true;
			}
		}
	}
 }

 // create menus only if key items are supported
 function mm_initMenus() {
	if (document.getElementById && document.styleSheets) {
		setTimeout("mm_makeMenus()", 5);
		window.onunload=mm_cancelAll;
	}
 }