var km_menu = {
	/**
	 * Menu hiding timeout (in msecs)
	 */
	HIDE_TIMEOUT: 500,
	
	/**
	 * Menu queued for hiding, its timeout ID (returned by setTimeout()) and its HTML element ID
	 */
	timeout: {
		timeout_id: 0,
		elem_id: ''
	},
	
	/**
	 * Menu item activated
	 */
	activateItem: function(event) {
		var item = Event.findElement(event, 'a');
		
		item.addClassName('act');
		
		// item.id is "item-1234"
		var submenu_id = 'menu-' + item.id.slice(5);
		
		// if something is in progress
		if (km_menu.timeout.timeout_id) {
			if (km_menu.timeout.elem_id != submenu_id) {
				km_menu.hideQueuedSubmenu();
			} else {
				// cancel countdown, dont hide menu
				km_menu.unqueueHideSubmenu();
			}
		}
		
		// if submenu exists
		if ($(submenu_id)) {
			// Menu popup position calculation
			menuPos = Position.cumulativeOffset($(submenu_id+'-cont'));
			menuPosX = menuPos[0];
			menuWidth = $(submenu_id).getWidth();

			winWidth = 0;
			if (window.outerWidth)
				winWidth = window.innerWidth;
			else if (document.documentElement.clientWidth)
				winWidth = document.documentElement.clientWidth;
			else 
				winWidth = document.body.offsetWidth ;

			scrollPosX = 0;
			if (document.documentElement)
				scrollPosX = document.documentElement.scrollLeft;
			else if (document.body)
				scrollPosX = document.body.scrollLeft;
			else
				scrollPosX = window.pageXOffset;

			viewport = { x1:scrollPosX, x2:scrollPosX+winWidth };
			menuDim = { x1:menuPosX, x2:menuPosX+menuWidth }

			chnPos = '0px';
			if (viewport.x1 > menuDim.x1) {
				chnPos = (viewport.x1-menuDim.x1)+'px';
			}
			else if (viewport.x2 < menuDim.x2) {
				chnPos = (viewport.x2-menuDim.x2)+'px';
			}
			$(submenu_id).setStyle({ left:chnPos });
			// /Menu popup position calculation

			km_menu.showSubmenu(submenu_id);
		}
		
		event.cancelBubble = true;
	},
	
	/**
	 * Submenu activated
	 */
	activateSubmenu: function(event) {
		var submenu = Event.findElement(event, 'div');
		var submenu_id = submenu.id;
		
		// cancel countdown, dont hide menu (because its countdown of this menu)
		km_menu.unqueueHideSubmenu();
		
		km_menu.showSubmenu(submenu_id);
		
		event.cancelBubble = true;
	},
	
	deactivateItem: function(event) {
		var item = Event.findElement(event, 'a');
		//console.debug(item);
		// item.id is "item-1234"
		var submenu_id = 'menu-' + item.id.slice(5);
		
		// if submenu exists
		if ($(submenu_id)) {
			// queue for hiding
			km_menu.queueHideSubmenu(submenu_id, km_menu.HIDE_TIMEOUT);
		}
		// otherwise, do your deactivate stuff immediately
		else {
			item.removeClassName('act');
		}
		
		event.cancelBubble = true;
	},
	
	deactivateSubmenu: function(event) {
		var submenu = Event.findElement(event, 'div');
		var submenu_id = submenu.id;
		
		km_menu.queueHideSubmenu(submenu_id, km_menu.HIDE_TIMEOUT);
		
		event.cancelBubble = true;
	},
	
	/**
	 * Makes submenu visible, hides all other submenus, if visible, cancels pending timeouts, etc
	 */
	showSubmenu: function(submenu_id) {
		$(submenu_id).show();
	},
	
	/**
	 * Queues submenu to hide in given msecs
	 */
	queueHideSubmenu: function(submenu_id, msecs) {
		km_menu.timeout.elem_id = submenu_id;
		km_menu.timeout.timeout_id = window.setTimeout('km_menu.hideQueuedSubmenu();', msecs);
	},
	
	/**
	 * Queues submenu for hiding in given msecs
	 */
	hideQueuedSubmenu: function() {
		// this is necessary only if "hide" was called by another func
		if (km_menu.timeout.elem_id) {
			$(km_menu.timeout.elem_id).hide();
			var item_id = 'item-' + km_menu.timeout.elem_id.slice(5);
			var item = $(item_id);
			item.addClassName('item').removeClassName('act');
		}
		km_menu.unqueueHideSubmenu();
	},
	
	/**
	 * Clears countdown for menu hiding
	 */
	unqueueHideSubmenu: function() {
		window.clearTimeout(km_menu.timeout.timeout_id);
		km_menu.timeout.elem_id = '';
		km_menu.timeout.timeout_id = 0;
	}
}

