
Menu = function (sHolderId) {
	this.div = document.getElementById(sHolderId);
	this.makeSubmenuIds = false;	// unique ID on each submenu - off by default 
}

Menu.init = function () {};

Menu.menus = new Array();

Menu.addMenu = function (sHolderId) {
	var menu = new Menu(sHolderId);
	this.menus.push(menu);
	return menu;
}

Menu.getMenu = function (topItem) {
	for(var iMenu = Menu.menus.length - 1; iMenu >= 0; iMenu--) {
		var menu = Menu.menus[iMenu];
		for(var iTopItem = menu.topItems.length - 1; iTopItem >= 0; iTopItem--) {
			if(menu.topItems[iTopItem] == topItem)
				return menu;
		}
	}
	
	return null;
}

Menu.openedItem = null;


p = Menu.prototype;

p.setTopLevelMenus = function (sTagName, sClassName, sItemHolderClassName, sItemClassName, onmouseover, onmouseout)
{
	var topItems;

	if(sClassName == '') {
		topItems = this.div.getElementsByTagName(sTagName);
	} else {
		topItems = Element_getTagsByClassName(this.div, sTagName, sClassName);
	}
	
	if(topItems.length == 0)
		alert('Warning: .setTopLevelMenus(' + sTagName + ', ' + sClassName + '...) - no tags found!');

	// copy items into real array - otherwise DOMArray is subject to change
	this.topItems = new Array();
	for(var i = topItems.length - 1; i >= 0; i--) {
		this.topItems[i] = topItems[i];
	}

	this.topItemTagName = sTagName.toLowerCase();

	this.itemHolderClassName = sItemHolderClassName;
	this.itemClassName = sItemClassName;
	this.onmouseover = onmouseover;
	this.onmouseout = onmouseout;
}

/* optional - called if server may have already opened one or more menus on page (script will ignore these)
*  @param sClassName	class of element immediately after menu if menu is opened by server */
p.setServerMenuClassName = function (sClassName) {
	for(var iItem = this.topItems.length - 1; iItem >= 0; iItem--) {
		var item = this.topItems[iItem];
		if(item.nextSibling && item.nextSibling.className == sClassName) {
			item.alreadyOpen = true;
		}
	}
}

p.setServerMenuId = function (sId) {
	for(var iItem = this.topItems.length - 1; iItem >= 0; iItem--) {
		var item = this.topItems[iItem];
		
		var sibling = item.nextSibling;
		if(!document.all)
			sibling = sibling.nextSibling;	//IE skips TextNodes; Mozzy doesn't
		
		if(sibling && sibling.id == sId) {
			item.alreadyOpen = true;
		}
	}
}

p.addItems = function (iIndex, sHref, sContent) {	// last 2 args repeat
	var topItem = this.topItems[iIndex];
	var xOffset = 0;
	if(topItem.alreadyOpen)
		return;
	
	if(this.topItemTagName == 'div') {
		//topItem is a div; add submenu container as child underneath existing a tag or whatever
		var divItemHolder = topItem.appendChild(document.createElement('DIV'));
	} else {
		//topItem is some other tag like a; add submenu as sibling, right after topItem
		var divItemHolder = topItem.parentNode.insertBefore(document.createElement('DIV'), topItem.nextSibling);
		xOffset = topItem.scrollWidth - 5;
	}

	if(this.makeSubmenuIds) {
		divItemHolder.id = this.itemHolderClassName + iIndex;	//secondaryMenu0, secondaryMenu1, etc
	}
	divItemHolder.className = this.itemHolderClassName;
	//window.status = topItem.tagName;
	
	for(var iArg = 1; iArg < arguments.length; iArg += 2) {
		var divItem = divItemHolder.appendChild(document.createElement('DIV'));
		divItem.className = this.itemClassName;
		var a = divItem.appendChild(document.createElement('A'));
		a.href = arguments[iArg];
		a.innerHTML = arguments[iArg + 1];
		
		if(this.itemOnmouseover) {
			divItem.onmouseover = this.itemOnmouseover;
		}
		if(this.itemOnmouseout) {
			divItem.onmouseout = this.itemOnmouseout;
		}
	}
	
	divItemHolder.parentMenu = this;
	divItemHolder.parentItem = topItem;
	var expandsDown = this.expandsDown;
	
	topItem.onmouseover = function () {
	//window.defaultStatus += 'tmv,';
		
		var holder = Menu.getHolder(this);

		if(holder.timerClose) {
			//window.defaultStatus += holder.timerClose + ',';
			self.clearTimeout(holder.timerClose)
			holder.timerClose = 0;
		}
		
		if(Menu.openedItem) {
			if(Menu.openedItem != holder) {
				Menu.closeItem(Menu.openedItem);
			} else {
				return;	// traps for repeated mouseovers on same item
			}
		}
		
		Menu.openItem(holder, xOffset);
	}
	
	topItem.onmouseout = function () {
		//window.defaultStatus += 'tmo,';

		var holder = Menu.getHolder(this);
		
		if(holder.timerClose) {
			self.clearTimeout(holder.timerClose);
		}
		holder.timerClose = self.setTimeout(
			function () {
				Menu.closeItem(holder);
			}, 300
		);
	}
	
	divItemHolder.onmouseover = function () {
		//window.defaultStatus += 'hmv,';

		if(this.timerClose) {
			self.clearTimeout(this.timerClose);
			this.timerClose = 0;
		}
	}
	
	divItemHolder.onmouseout = function () {
		//window.defaultStatus += 'hmo,';

		if(!this.keepOpen) {
			if(this.timerClose) {
				self.clearTimeout(this.timerClose);
			}
			var holder = this;
			this.timerClose = self.setTimeout(
				function () {
					Menu.closeItem(holder);
				}, 300
			);
		}
	}
}

Menu.getHolder = function (topItem) {
	var menu = Menu.getMenu(topItem);
	if(menu.topItemTagName == 'div') {
		var holder = Element_getTagsByClassName(topItem, 'div', menu.itemHolderClassName)[0];
	} else {
		var holder = topItem.nextSibling;
	}
	return holder;
}

Menu.openItem = function (holder, xOffset) {
	//window.defaultStatus += 'open,';
	if(window.event) {
		var iY = event.clientY;
		var iHolderHeight = holder.clientHeight;

		var htmlRoot = document.documentElement;
		var iBottomMargin = htmlRoot.offsetHeight;
		
		
		if( iY + iHolderHeight + 10 > iBottomMargin ) {	// too close to bottom; display above
		//alert(iY + ',' + iHolderHeight + ',' + iBottomMargin);
		
			holder.style.marginTop = '-' + ( iHolderHeight - event.srcElement.clientHeight ) + 'px';
		}
		holder.style.marginLeft = -xOffset;
	}

	holder.style.visibility = 'visible';
	Menu.openedItem = holder;
	if(holder.parentMenu.onmouseover) {
		holder.parentMenu.onmouseover(holder.parentItem, holder);
	}
}
	

Menu.closeItem = function (holder) {
//window.defaultStatus += 'close?';

	if(Menu.openedItem) {
//window.defaultStatus += 'yes,';

		holder.style.visibility = '';
		if(holder.clientHeight)
			holder.style.marginTop = '';
		
		if(holder.parentMenu.onmouseout) {
			holder.parentMenu.onmouseout(holder.parentItem, holder);
		}
		if(Menu.openedItem == holder) {
			Menu.openedItem = null;
		}
	}
}
