﻿(function ($)
{
	$.fn.collapsiblePaneList = function (options)
	{
		var defaults = {
			expandStyle: 'expanded',
			collapseStyle: 'collapsed',
			defaultStates: null
		};
		var options = $.extend(defaults, options);

		var defaultStates = null;

		var panes = this.each(function ()
		{
			var pane = $(this);

			if (pane.data("isCollapsiblePane") == true)
			{
				return true;
			}

			InitializeStates($('li', pane).length, pane);

			$('li', pane).each(function (index)
			{
				var state = GetDefaultState(index);
				var style = GetStyleForState(state);

				var content = $(this).find("h1").html();

				$(this).find("h1").remove();
				$(this).prepend("<div class='collapsible-pane-title " + style + "'><span style='float: left;'>" + content + "</span></div>");
				$(this).find(".collapsible-pane-title").append("<div class='state-indicator' style='float: right;'></div><br style='clear: both;' />");

				if (!Number(state))
				{
					$(this).find(".collapsible-pane-content").hide();
				}

				$(this).find(".collapsible-pane-title").data("expanded", state).click(ToggleCollapsiblePane);
			});

			pane.data("isCollapsiblePane", true);
		});

		function ToggleCollapsiblePane()
		{
			var titleBar = $(this);

			$('.collapsible-pane-content', titleBar.parent()).slideToggle('fast');

			titleBar.data("expanded", !Number(titleBar.data("expanded")));

			UpdateVisibleState(titleBar);
			SaveState(titleBar.parent().parent());
		}

		function UpdateVisibleState(titleBar)
		{
			var state = IsExpanded(titleBar) ? options.expandStyle : options.collapseStyle;

			titleBar.removeClass(options.expandStyle + " " + options.collapseStyle).addClass(state);
		}

		function IsExpanded(titleBar)
		{
			return titleBar.data("expanded");
		}

		function GetStyleForState(state)
		{
			return Number(state) ? options.expandStyle : options.collapseStyle;
		}

		function GetDefaultState(index)
		{
			if (defaultStates.length > index)
				return defaultStates[index]

			return 0;
		}

		function InitializeStates(len, pane)
		{
			defaultStates = new Array();
			var stateCookie = getCookie(pane.attr("id") + "_state");

			if (stateCookie != null)
			{
				var values = stateCookie.split(",");
				len = values.length;
				while (len-- >= 0)
				{
					defaultStates[len] = values[len];
				}
			}
			else if (options.defaultStates != null)
			{
				var values = options.defaultStates.split(",");
				len = values.length;
				while (len-- >= 0)
				{
					defaultStates[len] = values[len];
				}
			}
			else if (defaultStates == null)
			{
				while (len-- >= 0)
				{
					defaultStates[len] = 1;
				}
			}
		}

		function SaveState(pane)
		{
			var state = "";
			var states = new Array();

			$('li', pane).each(function (index)
			{
				var titleBar = $(this).find(".collapsible-pane-title");

				states.push(Number(titleBar.data("expanded")));
			});

			state = states.join(",");

			setCookie(pane.attr("id") + "_state", state, null, "/");
		}

		return panes;
	};
})(jQuery);

