var ExpandableLists = {
	init:function(config){
		if(!config || !config.ListID)return;
		config.TitleTag = config.TitleTag || "h2";
		config.BodyTag = config.BodyTag || "div";
		config.ExpandAllText = config.ExpandAllText || "Expand All";
		config.CollapseAllText = config.CollapseAllText || "Collapse All";
		config.ExpandClass = config.ExpandClass || "collapsed";
		config.CollapseClass = config.CollapseClass || "expanded";
		config.DisableExpandAll = config.DisableExpandAll || false;
		config.StartExpanded = config.StartExpanded || false;
		var list = document.getElementById(config.ListID);
		if(!list)return;
		list.style.listStyle = "none";
		var lis = list.getElementsByTagName("li");
		var getListElement = function(li,tag){if(li&&li.getElementsByTagName&&li.getElementsByTagName(tag).length)return li.getElementsByTagName(tag)[0];return null;};
		var expand = function(li){var t = getListElement(li,config.TitleTag);var b = getListElement(li,config.BodyTag);expandElement(t,b);};
		var collapse = function(li){var t = getListElement(li,config.TitleTag);var b = getListElement(li,config.BodyTag);collapseElement(t,b);};
		var expandElement = function(t,b){if(!t||!b)return;switchClass(t,config.ExpandClass,config.CollapseClass);switchClass(b,config.ExpandClass,config.CollapseClass);b.style.display = "block";};
		var collapseElement = function(t,b){if(!t||!b)return;switchClass(t,config.CollapseClass,config.ExpandClass);switchClass(b,config.CollapseClass,config.ExpandClass);b.style.display = "none";};
		var switchClass = function(el,oldClass,newClass){if(!el)return;var re = new RegExp("\\b"+oldClass+"\\b","g");el.className = el.className.replace(re," ");el.className = el.className.replace(/\s+/g," ");el.className += " " + newClass;el.className = el.className.replace(/^\s*|\s*$/g,"");};
		var toggleState = function(){var t = this.parentNode.getElementsByTagName(config.TitleTag)[0];var b = this.parentNode.getElementsByTagName(config.BodyTag)[0];if(b.style.display=="block")collapseElement(t,b);else expandElement(t,b);};
		var expandAllButton = function(){this.firstChild.nodeValue=config.CollapseAllText;switchClass(this,config.ExpandClass,config.CollapseClass);this.onclick=collapseAllButton;expandAll();};
		var collapseAllButton = function(){this.firstChild.nodeValue=config.ExpandAllText;switchClass(this,config.CollapseClass,config.ExpandClass);this.onclick=expandAllButton;collapseAll();};
		var expandAll = function(){for(var i=0;lis.length>i;i++)expand(lis[i]);};
		var collapseAll = function(){for(var i=0;lis.length>i;i++)collapse(lis[i]);};
		list.ExpandableListsConfig={};
		list.ExpandableListsConfig = config;
		if(!config.DisableExpandAll){
			var p = document.createElement("div");
			p.style.padding = "1ex";
			var all = document.createElement(config.TitleTag);
			all.appendChild(document.createTextNode(config.ExpandAllText));
			all.onclick = expandAllButton;
			all.className = config.ExpandClass;
			p.appendChild(all);
			list.parentNode.insertBefore(p,list);
		}
		for(var i=0;lis.length>i;i++)if(getListElement(lis[i],config.TitleTag))getListElement(lis[i],config.TitleTag).onclick=toggleState;
		(!config.StartExpanded)?collapseAll():expandAll();}};
