
var ieTimeoutHandle;
var ieMenusToPositionAfterTimeout = null;

function initMenuItem(menu) {
	menu = convertToObject(menu);
	if (typeof(menu.container) != "undefined") return;

	menu.container = document.getElementById(menu.id + 'Container');
	menu.expanded = typeof(menu.getAttribute('expanded')) == "undefined" ? false : (menu.getAttribute('expanded') == 'True' ? true : false);
	menu.parentMenu = document.getElementById(menu.getAttribute('menuId'));
	menu.parent = document.getElementById(menu.getAttribute('parentId'));
	menu.style.cursor = "default";
	menu.cssClass = typeof(menu.getAttribute('cssclass')) == "undefined" ? null : menu.getAttribute('cssclass');
	menu.hoverClass = typeof(menu.getAttribute('hoverclass')) == "undefined" ? null : menu.getAttribute('hoverclass');
	menu.navigateurl = typeof(menu.getAttribute('navigateurl')) == "undefined" ? null : menu.getAttribute('navigateurl');

	if (menu.navigateurl != null) {
		menu.style.cursor = "pointer";
		var str;
		if (menu.navigateurl.indexOf("__doPostBack") > -1) str = menu.navigateurl;
		else {
			str = "location='" + menu.getAttribute('navigateurl') + "';";
			if (menu.getAttribute('target') != null) str = "window.open('" + menu.getAttribute('navigateurl') + "', '" + menu.getAttribute('target') + "');";
		}
		hookupEvent(menu, "onclick", str, true);
	}

	if (typeof(menu.container) == "undefined") menu.container = null;
	else if (menu.container != null) {
		menu.container.parent = menu;
		menu.container.style.top = (getOffsetTopFromBody(menu) + menu.offsetHeight) + 'px';

		if (menu.container.offsetWidth > menu.parentMenu.offsetWidth) {
			menu.container.style.width = (menu.parentMenu.offsetWidth - (isExplorer ? 0 : getBorderLeftRightWidth(menu.container))) + 'px';
		}
		else if (menu.container.offsetWidth < menu.parentMenu.offsetWidth) {
			menu.container.style.width = menu.parentMenu.offsetWidth + 'px';
		}
		positionMenu(menu);
		//Reposition the menu on window size change, 
		//Special case for IE, cos 
		//	1. OnResizeEnd does not fire (trust me, I tried)
		//	2. OnResize in IE fires for every pixel change, unlike Firefox that fires after the resizing is done
		//positionMenuIE causes the browser to wait .25 secs before firing positionMenu, anything less than that
		//and the timeout thread set to do the firing is killed.
		//why do we have an array you ask, good question, normally, the code below should add event handlers for
		//each menu item that has been initialized (until you mouseover that menu, it is not initialized)
		//but because we are trying to cause IE to wait before calling, we need a way to track all those
		//menus, thus, the array
		if (!isExplorer) hookupEvent(window, "onresize", "positionMenu('" + menu.id + "');", false);
		else {
			hookupEvent(window, "onresize", "positionMenuIE('" + menu.id + "');", false);
			if (ieMenusToPositionAfterTimeout == null) ieMenusToPositionAfterTimeout = new Array();
			ieMenusToPositionAfterTimeout.push(menu.id);
		}
	}
}
function positionMenu(menu) {
	menu = convertToObject(menu);
	var renderAlign = menu.container.getAttribute('childrenAlignment');
	switch (renderAlign) {
		case 'LeftParent':
			menu.container.style.left = getOffsetLeftFromBody(menu) + 'px';
			menu.container.style.top = (menu.offsetHeight + getOffsetTopFromBody(menu) - (isExplorer ? getBorderTopWidth(menu.container) : 0)) + 'px';
			break;
		case 'RightParent':
			var lfb = getOffsetLeftFromBody(menu);
			var mw = menu.offsetWidth;
			var cw = menu.container.offsetWidth;
			menu.container.style.left = (lfb + (mw-cw)) + 'px';
			break;
		case 'LeftMenu':
			menu.container.style.left = getOffsetLeftFromBody(menu.parentMenu) + 'px';
			break;
		case 'RightMenu':
			var lfb = getOffsetLeftFromBody(menu.parentMenu);
			var mw = menu.parentMenu.offsetWidth;
			var cw = menu.container.offsetWidth;
			menu.container.style.left = (lfb + (mw-cw)) + 'px';
			break;
		case 'CenterMenu':
			var mw = menu.parentMenu.offsetWidth;
			var cw = menu.container.offsetWidth;
			var itemsHeight = 0;
			if (mw == cw) {
				var ranges = new Array();
				var widths = new Array();
				var hh = 0;
				ranges.push(0);
				var iw = 0;
				for (var i=0; i<menu.container.childNodes.length; i++) {
					var lw = menu.container.childNodes[i].offsetWidth;
					if (menu.container.childNodes[i].offsetHeight > hh) hh = menu.container.childNodes[i].offsetHeight;
					if ((lw + iw) > cw) {
						ranges.push(i);
						widths.push(iw);
						iw = 0;
						itemsHeight += hh;
					}
					iw += lw;
					if (i == (menu.container.childNodes.length-1)) {
						widths.push(iw);
						itemsHeight += hh;
					}
				}
				var ctHeight = menu.container.offsetHeight;
				for (var i=0;i<ranges.length;i++) {
					var adj = ((cw - widths[i])/2);
					for (var j=ranges[i]; j < (i==ranges.length-1 ? menu.container.childNodes.length : ranges[i+1]); j++) {
						var obj = menu.container.childNodes[j];
						obj.style.position = 'static';
						obj.newLeft = (menu.expanded ? getOffsetLeftFromBody(obj) : obj.offsetLeft) + adj + 'px';
						obj.newTop = (menu.expanded ? getOffsetTopFromBody(obj) : obj.offsetTop) + 'px';
					}
				}
				for (var i=0;i<ranges.length;i++) {
					for (var j=ranges[i]; j<(i==ranges.length-1?menu.container.childNodes.length:ranges[i+1]); j++) {
						var obj = menu.container.childNodes[j];
						obj.style.left = menu.container.childNodes[j].newLeft;
						obj.style.top = menu.container.childNodes[j].newTop;
						obj.style.position = 'absolute';
					}
				}
				if (menu.expanded && !isExplorer) itemsHeight += menu.offsetHeight;
				menu.container.style.height = itemsHeight + 'px';
			}
			break;
	}
	if (isExplorer) {
		ieTimeoutHandle = null;
	}
}
function positionMenuIE(menu) {
	if (ieTimeoutHandle != null) {
		clearTimeout(ieTimeoutHandle);
	}
	ieTimeoutHandle = setTimeout("positionMenuTimeoutEnded()", 250);
}
function positionMenuTimeoutEnded() {
	for (var i=0; i<ieMenusToPositionAfterTimeout.length; i++) {
		positionMenu(ieMenusToPositionAfterTimeout[i]);
	}
}
function menuOver(menu) {
	menu = convertToObject(menu);
	initMenuItem(menu);
	if (menu.hoverClass != null) menu.className = menu.hoverClass;
	if (menu.container != null) {
		menu.container.style.visibility = 'visible';
	}
}
function menuOut(menu) {
	menu = convertToObject(menu);
	if (menu.expanded) return;
	initMenuItem(menu);
	if (menu.cssClass != null) menu.className = menu.cssClass;
	if (menu.container != null) {
		menu.container.style.visibility = 'hidden';
	}
}
function getBorderLeftRightWidth(obj) {
	var result = 0;
	if (obj.style.borderLeft != '') result += parseInt(obj.style.borderLeft);
	if (obj.style.borderRight != '') result += parseInt(obj.style.borderRight);
	if (result == 0 && obj.className != '') {
		for (var i=0; i<document.styleSheets.length; i++) {
			for (var j=0; j<document.styleSheets[i].cssRules.length; j++) {
				if (document.styleSheets[i].cssRules[j].selectorText == "."+obj.className) {
					result += (parseInt(document.styleSheets[i].cssRules[j].style.borderLeftWidth)) + (parseInt(document.styleSheets[i].cssRules[j].style.borderRightWidth));
					break;
				}
			}
		}
	}
	return result;
}
function getBorderTopBottomWidth(obj) {
	return getBorderTopWidth(obj) + getBorderBottomWidth(obj);
}
function getBorderTopWidth(obj) {
	var result = 0;
	if (obj.style.borderTopWidth != '') result += parseInt(obj.style.borderTopWidth);
	if (result == 0 && obj.className != '') {
		for (var i=0; i<document.styleSheets.length; i++) {
			var cssRules = isExplorer ? document.styleSheets[i].rules : document.styleSheets[i].cssRules;
			for (var j=0; j<cssRules.length; j++) {
				if (cssRules[j].selectorText == "."+obj.className) {
					var cssrule = cssRules[j];
					if (cssrule.style.borderTopWidth != '') result += parseInt(cssrule.style.borderTopWidth);
					break;
				}
			}
		}
	}
	return result;
}
function getBorderBottomWidth(obj) {
	var result = 0;
	if (obj.style.borderBottomWidth != '') result += parseInt(obj.style.borderBottomWidth);
	if (result == 0 && obj.className != '') {
		for (var i=0; i<document.styleSheets.length; i++) {
			var cssRules = isExplorer ? document.styleSheets[i].rules : document.styleSheets[i].cssRules;
			for (var j=0; j<cssRules.length; j++) {
				if (cssRules[j].selectorText == "."+obj.className) {
					var cssrule = cssRules[j];
					if (cssrule.style.borderBottomWidth != '') result += parseInt(cssrule.style.borderBottomWidth);
					break;
				}
			}
		}
	}
	return result;
}