Liferay.Menu = new 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
			};
		}
	}
});