Liferay.Dock = {
	init: function() {
		var instance = this;

		var dock = jQuery('.lfr-dock');

		if (!dock.is('.interactive-mode')) {
			return;
		}

		dock.addClass('lfr-component');

		var dockList = dock.find('.lfr-dock-list');

		if (dockList.length > 0) {
			var myPlaces = jQuery('.my-places', dock);

			Liferay.Util.createFlyouts(
				{
					container: dockList[0],
					mouseOver: function(event) {
						if (this.className.indexOf('my-places') > -1) {
							jQuery('.current-community > ul', this).show();
						}
						else if (this.parentNode.className.indexOf('taglib-my-places') > -1) {
							jQuery('ul', this.parentNode).hide();
							jQuery('> ul', this).show();
						}
					}
				}
			);

			dockList.find('li:first-child, a:first-child').addClass('first');
			dockList.find('li:last-child, a:last-child').addClass('last');

			instance._dock = dock;
			instance._dockList = dockList;
			instance._myPlaces = myPlaces;

			dockList.hide();
			dockList.wrap('<div class="lfr-dock-list-container"></div>');

			var dockDefaults = {
				cursor: 'pointer',
				zIndex: Liferay.zIndex.DOCK
			};

			instance._setPosition(dock, dockDefaults);

			var dockOver = function(event) {
				instance._setCloser();
				instance._toggle('show');
			};

			var dockOut = function(event) {
				instance._toggle('hide');
			};

			dock.hoverIntent(
				{
					interval: 0,
					out: dockOut,
					over: dockOver,
					timeout: 500
				}
			);

			if (Liferay.Browser.isIe() && Liferay.Browser.getMajorVersion() <= 6) {
				myPlaces.find('> ul').css('zoom', 1);
			}

			var dockParent = dock.parent();

			var dockParentDefaults = {
				position: 'relative',
				zIndex: Liferay.zIndex.DOCK_PARENT
			};

			instance._setPosition(dockParent, dockParentDefaults);

			instance._handleDebug();
		}
	},

	_setPosition: function(obj, defaults) {
		var instance = this;

		var settings = defaults;

		if (!obj.is('.ignore-position')) {
			var position = obj.css('position');
			var zIndex = obj.css('z-index');
			var isStatic = !/absolute|relative|fixed/.test(position);

			if (zIndex == 'auto' || zIndex == 0) {
				zIndex = defaults.zIndex;
			}

			// The position is static, but use top/left positioning as a trigger

			if (isStatic) {
				position = defaults.position;

				var top = parseInt(obj.css('top'));

				if (Liferay.Browser.isSafari() && isNaN(top)) {
					top = -1;
				}

				if (!isNaN(top) && top != 0) {
					position = '';
					zIndex = '';
				}
			}

			settings = jQuery.extend(
				defaults,
				{
					position: position,
					zIndex: zIndex
				}
			);
		}

		obj.css(settings);

		return settings;
	},

	_handleDebug: function() {
		var instance = this;

		var dock = instance._dock;
		var dockList = instance._dockList;
		var myPlacesList = instance._myPlaces.find('> ul');

		if (dock.is('.debug')) {
			dock.show();
			dockList.show();
			dockList.addClass('expanded');
		}
	},

	_setCloser: function() {
		var instance = this;

		if (!instance._hovered) {
			jQuery(document).one(
				'click',
				function(event) {
					var currentEl = jQuery(event.target);
					var dockParent = currentEl.parents('.lfr-dock');

					if ((dockParent.length == 0) && !currentEl.is('.lfr-dock')) {
						instance._toggle('hide');
						instance._hovered = false;
					}
				}
			);

			instance._hovered = true;
		}
	},

	_toggle: function(state) {
		var instance = this;

		var dock = instance._dock;
		var dockList = instance._dockList;

		if (state == 'hide') {
			dockList.hide();
			dock.removeClass('expanded');
		}
		else if (state == 'show') {
			dockList.show();
			dock.addClass('expanded');
		}
		else {
			dockList.toggle();
			dock.toggleClass('expanded');
		}
	}
};