this.listexpander = function()
{

	// edit

	var expandTo = 1; // level up to which you want your lists to be initially expanded. 1 is minimum
	var expandText = "Expand All"; // text for expand all button
	var collapseText = "Collapse All"; // text for collapse all button
	var listClass = "listexpander" // class name that you want to assign to list(s). If you wish to change it make sure to update the css file as well

	// end edit (do not edit below this line)

	//this gets all of the ul elements from the document, finds the 'listexpander' and starts create

	this.start = function()
	{
		var ul = document.getElementsByTagName("ul");

		for (var i=0;i<ul.length;i++)
		{
			if(ul[i].className == listClass)
			{
				create(ul[i]);
			};
		};
	};

	this.create = function(list)
	{
		var items = list.getElementsByTagName("li");

		for(var i=0;i<items.length;i++)
		{
			listItem(items[i]);
		};
	};

	this.listItem = function(li)
	{
		if(li.getElementsByTagName("ul").length > 0 && li.getElementsByTagName("input").length > 0)
		{
			var ul = li.getElementsByTagName("ul")[0];
			var input = li.getElementsByTagName("input")[0];

			if (!ul.style.display)
			  ul.style.display = (depth(ul) <= expandTo) ? "block" : "none";   //block = visible

			if (!li.className)
			  li.className = (depth(ul) <= expandTo) ? "expanded" : "collapsed";

			li.over = true;

			ul.onmouseover = function() {li.over = false;}
			ul.onmouseout = function() {li.over = true;}
			input.onmouseover = function() {li.over = false;}
			input.onmouseout = function() {li.over = true;}

			if (!input.onclick)
			   input.onclick = function() {checker(li,input.checked);}

			li.onclick = function()
			{
				if(this.over)
				{
					ul.style.display = (ul.style.display == "none") ? "block" : "none";
					this.className = (ul.style.display == "none") ? "collapsed" : "expanded";
				};

			};
		};
	};

	this.depth = function(obj)
	{
		var level = 1;

		while(obj.parentNode.className != listClass)
		{
			if (obj.tagName == "UL") level++;
			obj = obj.parentNode;
		};

		return level;
	};

	function checker(obj,bool)
	{
		var uls = obj.getElementsByTagName("ul");

		if(uls.length > 0)
		{
			var item = uls[0];
			var list = item.getElementsByTagName("li");

			for(var i=0; i<list.length ;i++)
			{
				var lis = list[i];
				if(lis.getElementsByTagName("input").length > 0)
				{
					var poop = lis.getElementsByTagName( "input" )[0];
					poop.checked = bool;
					checker( lis, bool );
				};
			};
		};
	};

	start();

};

function updateCheckedField(element_id, current )
{

  var current_element_id  = document.getElementById(current).value;

  if (current_element_id)
  {
    document.getElementById(current_element_id).checked = false;
  }

  document.getElementById(current).value = element_id;

}

window.onload = listexpander;