/*
	PageMenu

	Author:
		Joachim Fornallaz, jf@omnis.ch

	History:
		October 6th, 2006 - v1.0
		April 16th, 2007  - v1.1
*/

/* Instance methods */

PageMenu.prototype = {
	
	showMenu: function(event, isHover) {
		// stop event from propagating
		if (event.preventDefault) {
			event.preventDefault();
			event.stopPropagation();
		} else {
			event.returnValue = false;
			event.cancelBubble = true;
		}
		// close any other open menu
		PageMenu.hideAllMenus();
		// open this menu
		this.positionMenuBelowTitle();
		this.menuElement.style.display = 'block';
		this.menuElement.style.visibility = 'visible';
		this.menuElement.style.zIndex = 999;
		this.menuElement.onmouseover = PageMenu.clearTimeout;
		this.menuElement.onmouseout = PageMenu.startTimeout;
		// handle clicks on document
		document.onclick = this.hideMenu.bind(this);
		this.hideAllowed = true;
		if (!isHover) {
			PageMenu.startTimeout();
		}
	},
	
	hideMenu: function() {
		this.menuElement.style.display = 'none';
		this.menuElement.style.visibility = 'hidden';
		this.menuElement.style.zIndex = '';
		if (document.onclick) {
			document.onclick = null;
		}
	},
	
	positionMenuBelowTitle: function() {
		var offsets = Position.positionedOffset(this.menuTitle);
		this.menuElement.style.position = 'absolute';
		this.menuElement.style.left = offsets[0] + 'px';
		this.menuElement.style.top = offsets[1] + this.menuTitle.offsetHeight + 'px';
		if (this.menuElement.offsetWidth < this.menuTitle.offsetWidth) {
			this.menuElement.style.width = this.menuTitle.offsetWidth + 'px';
		}
	}
};

function PageMenu(menuTitle, menuElement) {
	this.menuTitle = menuTitle
	this.menuElement = menuElement;
	menuTitle.onclick = this.showMenu.bindAsEventListener(this);
	if (menuTitle.hasClassName('hover')) {
		menuTitle.onmouseover = this.showMenu.bindAsEventListener(this, true);
		menuTitle.onmouseout = PageMenu.startTimeout;
	} 
	menuElement.style.display = 'none';
	PageMenu.menus.push(this);
}

/* Static variables and methods */

PageMenu.menus = new Array();
PageMenu.timeout = null;
PageMenu.timeoutTime = 1000;

PageMenu.initialize = function(parent) {

	// get all menubars (<ul class="menubar">)
	var menubars = parent.getElementsBySelector ? parent.getElementsBySelector('ul.menubar') : $$('ul.menubar');
	menubars.each( function (menubar) {
		var menuTitles = menubar.getElementsBySelector('label');
		menuTitles.each( function(menuTitle) {
			var menu = menuTitle.next('li');
			if (menu) {
				var menuObject = new PageMenu(menuTitle, menu);
			}
		} );
	} );
	
	var menuTitles = parent.getElementsBySelector ? parent.getElementsBySelector('label.menutitle') : $$('label.menutitle');
	menuTitles.each( function (menuTitle) {
		var menu = $(menuTitle.htmlFor);
		if (menu) {
			var menuObject = new PageMenu(menuTitle, menu);
		}
	} );
};

PageMenu.startTimeout = function() {
	PageMenu.timeout = window.setTimeout("PageMenu.hideAllMenus()", PageMenu.timeoutTime);
};

PageMenu.clearTimeout = function() {
	if (PageMenu.timeout) {
		window.clearTimeout(PageMenu.timeout);
		PageMenu.timeout = null;
	}
};

PageMenu.hideAllMenus = function() {
	PageMenu.clearTimeout();
	
	for (var i=0; i<PageMenu.menus.length; i++) {
		var menuObject = PageMenu.menus[i];
		menuObject.hideMenu();
	}
};

/* Run initialization when the page has loaded */
Event.observe(window, 'load', PageMenu.initialize, false);
