function findListItems( list ) {
	var allItems = list.getElementsByTagName('li');
	var listItems = Array();
	for( var a = 0; a < allItems.length; a++ ) {
		if( allItems[a].parentNode == list ) {
			listItems[listItems.length] = allItems[a];
		}
	}
	return listItems;
}

function makeExpandable( rootList ) {
	rootList.listItems = findListItems( rootList );
	var lists = rootList.getElementsByTagName('ul');
	for( var a = 0; a < lists.length; a++ ) {
		lists[a].rootList = rootList;
		lists[a].listItems = findListItems(lists[a]);
		lists[a].parentListItem = lists[a].parentNode;
		lists[a].parentNode.subList = lists[a];
		lists[a].parentListItem.expandable = true;
	}

	// Apply links
	var links = rootList.getElementsByTagName('a');
	for( var a = 0; a < links.length; a++ ) {
		Event.observe( links[a], 'click', function(event) {
			var element = event.element();
			toggleExpanded( this.parentNode );
			if( !element.href ) { Event.stop(event); }
		} );
	}

	// Contract all
	for( var a = 0; a < rootList.listItems.length; a++ ) {
		if( rootList.listItems[a].expandable ) {
			contractMenu( rootList.listItems[a] );
		}
		var lis = rootList.listItems[a].getElementsByTagName('li');
		for( var b = 0; b < lis.length; b++ ) {
			if( lis[b].expandable ) {
				contractMenu( lis[b] );
			}
		}
	}
}

function expandMenu( menuItem ) {
	if( menuItem.expandable ) {
		menuItem.expanded = true;
		Element.show( menuItem.subList );
	}
	// Parents need expanding too
	if( menuItem.parentNode.parentListItem && menuItem.parentNode.parentListItem.expandable ) {
		expandMenu( menuItem.parentNode.parentListItem );
	}
}

function contractMenu( menuItem ) {
	if( menuItem.expandable ) {
		menuItem.expanded = false;
		Element.hide( menuItem.subList );
	}
}

function toggleExpanded( menuItem ) {
	if( menuItem.expandable ) {
		if( menuItem.expanded ) {
			contractMenu( menuItem );
		} else {
			expandMenu( menuItem );
		}
	}
}

