var LayoutConfiguration = {
	categories : [],
	initialized : false,
	loadingImage : null,
	menu : null,
	menuDiv : null,
	menuIframe : null,
	portlets : [],
	showTimer : 0,
	offsetMenu: true,

	init : function () {
		var instance = this;

		var menu = jQuery('#portal_add_content');

		instance.menu = menu;

		instance._isFreeform = themeDisplay.isFreeformLayout();

		if (menu.length) {
			var list = menu.childNodes;

			instance.menuDiv = menu.find('.portal-add-content');
			instance.menuIframe = menu.find('iframe');

			instance.portlets = menu.find('.lfr-portlet-item');
			instance.categories = menu.find('.lfr-content-category');
			instance.categoryContainers = menu.find('.lfr-add-content');

			instance.initialized = true;

			jQuery('#layout_configuration_content').trigger('focus').addClass('focus');
			jQuery('#layout_configuration_content').keyup(
				function(event) {
					instance.startShowTimer(event, this);
				}
			);
		}

		if (instance._isFreeform) {
			instance._grid = jQuery('body .freeform #column-1:first');
			instance._offsetL = instance._grid[0].offsetLeft;
			instance._offsetT = instance._grid[0].offsetTop;
		}
	},

	toggle : function (plid, ppid, doAsUserId) {
		var instance = this;

		if (!instance.menu) {
			var url = themeDisplay.getPathMain() + "/portal/render_portlet?p_l_id=" + plid + "&p_p_id=" + ppid + "&doAsUserId=" + doAsUserId + "&p_p_state=exclusive";

			var popupWidth = 250;

			if (instance.offsetMenu) {
				var body = jQuery('body');
				var originalPadding = body.css('padding-left');

				body.css('padding-left', popupWidth + 10);
			}

			var popup = Liferay.Popup({
				width: popupWidth,
				noCenter: true,
				title: Liferay.Language.get("add-application"),
				onClose: function() {
					instance.menu = null;

					if (instance.offsetMenu) {
						body.css('padding-left', originalPadding);
					}
				}
			});

			AjaxUtil.update(url, popup,
				{
					onComplete: function() {
						instance._loadContent();
					}
				}
			);
		}
	},

	searchField: function(event, obj) {
		var instance = this;

		var word = jQuery.trim(obj.value).toLowerCase();
		var portlets = instance.portlets;
		var categories = instance.categories;
		var categoryContainers = instance.categoryContainers;

		if (word != '*' && word.length) {
			word = word.match(/[a-zA-Z0-9]*/g).join("");
			portlets.hide();
			categories.hide();
			categoryContainers.hide();
			portlets.each(
				function(i) {
					var name = this.id.toLowerCase();
					if (name.indexOf(word) > -1) {
						var portlet = jQuery(this);
						portlet.show();
						portlet.parents('.lfr-content-category').addClass('visible').removeClass('hidden').show();
						portlet.parents('.lfr-add-content').addClass('expanded').removeClass('collapsed').show();
					}
				}
			);
		}
		else {
			if (!word.length) {
				categories.addClass('hidden').removeClass('visible').css('display', '');
				categoryContainers.addClass('collapsed').removeClass('expanded').css('display', '');
				portlets.css('display', '');
			}
			else if (word == '*') {
				categories.addClass('visible').removeClass('hidden');
				categoryContainers.addClass('expanded').removeClass('collapsed');
				portlets.show();
			}
		}
	},

	startShowTimer : function (event, obj) {
		var instance = this;

		if (instance.showTimer) {
			clearTimeout(instance.showTimer);
			instance.showTimer = 0;
		}

		instance.showTimer = setTimeout(
			function() {
				instance.searchField(event, obj);
			},
			250
		);
	},

	_loadContent: function() {
		var instance = this;

		instance.init();

		Liferay.Util.addInputType();
		Liferay.Util.addInputFocus();

		Liferay.Publisher.subscribe('closePortlet', instance._onPortletClose, instance);

		var clicked = false;

		var portlets = jQuery('.lfr-portlet-item');

		var options = {
			threshold: 10,
			onStart: function(s) {
				var event = s.browserEvent;
				var originalTarget = jQuery(event.originalTarget || event.srcElement);

				if (!originalTarget.is('a')) {
					Liferay.Columns._onStart(s);
				}
				else {
					clicked = true;

					var portlet = originalTarget.parents('.lfr-portlet-item:first');

					if (!portlet.is('.lfr-portlet-used')) {
						var plid = portlet.attr('plid');
						var portletId = portlet.attr('portletId');
						var isInstanceable = (portlet.attr('instanceable') == 'true');

						addPortlet(plid, portletId, themeDisplay.getDoAsUserIdEncoded());

						if (!isInstanceable) {
							portlet.addClass('lfr-portlet-used');
							portlet.unbind('mousedown');
						}
					}
				}

			},
			onMove: function(s) {
				if (!instance._isFreeform) {
					Liferay.Columns._onMove(s);
				}
			},
			onComplete: function(s) {
				if (!clicked) {
					var container = s.container;

					var plid = container.getAttribute('plid');
					var portletId = container.getAttribute('portletId');

					if (plid && portletId) {
						var portlet = jQuery(s.container);
						var isInstanceable = (container.getAttribute('instanceable') == 'true');
						var doAsUserId = themeDisplay.getDoAsUserIdEncoded();
						var portletBound = addPortlet(plid, portletId, doAsUserId, true);

						if (!isInstanceable) {
							if (portletBound) {
								portlet.addClass('lfr-portlet-used');
								portlet.unbind('mousedown');
							}
						}
						else {
							Liferay.Columns.add(portlet, options);
						}

						portlet.css(
							{
								top: 0,
								left: 0
							}
						);

						s.container = portletBound;

						var completed = Liferay.Columns._onComplete(s);

						if (!instance._isFreeform) {
							if (!completed) {
								if (isInstanceable) {
									portletId = portletBound.id;
									portletId = portletId.replace(/^p_p_id_(.*)_$/, '$1');
								}

								closePortlet(plid, portletId, doAsUserId, true);
							}
						}

						if (completed || instance._isFreeform) {
							portlet.Highlight(750, '#ffe98f');
						}

						if (instance._isFreeform) {
							var jPortlet = jQuery(portletBound);

							jPortlet.css(
								{
									left: (mousePos.x - instance._offsetL) + 'px',
									top: (mousePos.y - instance._offsetT) + 'px'
								}
							);
						}
					}
				}

				clicked = false;
			}
		};

		instance._layoutOptions = options;

		portlets.each(
			function() {
				if (this.className.indexOf('lfr-portlet-used') == -1) {
					Liferay.Columns.add(this, options);
				}
			}
		);

		if (Liferay.Browser.is_ie) {
			portlets.hover(
				function() {
					this.className += ' over';
				},
				function() {
					this.className = this.className.replace('over', '');
				}
			);
		}

		jQuery('.lfr-add-content > h2').click(
			function() {
				var heading = jQuery(this).parent();
				var category = heading.find('> .lfr-content-category');

				category.toggleClass('hidden').toggleClass('visible');
				heading.toggleClass('collapsed').toggleClass('expanded');
			}
		);
	},

	_onPortletClose: function(portletData) {
		var instance = this;

		var popup = jQuery('#portal_add_content');
		var item = popup.find('.lfr-portlet-item[@plid=' + portletData.plid + '][@portletId=' + portletData.portletId + '][@instanceable=false]');

		if (item.is('.lfr-portlet-used')) {
			item.removeClass('lfr-portlet-used')
			Liferay.Columns.add(item[0], instance._layoutOptions);
		}
	}
};