Liferay.Menu = new Liferay.Class(
	{
		initialize: function() {
			var instance = this;

			if (!arguments.callee._hasRun) {
				arguments.callee._hasRun = true;

				instance._window = jQuery(window);
				instance._active = {
					menu: null,
					trigger: null
				};

				if (Liferay.Layout && Liferay.Layout.Columns.sortColumns) {
					Liferay.Layout.Columns.sortColumns.bind(
						'sortstart.sortable',
						function(event) {
							instance._closeActiveMenu();
						}
					);
				}

				jQuery(window).bind(
					'resize',
					function(event) {
						instance._positionActiveMenu();
					}
				);

				jQuery(document).bind(
					'click.liferay',
					function(event) {
						var target = jQuery(event.target);
						var cssClass = (event.target.className || '');
						var isTrigger = (cssClass.indexOf('lfr-actions') > -1);
						var trigger = [];

						if (!isTrigger) {
							trigger = target.parents('.lfr-actions');
						}
						else {
							trigger = target;
						}

						if (trigger.length) {
							var menu = trigger.data('lfr-menu-list');

							if (!menu) {
								var list = trigger.find('ul:first');
								list.find('li:last-child').addClass('last');

								menu = jQuery('<div class="lfr-component lfr-menu-list" />');
								menu.append(list);
								menu.appendTo('body');
								menu.hide();

								Liferay.Util.createFlyouts(
									{
										container: menu[0]
									}
								);

								trigger.data('lfr-menu-list', menu);
							}

							if (instance._active.menu && instance._active.menu[0] != menu[0]) {
								instance._closeActiveMenu();
							}

							if (menu.is(':visible')) {
								instance._closeActiveMenu();
							}
							else {
								instance._active.menu = menu;
								instance._active.trigger = trigger;

								instance._positionActiveMenu();
							}

							return false;
						}

						instance._closeActiveMenu();
					}
				);
			}
		},

		_closeActiveMenu: function() {
			var instance = this;

			if (instance._active.menu) {
				instance._active.menu.hide();
				instance._active.menu = null;

				instance._active.trigger.removeClass('visible');
				instance._active.trigger = null;
			}
		},

		_positionActiveMenu: function() {
			var instance = this;

			var menu = instance._active.menu;
			var trigger = instance._active.trigger;

			if (menu) {
				var offset = trigger.offset();
				offset.position = 'absolute';

				cssClass = trigger.attr('class');

				var direction = 'auto';
				var vertical = 'bottom';
				var win = instance._window;

				if (cssClass.indexOf('right') > -1) {
					direction = 'right';
				}
				else if (cssClass.indexOf('left') > -1) {
					direction = 'left';
				}

				var menuHeight = menu.height();
				var menuWidth = menu.width();

				var triggerHeight = trigger.outerHeight();
				var triggerWidth = trigger.outerWidth();

				var menuTop = menuHeight + offset.top;
				var menuLeft = menuWidth + offset.left;
				var scrollTop = win.scrollTop();
				var scrollLeft = win.scrollLeft();

				var windowHeight = win.height() + scrollTop;
				var windowWidth = win.width() + scrollLeft;

				if (direction == 'auto') {
					if (menuTop > windowHeight
						&& !((offset.top - menuHeight) < 0)) {

						offset.top -= menuHeight;
					}
					else {
						offset.top += triggerHeight;
					}

					if ((menuLeft > windowWidth || ((menuWidth/2) + offset.left) > windowWidth/2)
						&& !((offset.left - menuWidth) < 0)) {

						offset.left -= (menuWidth - triggerWidth);
					}
				}
				else {
					if (direction == 'right') {
						offset.left -= (menuWidth - 2);
					}
					else if (direction == 'left') {
						offset.left += (triggerWidth + 2);
					}

					offset.top -= (menuHeight - triggerHeight);
				}

				menu.css(offset);
				menu.show();

				trigger.addClass('visible');

				instance._active = {
					menu: menu,
					trigger: trigger
				};
			}
		}
	}
);