/**
 * LBI SimpleMenu
 */

(function($){

	var STATE_COLD = 1,
		STATE_HOT  = 2;

	var SimpleMenu = function(element, settings) {
		$.extend(this, SimpleMenu.Defaults, settings);
		this.root = element;
		this.state = STATE_COLD;
		this.stateChange = null;
		this.defaultItem = $('.'+this.activeClass, this.root)[0];

		$(this.root).bind('mouseover', this.mouseover.bind(this));
		$(this.root).bind('mouseout', this.mouseout.bind(this));

		if(this.keyEnabled) {
			$(this.focusType, this.root).bind('focus', this.mouseover.bind(this));
			$(this.focusType, this.root).bind('blur', this.mouseout.bind(this));
		}
	}

	SimpleMenu.prototype = {
		constructor: SimpleMenu,

		toggleMenu:function(item, toggle) {
			$(item)[toggle? 'addClass' : 'removeClass'](this.activeClass);
			var menu = $(item).find(this.menuType).eq(0);
			if(toggle) {
				menu.fadeIn('fast');
			} else {
				menu.hide();
			}
		},
		
		toggleItem:function(item, toggle) {
			$(item)[toggle? 'addClass' : 'removeClass'](this.hoverClass);
		},

		mouseover: function(e) {
			var item = $(e.target).closest(this.itemType)[0];
			if(item && item != this.item) {
				this.setCurrent(item);
				clearTimeout(this.stateChange);
				var self = this, toggle = function(){ self.toggle(item); };
				switch(this.state) {
					case STATE_COLD:
						this.stateChange = setTimeout(toggle, this.openDelay);
					break;
					case STATE_HOT: 
						this.stateChange = setTimeout(toggle, this.switchDelay);
					break;
				}
			}
		},

		mouseout: function(e) {
			var node = e.relatedTarget;
			while(node) {
				if(node == this.root) return;
				node = node.parentNode;
			}

			this.setCurrent(null);
			clearTimeout(this.stateChange);

			var self = this;
			switch(this.state) {
				case STATE_COLD: break;
				case STATE_HOT:
					this.stateChange = setTimeout(function(){ 
						self.toggle(false);
					}, this.closeDelay);
				break;
			}
		},

		toggle: function(item) {
			var tree = item? item.parentNode : this.root;
			var lists = $(tree).find(this.menuType);

			for(var list,i=0; list=lists[i++];) {
				if(list.parentNode != item) {
					this.toggleMenu(list.parentNode, false);
				}
			}

			if(item) {
				var list = $(item).find(this.menuType)[0];
				list && this.toggleMenu(list.parentNode, true);
			}
			
			this.state = item? STATE_HOT : STATE_COLD;
		},

		setCurrent:function(item) {
			if(this.item) this.toggleItem(this.item, false);
			if(this.item = item) this.toggleItem(this.item, true);
		}
	};
	
	SimpleMenu.Defaults = {
		openDelay:   500,
		switchDelay: 100,
		closeDelay:  1000,
		hoverClass:  'hover',
		activeClass: 'active',
		itemType:    'li',
		menuType:    'ul',
		keyEnabled:  true,
		focusType:   'a'
	};

	$.registerPlugin('simpleMenu', SimpleMenu);

})(jQuery);