/*
* Fügt den Listeneinträgen Eventhandler und CSS Klassen hinzu,
* um die Menüpunkte am Anfang zu schließen.
*
* menu: Referenz auf die Liste.
* data: String, der die Nummern aufgeklappter Menüpunkte enthält.
*/
function menu_init(menu, data)
{
	var array = new Array(0);
	if(data != null && data != "")
	{
		array = data.match(/\d+/g);
	}
	var items = menu.getElementsByTagName("li");
	for(var i = 0; i < items.length; i++)
	{
		items[i].onclick = menu_handleClick;
		if(!menu_contains(menu_getClasses(items[i]), "menu_opened") && items[i].getElementsByTagName("ul").length + items[i].getElementsByTagName("ol").length > 0)
		{
			var classes = menu_getClasses(items[i]);
			if(array.length > 0 && array[0] == i)
			{
				classes.push("menu_opened")
			}
			else
			{
				classes.push("menu_closed")
			}
			items[i].className = classes.join(" ");
			if(array.length > 0 && array[0] == i)
			{
				array.shift();
			}
		}
	}
}

/*
* Ändert die Klasse eines angeclickten Listenelements, sodass
* geöffnete Menüpunkte geschlossen und geschlossene geöffnet
* werden.
*
* event: Das Event Objekt, dass der Browser übergibt.
*/
function menu_handleClick(event)
{
	if(event == null)	// Workaround für die fehlenden DOM Eigenschaften im IE
	{
		event = window.event;
		event.currentTarget = event.srcElement;
		while(event.currentTarget.nodeName.toLowerCase() != "li")
		{
			event.currentTarget = event.currentTarget.parentNode;
		}
		event.cancelBubble = true;
	}
	else
	{
		event.stopPropagation();
	}
	var array = menu_getClasses(event.currentTarget);
	for(var i = 0; i < array.length; i++)
	{
		if(array[i] == "menu_closed")
		{
			array[i] = "menu_opened";
		}
		else if(array[i] == "menu_opened")
		{
			array[i] = "menu_closed"
		}
	}
	event.currentTarget.className = array.join(" ");
}

/*
* Gibt alle Klassen zurück, die einem HTML-Element zugeordnet sind.
*
* element: Das HTML-Element
* return: Die zugeordneten Klassen.
*/
function menu_getClasses(element)
{
	if(element.className)
	{
		return element.className.match(/[^ \t\n\r]+/g);
	}
	else
	{
		return new Array(0);
	}
}

/*
* Überprüft, ob ein Array ein bestimmtes Element enthält.
*
* array: Das Array
* element: Das Element
* return: true, wenn das Array das Element enthält.
*/
function menu_contains(array, element)
{
	for(var i = 0; i < array.length; i++)
	{
		if(array[i] == element)
		{
			return true;
		}
	}
	return false;
}

/*
* Gibt einen String zurück, indem die Nummern aller geöffneten
* Menüpunkte stehen.
*
* menu: Referenz auf die Liste
* return: Der String
*/
function menu_store(menu)
{
	var result = new Array();;
	var items = menu.getElementsByTagName("li");
	for(var i = 0; i < items.length; i++)
	{
		if(menu_contains(menu_getClasses(items[i]), "menu_opened"))
		{
			result.push(i);
		}
	}
	return result.join(" ");
}