Array.prototype.indexOf = IndexOf;
//Toggles between two classes for an element
function ToggleClass(element, firstClass, secondClass, event)
{event.cancelBubble = true;
var classes = element.className.split(" ");
var firstClassIndex = classes.indexOf(firstClass);
var secondClassIndex = classes.indexOf(secondClass);
if (firstClassIndex == -1 && secondClassIndex == -1)
{classes[classes.length] = firstClass;}
else if (firstClassIndex != -1)
{classes[firstClassIndex] = secondClass;}
else{classes[secondClassIndex] = firstClass;}
element.className = classes.join(" ");}
//Finds the index of an item in an array
function IndexOf(item)
{for (var i=0; i < this.length; i++)
{if (this[i] == item)
{return i;}}
return -1;}
//The toggle event handler for each expandable/collapsable node
//- Note that this also exists to prevent any IE memory leaks 
//(due to circular references caused by this)
function ToggleNodeStateHandler(event)
{ToggleClass(this, "collapsed", "expanded", (event == null) ? window.event : event);}
//Prevents the onclick event from bubbling up to parent elements
function PreventBubbleHandler(event)
{if (!event) event = window.event;
event.cancelBubble = true;}
//Adds the relevant onclick handlers for the nodes in the tree view
function SetupTreeView(elementId)
{var tree = document.getElementById(elementId);
var treeElements = tree.getElementsByTagName("li");
for (var i=0; i < treeElements.length; i++)
{if (treeElements[i].getElementsByTagName("ul").length > 0)
{treeElements[i].onclick = ToggleNodeStateHandler; }
else{treeElements[i].onclick = PreventBubbleHandler; }}}