/**
 * LBI UI Module
 *
 * @module    UI
 * @version   1.00.090311
 * @requires  jQuery, Core
 * @author    LBI Lost Boys / Peter Nederlof
 */

(function($){

	var STATE_COLD = 1,
		STATE_HOT  = 2;

	var SimpleMenu = function(element, settings) {
		this.root = element;		
		$.extend(this, SimpleMenuSettings, settings);
		this.state = STATE_COLD;
		this.stateChange = null;
		this.defaultItem = $('.'+this.activeClass, this.root)[0];
		$(this.root).bind('mouseover', this.mouseover.bind(this));
	}
	
	SimpleMenu.prototype = {
		toggleMenu:function(item, toggle) {
			$(item)[toggle? 'addClass' : 'removeClass'](this.activeClass);
		},
		
		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;
				}

				if(!this.ping) {
					this.ping = true;
					$(document).bind('mouseover', this.mouseout.bind(this));
				}
			}
		},

		mouseout: function(e) {
			var node = e.target;
			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;
			}

			if(this.ping) {
				$(document).unbind('mouseover', this.mouseout);
				this.ping = false;
			}
		},

		toggle: function(item) {
			var tree = item? item.parentNode : this.root;
			var lists = tree.getElementsByTagName(this.menuType);

			for(var list,i=0; list=lists[i++];)
				this.toggleMenu(list.parentNode, false);

			if(item) {
				var list = item.getElementsByTagName(this.menuType)[0];
				list && this.toggleMenu(list.parentNode, true);
			} else if(this.defaultItem) {
				this.toggleMenu(this.defaultItem, 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);
		}
	};
	
	var SimpleMenuSettings = {
		openDelay:   500,
		switchDelay: 200,
		closeDelay:  1000,
		hoverClass:  'hover',
		activeClass: 'active',
		itemType:    'li',
		menuType:    'ul'
	};

	$.fn.simpleMenu = function(settings) {
		this.each(function(){
			new SimpleMenu(this, settings || {});
		});
		return this;
	}

})(jQuery);