(function($) {
	var currentLayer = null;

	$(document).click(function(e) {
		if (currentLayer === null || !$.contains(currentLayer, e.target))
		{
			$(document).trigger('hideLayer', [ false ]);
			$(document).unbind('hideLayer');
		}
	});

	$.fn.lrworld_LayerToggler = function(localSettings) {
		this.each(function() {
			var $base = this;

			var settings = $.extend({
				'toggleElement': null,
				'toggleElementChildrenSelector': null,
				'toggleClassElement' : null,
				'toggleClass': 'open',
				'event': 'click'
			}, {'toggleElement': $(this)}, localSettings);

			if (settings.toggleElementChildrenSelector !== null)
			{
				settings.toggleElement = $($base).children(settings.toggleElementChildrenSelector);
			}

			if (settings.toggleElement === null ||
			    (jQuery.type(settings.toggleElement) === 'object' && settings.toggleElement.size() < 1))
			{
				return;
			}

			function open(eventTarget, attachHideLayerEvent)
			{
				$(document).trigger('hideLayer', [eventTarget]);

				$.data($base,'_layerTogglerStatus', 'open');

				settings.toggleElement.show();

				if (settings.toggleClassElement !== null)
					settings.toggleClassElement.addClass(settings.toggleClass);

				if (attachHideLayerEvent)
				{
					currentLayer = settings.toggleElement.get(0);
					$(document).bind('hideLayer', function(e, eventTarget) {
						if (!eventTarget || !$.contains(settings.toggleElement.get(0), eventTarget))
							close();
					});
				}
			};

			function close()
			{
				$.data($base,'_layerTogglerStatus', 'closed');

				settings.toggleElement.hide();

				if (settings.toggleClassElement !== null)
					settings.toggleClassElement.removeClass(settings.toggleClass);
			};

			if (settings.event === 'click')
			{
				$($base).click(function(e) {
					e.stopPropagation();

					if ($.data($base,'_layerTogglerStatus') === 'open')
						close();
					else
						open(e.target, true);
				});
			}
			else if (settings.event === 'hover')
			{
				$($base).hover(function(e) { open(e.target, false); }, close);
			}
		});
	};
})(jQuery);
