$(function() {
	$('ul.jd_menu').jdMenu({ showDelay: 2000 });
});
(function($) {
	function addEvents(ul) {
		var settings = $.data($(ul).parents().andSelf().filter('ul.jd_menu')[0], 'jdMenuSettings');
		$('> li', ul)
			.bind('mouseenter.jdmenu mouseleave.jdmenu', function(evt) {
				$(this).toggleClass('jdm_hover');
				var ul = $('> ul', this);
				if (ul.length == 1) {
					clearTimeout(this.$jdTimer);
					var enter = (evt.type == 'mouseenter');
					var fn = (enter ? showMenu : hideMenu);
					this.$jdTimer = setTimeout(function() {
						fn(ul[0], settings.onAnimate, settings.isVertical);
					}, enter ? settings.showDelay : settings.hideDelay);
				}
			})
			.bind('click.jdmenu', function(evt) {
				var ul = $('> ul', this);
				if (ul.length == 1 &&
					(settings.disableLinks == true || $(this).hasClass('accessible'))) {
					showMenu(ul, settings.onAnimate, settings.isVertical);
					return false;
				}
				if (evt.target == this) {
					var link = $('> a', evt.target).not('.accessible');
					if (link.length > 0) {
						var a = link[0];
						if (!a.onclick) {
							window.open(a.href, a.target || '_self');
						} else {
							$(a).trigger('click');
						}
					}
				}
				if (settings.disableLinks ||
					(!settings.disableLinks && !$(this).parent().hasClass('jd_menu'))) {
					$(this).parent().jdMenuHide();
					evt.stopPropagation();
				}
			})
			.find('> a')
				.bind('focus.jdmenu blur.jdmenu', function(evt) {
					var p = $(this).parents('li:eq(0)');
					if (evt.type == 'focus') {
						p.addClass('jdm_hover');
					} else {
						p.removeClass('jdm_hover');
					}
				})
				.filter('.accessible')
					.bind('click.jdmenu', function(evt) {
						evt.preventDefault();
					});
	}
	function showMenu(ul, animate, vertical) {
		var ul = $(ul);
		if (ul.is(':visible')) {
			return;
		}
		ul.bgiframe();
		var li = ul.parent();
		ul.trigger('jdMenuShow')
			.positionBy({ target: li[0],
				targetPos: (vertical === true || !li.parent().hasClass('jd_menu') ? 1 : 3),
				elementPos: 0,
				hideAfterPosition: true
			});
		if (!ul.hasClass('jdm_events')) {
			ul.addClass('jdm_events');
			addEvents(ul);
		}
		li.addClass('jdm_active')
		// Hide any adjacent menus
			.siblings('li').find('> ul:eq(0):visible')
				.each(function() {
					hideMenu(this);
				});
		if (animate === undefined) {
			ul.show();
		} else {
			animate.apply(ul[0], [true]);
		}
	}
	function hideMenu(ul, animate) {
		var ul = $(ul);
		$('.bgiframe', ul).remove();
		ul.filter(':not(.jd_menu)')
			.find('> li > ul:eq(0):visible')
				.each(function() {
					hideMenu(this);
				})
			.end();
		if (animate === undefined) {
			ul.hide()
		} else {
			animate.apply(ul[0], [false]);
		}
		ul.trigger('jdMenuHide')
			.parents('li:eq(0)')
				.removeClass('jdm_active jdm_hover')
			.end()
				.find('> li')
				.removeClass('jdm_active jdm_hover');
	}
	$.fn.jdMenu = function(settings) {
		var settings = $.extend({	// Time in ms before menu shows
			showDelay: 200,
			hideDelay: 500,
			disableLinks: true
		}, settings);
		if (!$.isFunction(settings.onAnimate)) {
			settings.onAnimate = undefined;
		}
		return this.filter('ul.jd_menu').each(function() {
			$.data(this,
					'jdMenuSettings',
					$.extend({ isVertical: $(this).hasClass('jd_menu_vertical') }, settings)
					);
			addEvents(this);
		});
	};
	$.fn.jdMenuUnbind = function() {
		$('ul.jdm_events', this)
			.unbind('.jdmenu')
			.find('> a').unbind('.jdmenu');
	};
	$.fn.jdMenuHide = function() {
		return this.filter('ul').each(function() {
			hideMenu(this);
		});
	};
	$(window)
		.bind('click.jdmenu', function() {
			$('ul.jd_menu ul:visible').jdMenuHide();
		});
})(jQuery);

