K3Menu = Class.create();
K3Menu.prototype = {
	element:null,
	elementOver:null,
	currentMenu:null,
	globalObserve:null,
	
	initialize: function(element, options)
	{
		this.element = (element && element.tagName) ? element : $(element);
		this.setOptions(options);
		
		this.currentMenu = this.element.down('li.current') ? this.element.down('li.current') : null;

		if(this.currentMenu)
		{
			this.currentMenu.addClassName('active');
		}

		this.activeMenu = this.currentMenu;
		
		if(!this.globalObserve)
		{
			this.globalObserve = document.observe('mouseover', function(event)
			{
				this.elementOver = Event.element(event);

				this.options.onMouseOver(this);
				
				if(this.elementOver && this.elementOver.descendantOf(this.element))
				{
					if(
						this.elementOver.hasClassName(this.options.menuItemClass) || 
						(
							this.elementOver.up('.'+this.options.menuItemClass) &&
							this.elementOver.descendantOf(this.elementOver.up('.'+this.options.menuItemClass))
						)
					)
					{
						if(this.elementOver.up('.'+this.options.menuItemClass))
						{
							this.setMenu(this.elementOver.up('.'+this.options.menuItemClass));
						}
					}
				}
				else
				{
					if(this.options.resetActive)
					{
						this.setMenu(this.activeMenu);
					}
				}
			}.bind(this));
			
			this.element.select('li.'+this.options.menuItemClass).each(function(liMenu)
			{
				liMenu.observe('mouseover', function()
				{
					this.setMenu(liMenu);
				}.bind(this));
				
			}.bind(this));
		}

	},


	setOptions: function(options)
	{
		this.options = Object.extend({
			menuItemClass : 'menu-item',
			currentClass  : 'current',
			activeClass   : 'active',
			resetActive   : true,
			onBeforeSetMenu : function(instance) {},
			onAfterSetMenu : function(instance) {},
			onMouseOver : function(instance) {}
		}, options || { });
	},


	setMenu: function(currentMenu)
	{
		if(this.currentMenu)
		{
			this.currentMenu.removeClassName('active');

			if(this.currentMenu && this.currentMenu.down('ul'))
			{
				this.currentMenu.down('ul').hide();
			}
		}
		
		this.options.onBeforeSetMenu(this);
		this.currentMenu = currentMenu;
		this.options.onAfterSetMenu(this);
		
		if(this.currentMenu && this.currentMenu.down('ul'))
		{
			this.currentMenu.down('ul').setStyle({display:'block'});
		}

		if(this.currentMenu)
		{
			this.currentMenu.addClassName('active');
		}
	}

}
