/**
 * LBI UI Module
 *
 * @module    UI
 * @version   1.00.090311 modified 10/01/29
 * @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));

		//iframe for covering up select boxes in IE
		this.ieFrame = createIEFrame();
	}
	
	SimpleMenu.prototype = {
		toggleMenu:function(item, toggle) {
			$(item)[toggle? 'addClass' : 'removeClass'](this.activeClass);

			var menu = $(this.menuType, item).eq( 0);
			this.toggleIEFrame(toggle, menu);
		},
		
		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).find(this.menuType);

			for(var list,i=0; list=lists[i++];)
				this.toggleMenu(list.parentNode, false);

			if(item) {
				var list = $(item).find(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);
		},
		
		toggleIEFrame:function(toggle, menu) {
			if(this.ieFrame){
				if(toggle) {
					var offset = menu.offset();
					var canvas = $('#content').offset();
					this.ieFrame.css({
						left: offset.left - canvas.left + 'px',
						top: offset.top + 'px',
						width: (menu[0].offsetWidth) + 'px',
						height: (menu[0].offsetHeight) + 'px'
					});
				} else {
					this.ieFrame.css({
						left: -9999 + 'px',
						top: -9999 + 'px'
					});
				}
			}
		}
	};
	
	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;
	};

	function createIEFrame() {
		if(!/msie (5|6)/i.test(navigator.userAgent)) {
			return false;
		}

		var frame = $('iframe.cover-frm');
		if(frame.length == 0) {
			frame = $('<iframe src="about:blank" frameborder="0" class="cover-frm"></iframe>');
			$('#content').append(frame);
		}

		return frame;
	}

})(jQuery);