﻿bfmenu = function(menuItem, trigger, submenu, settings, level) {
	submenu.css('zLevel', 0);
	var hoverClass = level == 1 ? settings.rootHoverClass : settings.hoverClass;
	var hoverDisabledClass = level == 1 ? settings.rootHoverDisabledClass : settings.hoverDisabledClass;

	var doOffset = true;
	var horzOffset = parseInt(submenu.attr('horzoffset'));
	if (isNaN(horzOffset))
		horzOffset = settings.horzOffset;

	var vertOffset = parseInt(submenu.attr('vertoffset'));
	if (isNaN(vertOffset))
		vertOffset = settings.vertOffset;

	var hoverTimeOut = -1;
	// A function that will delay for a certain amount of time before firing
	// the callback.  It will first clear any previous delays.
	function delay(callback) {
		window.clearTimeout(hoverTimeOut);
		hoverTimeOut = window.setTimeout(callback, level == 1 ? settings.rootHoverDelay : settings.hoverDelay);
	}

	function show() {
		submenu.removeClass(settings.offClass).css('zIndex', level).show();
		if (doOffset) {
			var pos = submenu.position();
			if (typeof (pos) != 'undefined') {
				submenu.css('top', pos.top + vertOffset);
				submenu.css('left', pos.left + horzOffset);
				doOffset = false;
			}
		}
	}

	function hide() {
		// Hide children submenus in reverse order to fix silly IE bug.
		submenu.find('.' + settings.subMenuClass).reverse()
            .addClass(settings.offClass).css('zIndex', 0).hide();
		submenu.addClass(settings.offClass).css('zIndex', 0).hide();
	}

	// Use different hover class if item is disabled
	var link = menuItem.children().children().children().children('a');
	var enabled = link.attr('enabled');
	// if enabled is defined then its value is false and the item is not enabled
	if (typeof (enabled) != 'undefined')
		hoverClass = hoverDisabledClass;

	var img = menuItem.children().children().children().children().children('img');
	var hoverSrc = img.attr('hoverimageurl');
	var restSrc = img.attr('restimageurl');

	// Attach events to the mouseenter and mouseleave events.
	trigger.mouseenter(function(event) {
		menuItem.children().children().children().eq(0).addClass(hoverClass);
		if (typeof (hoverSrc) != 'undefined')
			img.attr('src', hoverSrc);
		delay(show);
	});

	trigger.mouseleave(function(event) {
		menuItem.children().children().children().eq(0).removeClass(hoverClass);
		if (typeof (restSrc) != 'undefined')
			img.attr('src', restSrc);
		delay(hide);
	});
}

bfmenu.defaults = {
	menuClass: 'bf-menu',
	rootItemClass: 'bf-rootmenuitem',
	subMenuClass: 'bf-submenu',
	subMenuItemClass: 'bf-submenuitem',
	offClass: 'bf-submenuoff',
	rootHoverClass: 'bf-roothover',
	rootHoverDisabledClass: 'bf-rootmenuitemhoverdisabled',
	hoverClass: 'bf-submenuhover',
	hoverDisabledClass: 'bf-submenuitemhoverdisabled',
	rootHoverDelay: 150,
	hoverDelay: 150,
	horzOffset: 0,
	vertOffset: 0
}

jQuery.fn.reverse = function() {
	return this.pushStack(this.get().reverse(), arguments);
};

jQuery.fn.bfmenu = function(options) {
	var settings = jQuery.extend(bfmenu.defaults, options);

	return this.each(function() {
		// set zindex on top-level menuClass to float over sharepoint controls
		$(this).find('.' + settings.menuClass + ':first').css('zIndex', 1);
		jQuery(this).find('.' + settings.rootItemClass).each(function() {
			var menuItem = jQuery(this);
			var trigger = menuItem.parent();

			var submenu = menuItem.next('table');  // Vertical orientation
			if (submenu.length == 0)
				submenu = menuItem.next('div').children('table'); // Horizontal

			new bfmenu(menuItem, trigger, submenu, settings, 1);
			submenu.children().children().children().children('.' + settings.subMenuItemClass).bfmenu_submenu(settings, 2);
		});
	});
};

jQuery.fn.bfmenu_submenu = function(settings, level) {
	return $(this).each(function() {
		var menuItem = jQuery(this);
		var submenu = menuItem.find('.' + settings.subMenuClass).eq(0); // Vertical
		var trigger = menuItem;
		if (submenu.length == 0) {
			submenu = menuItem.next('div').children('table'); // Horizontal
			trigger = menuItem.parent();
		}

		new bfmenu(menuItem, trigger, submenu, settings, level);
		submenu.children().children().children().children('.' + settings.subMenuItemClass).bfmenu_submenu(settings, level + 1);
	});
};

jQuery.extend({
	debug: function($msg) { 
		if (window.console && window.console.log) 
			window.console.log('debug: ' + $msg);
		}
});
