
var treeController = {

	blankIcon : "blank.gif",

	shouldCollapseOther:	true,

	onClick:	function ( e )
	{
		if ( !e )
			e = window.event;
		var el = e.target || e.srcElement;
		if ( el.className == "expand-icon" )
			treeController.toggleItem( el.parentNode );
		else if ( treeController.hasClassName( this, "tree-folder-open" ) )
			treeController.setExpanded( this, false );
		else if ( treeController.hasClassName( this, "tree-folder-closed" ) )
			treeController.setExpanded( this, true );
		if ( e.stopPropagation )
			e.stopPropagation();
		e.cancelBubble = true;
	},

	addExpandIcons:	function ( treeEl )
	{
		var lis = treeEl.getElementsByTagName( "li" );
		var l = lis.length;
		for ( var i = 0; i < l; i++ )
		{
			//if ( this.hasChildren( lis[i] ) )
				this.addExpandIcon( lis[i] );
		}
	},

	addExpandIcon:	function ( el )
	{
		var img = document.createElement( "img" );
		img.className = "expand-icon";
		img.src = this.blankIcon;
		el.insertBefore( img, el.firstChild );
		el.onclick = this.onClick;
	},

	hasChildren:	function ( el )
	{
		for ( var c = el.firstChild; c != null; c = c.nextSibling )
		{
			if ( c.nodeName.toLowerCase() == "ul" )
				return true;
		}
		return false;
	},

	init:			function ()
	{
		var uls = document.getElementsByTagName( "ul" );
		var l = uls.length;
		for ( var i = 0; i < l; i++ )
		{
			if ( /(^|\s+)tree($|\s+)/.test( uls[i].className ) )
				this.initTree( uls[i] );
		}
	},

	initTree:		function ( el )
	{
		var lis = el.getElementsByTagName( "li" );
		var l = lis.length;
		for ( var i = 0; i < l; i++ )
		{
			if ( this.hasChildren( lis[i] ) )
			{
				if ( !this.hasClassName( lis[i], "tree-folder-open" ) )
					this.updateClassName( lis[i], "tree-folder-closed" );
				else
					this.updateClassName( lis[i], "tree-folder-open" );
			}
			else
				this.updateClassName( lis[i], "tree-item" );
			this.addExpandIcon( lis[i] );
		}
	},

	hasClassName:	function ( el, s )
	{
		return RegExp( "(^|\\s+)" + s + "($|\\s+)" ).test( el.className );
	},

	updateClassName:	function ( el, s )
	{
		//replace old
		var cn = el.className;
		cn = cn.replace( /(^|\s+)(tree-item|tree-folder-open|tree-folder-closed)($|\\s+)/g, "$1$3" );
		el.className = cn + " " + s;
	},

	getExpanded:		function ( el )
	{
		return this.hasClassName( el, "tree-folder-open" );
	},

	setExpanded:		function ( el, b )
	{
		if ( this.hasClassName( el, "tree-item" ) )
			return;
		if ( b && this.hasClassName( el, "tree-folder-closed" ) )
			this.updateClassName( el, "tree-folder-open" );

		else if ( !b && this.hasClassName( el, "tree-folder-open" ) )
			this.updateClassName( el, "tree-folder-closed" );

		if ( b && this.shouldCollapseOther )
			this.collapseOther( el );
	},

	toggleItem:			function ( el )
	{
		this.setExpanded( el, !this.getExpanded( el ) );
	},

	collapseOther:	function ( el )
	{
		var p = el.parentNode;
		for ( var n = p.firstChild; n != null; n = n.nextSibling )
		{
			if ( n != el )
				this.setExpanded( n, false );
		}

		// don't go past root
		if ( this.hasClassName( p, "tree" ) )
			return;

		this.collapseOther( p.parentNode );
	},

	addOnload:	function ()
	{
		if ( window.addEventListener )
			window.addEventListener( "load", function () { treeController.init() }, false );
		else if ( window.attachEvent )
			window.attachEvent( "onload", function () { treeController.init() } );
	}
};

treeController.addOnload();

