STIR.MenuController = function() {
	this.open = [];
	this.mode = 'normal';
};

STIR.MenuController.prototype.ready = function() {	
	$('#primary a').mouseenter({ self: this }, this.enterTrigger);
	$('#primary a').mouseleave({ self: this }, this.leaveTrigger);
	
	$('#primary ul.open').live('mousemove', { self: this	}, this.enterTarget);
	$('#primary ul.open').live('mouseleave', { self: this	}, this.leaveTarget);
	
	$('li.opened').length && (this.mode = 'opened');
};

/**
 * Occurs when user's mouse enters the trigger. Opens submenu and closes
 * any pre-existingly opened submenus.
 */
STIR.MenuController.prototype.enterTrigger = function(e) {
	var self = e.data.self, target = e.target, children = $(target).parent().find('ul'),
		isOpened = $(target).parent().hasClass('opened');
	
	// if there is a submenu
	if(children.length && !isOpened) {
		
		// close existing menus
		if($('ul.open').length) {
			$('ul.open').not(children.eq(0)).hide().removeClass('open');
		}
		
		// close static menu temporarily
		if(self.mode == 'opened') {
			$('li.opened ul').hide();
		}
		
		if($('#primary').data('reopen')) {
			window.clearTimeout($('#primary').data('reopen'));
		}
		
		// open menu
		children.eq(0).fadeIn().addClass('open');
		//console.log("Menu has opened");
	}
	
	if(isOpened) {
		$('ul.open').hide();
		$('.opened ul').fadeIn();
	}
	
	var close_timeout = children.eq(0).data('timeout');
	if(close_timeout)	{
		window.clearTimeout(close_timeout);
	}
};

STIR.MenuController.prototype.leaveTrigger = function(e) {
	var target = $(e.target), isOpened = $(target).parent().hasClass('opened');	

	// make sure this is a top level trigger	
	if(target.siblings().length && !isOpened) {
		//console.log("Leaving Trigger.");
		target.data('inittimeout', window.setTimeout(function() {
			//console.log("inittimeout executed, menu closing");
			
			// TODO: Close specific UL, not .open !!! look at other instance of closing for reference
			//$('ul.open').removeClass('open').fadeOut();
			target.parent().find('ul').fadeOut().removeClass('open');
			
			e.data.self.reopenStatic();
		}, 3000)); // prev: 6000
	}
	
};

STIR.MenuController.prototype.enterTarget = function(e) {
	//console.log("Target moved upon.");
	var to = $(e.target).data('timeout');
	var ito = $(e.target).parent().find('a').data('inittimeout');
	if(ito) {
		//console.log(["clearing inittimeout", ito]);
		window.clearTimeout(ito);
	}
	if(to) {
		//console.log(["clearing timeout", to]);
		window.clearTimeout(to);
	}
};

STIR.MenuController.prototype.leaveTarget = function(e) {
	//console.log("left the opened nav");
	$(e.target).data('timeout', window.setTimeout(function() {
		//console.log("timeout executed, menu closing");
		// TODO need to specifically target this for the left submenu/target
		$(e.target).closest('ul').removeClass('open').fadeOut();
		//$('ul.open')
		
		e.data.self.reopenStatic();
	}, 1000)); // used to be 2000
};

STIR.MenuController.prototype.reopenStatic = function() {
	$('#primary').data('reopen', window.setTimeout(function() {
		//console.log("Reopening static");
		$('.opened ul:hidden').fadeIn();
	}, 1000)); // used to be 2000
};


var menu_controller = new STIR.MenuController();
$( menu_controller.ready() );

