(function ($) {
	$.fn.extend({
		easymenu: function (config) {
			var gConfig = $.extend({
				contentAlignment: ""
			}, config);
			var gTrigger = $(this);
			var gMenu = $(gConfig.contentSelector);
			var gButtons = gMenu.find("a");
			var gChildMenus = gMenu.find("ul");
			var gChildTriggers = gChildMenus.parent();
			gMenu.addClass("ui-widget-content ui-corner-all");
			gButtons.addClass("ui-corner-all");
			gChildMenus.addClass("ui-widget-content ui-corner-all");
			gChildTriggers.children("a").append('<span class="arrow-wrap"><span class="arrow ui-icon ui-icon-triangle-1-e"></span></span>');
			gTrigger.click(function () {
				gChildMenus.hide();
				var absoluteLeft = gTrigger.offset().left + (gConfig.contentAlignment == "right" ? gTrigger.outerWidth() : 0);
				var absoluteTop = gTrigger.offset().top + (gConfig.contentAlignment == "right" ? 0 : gTrigger.outerHeight());
				var absoluteRight = absoluteLeft + gMenu.outerWidth();
				var absoluteBottom = absoluteTop + gMenu.outerHeight();
				var viewportRight = $(window).width() + $(window).scrollLeft();
				var viewportBottom = $(window).height() + $(window).scrollTop();
				if (absoluteRight > viewportRight) {
					absoluteLeft -= (absoluteRight - viewportRight);
				}
				if (absoluteBottom > viewportBottom) {
					absoluteTop -= (absoluteBottom - viewportBottom);
				}
				gMenu.css({
					left: absoluteLeft + "px",
					top: absoluteTop + "px"
				});
				gMenu.fadeIn("fast");
				return false;
			});
			gChildTriggers.hover(function () {
				var trigger = $(this);
				var menu = trigger.children("ul");
				var button = trigger.children("a");
				button.addClass("ui-state-default");
				var relativeLeft = trigger.outerWidth();
				var relativeTop = 0;
				var absoluteRight = trigger.offset().left + relativeLeft + menu.outerWidth();
				var absoluteBottom = trigger.offset().top + relativeTop + menu.outerHeight();
				var viewportRight = $(window).width() + $(window).scrollLeft();
				var viewportBottom = $(window).height() + $(window).scrollTop();
				if (absoluteRight > viewportRight) {
					relativeLeft = -1 * menu.outerWidth();
				}
				if (absoluteBottom > viewportBottom) {
					relativeTop = -1 * menu.outerHeight() + trigger.outerHeight();
				}
				menu.css({
					left: relativeLeft + "px",
					top: relativeTop + "px"
				});
				menu.fadeIn("fast");
			}, function () {
				var trigger = $(this);
				var menu = trigger.children("ul");
				var button = trigger.children("a");
				button.removeClass("ui-state-default");
				menu.fadeOut("fast");
			});
			gButtons.hover(function () {
				$(this).addClass("ui-state-hover");
			}, function () {
				$(this).removeClass("ui-state-hover");
			});
			$(document).click(function () {
				if (gMenu.is(":visible")) {
					gMenu.fadeOut("fast");
				}
			});
			return this;
		}
	});
})(jQuery);

