var MENU_EFFECT_FADE = 'fade';
var MENU_EFFECT_SLIDE = 'slide';

var Menu = {
	SUB_MENU_SLIDE_DOWN_DELAY:  100, // miliseconds
	SUB_MENU_SLIDE_UP_DELAY:  500, // miliseconds
	
	SUB_MENU_MIN_LEFT_OFFSET:  0, // pixels
	
	SUB_MENU_LEFT_OFFSET_CORRECTION: 10, // pixels
	
	__slideDownTimeoutHandler:  null,
	__slideUpTimeoutHandler:  null,
	
	__currentMenuItem:  null,
	__currentSubMenu:  null,
	
	__topSubMenuContainer: null,
	__page: null,
	
	init: function()
	{
		this.effect = $.browser.msie ? MENU_EFFECT_SLIDE : MENU_EFFECT_FADE;
		
		this.__page = $('#container');
		
		this.__topSubMenuContainer = $('div#top-sub-menu-container');
		
		this.__topSubMenuContainer.hide();
		
		this.__topSubMenuContainer
			.mouseover(function(){
				Menu.subMenuOver();
			})
			.mouseout(function(){
				Menu.subMenuOut();
			});
		
		$('.top-sub-menu', this.__topSubMenuContainer).hide();
		
		$('#menubar li')
			.mouseover(function(e){
				Menu.menuItemOver($(this), this.id.substring(5), e);
			})
			.mouseout(function(e){
				Menu.menuItemOut($(this), e);
			});
	},
	
	menuItemOver: function(menuItem, subMenuID, event)
	{
		if ( Util.isOwnMouseOverEventOf(menuItem.get(0), event) )
		{
			this.hideCurrentSubMenu();
			this.setCurrentMenuItem(menuItem);
			this.showSubMenu(subMenuID, menuItem);
		}
	},
	
	menuItemOut: function(menuItem, event)
	{
		if ( Util.isOwnMouseOutEventOf(menuItem.get(0), event) )
		{
			this.slideSubMenuUp();
		}
	},
	
	subMenuOver: function()
	{
		if ( this.__currentSubMenu )
		{
			this.slideSubMenuDown();
		}
	},
	
	subMenuOut: function()
	{
		this.slideSubMenuUp();
	},
	
	showSubMenu: function(subMenuID, menuItem)
	{
		var topSubMenu = $('#top-sub-menu-' + subMenuID);
		if ( topSubMenu.length == 0 )
		{
			return;
		}
		
		var offsetLeft = $(menuItem).offset().left - this.__page.offset().left;
		offsetLeft += this.SUB_MENU_LEFT_OFFSET_CORRECTION;
		if ( offsetLeft < this.SUB_MENU_MIN_LEFT_OFFSET )
		{
			offsetLeft = this.SUB_MENU_MIN_LEFT_OFFSET;
		}
		//topSubMenu.css('padding-left', offsetLeft + 'px');
		this.__topSubMenuContainer.css('left', ( offsetLeft - 10 ) + 'px');
		
		this.slideSubMenuDown();
		
		if ( topSubMenu.get(0).display == '' )
		{
			topSubMenu.hide();
		}
		
		topSubMenu.toggle();
		
		this.__currentSubMenu = topSubMenu;
	},
	
	hideCurrentSubMenu: function()
	{
		if ( this.__currentSubMenu )
		{
			this.__currentSubMenu.hide();
			this.__currentSubMenu = null;
		}
	},
	
	setCurrentMenuItem: function(menuItem)
	{
		this.clearCurrentMenuItem();
		this.__currentMenuItem = menuItem;
		this.__currentMenuItem.addClass('hover');
	},
	
	clearCurrentMenuItem: function()
	{
		if ( this.__currentMenuItem )
		{
			this.__currentMenuItem.removeClass('hover');
			this.__currentMenuItem = null;
		}
	},
	
	slideSubMenuDown: function(callback)
	{
		this.cancelSlideUp();
		this.cancelSlideDown();
		var self = this;
		this.__slideDownTimeoutHandler = setTimeout(
			function()
			{
				var func = self.effect == MENU_EFFECT_FADE ? 'fadeIn' : 'slideDown';
				self.__topSubMenuContainer[func]('normal', callback);
			},
			this.SUB_MENU_SLIDE_DOWN_DELAY
		);
	},
	
	slideSubMenuUp: function()
	{
		this.cancelSlideUp();
		this.cancelSlideDown();
		var self = this;
		this.__slideUpTimeoutHandler = setTimeout(
			function()
			{
				self.clearCurrentMenuItem();
				var func = self.effect == MENU_EFFECT_FADE ? 'fadeOut' : 'slideUp';
				self.__topSubMenuContainer[func]('fast');
			},
			this.SUB_MENU_SLIDE_UP_DELAY
		);
	},
	
	cancelSlideUp: function()
	{
		if ( this.__slideUpTimeoutHandler )
		{
			clearTimeout(this.__slideUpTimeoutHandler);
			this.__slideUpTimeoutHandler = null;
		}
	},
	
	cancelSlideDown: function()
	{
		if ( this.__slideDownTimeoutHandler )
		{
			clearTimeout(this.__slideDownTimeoutHandler);
			this.__slideDownTimeoutHandler = null;
		}
	}
};

$(document).ready(function(){
	Menu.init();
});

