/* ------------------------------------------------------------------------------------------------
 Treemenü

 Fügt den Listeneinträgen Eventhandler und CSS Klassen hinzu, um Menüpunkte am Anfang zu schließen.
 menu: Referenz auf die Liste.
-------------------------------------------------------------------------------------------------- */
var selLevel = "";
var hideOpend = true;	// true schließt offene auf Level0, wenn anderer auf Level0 geöffnet wird
var aktMenuItem = "";
var aktSubMenuItem = "";
var classSelected = "selected";
var classSelectedSub = "selectedSub";
  
function treeMenu_init(menu) 
{
    var array = new Array(0);
	var i = 0;
  	menu = document.getElementById(menu);
	menuNodes = menu.childNodes;
	
	// Elementknoten schließen
	for (i = 0; i < menuNodes.length; i++) 
	{
		if (menuNodes[i].nodeType == 1) // 1 = Elementknoten
		{
			menuNodes[i].className = menuNodes[i].className + " level0";
		}
	}

    var items = menu.getElementsByTagName("li");
    for (i = 0; i < items.length; i++) 
    {
		items[i].onclick = treeMenu_handleClick;
		if (!treeMenu_contains(treeMenu_getClasses(items[i]), "treeMenu_opened") && items[i].getElementsByTagName("ul").length + items[i].getElementsByTagName("ol").length > 0) 
		{
			var classes = treeMenu_getClasses(items[i]);
			if (array.length > 0 && array[0] == i) 
			{
				classes[classes.length] = "treeMenu_opened";
			}
			else
			{
				classes[classes.length] = "treeMenu_closed";
			}
			items[i].className = classes.join(" ");
			if (array.length > 0 && array[0] == i) 
			{
				array.shift();
			}
		}
	}
}

/* ------------------------------------------------------------------------------------------------
Ändert die Klasse eines angeklickten Listenelements, sodass geöffnete Menüpunkte geschlossen 
und geschlossene geöffnet werden.

event: Das Event Objekt, dass der Browser übergibt.
-------------------------------------------------------------------------------------------------- */
function treeMenu_handleClick(event, htmlObj) 
{
	var i = 0;
	if (htmlObj)
	{
   		cT = htmlObj;
	} 
	else 
	{
  		if (event == null || event == undefined) 
  		{	// 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();
		}
		cT = event.currentTarget;
	}
	
	// Menüeinträge aktivieren / deaktivieren
	if (treeMenu_contains(treeMenu_getClasses(cT), "level0") && cT.childNodes.length > 2) 
	{
		if (aktMenuItem !== "" && aktMenuItem.selected) 
		{
			jscss("remove",aktMenuItem,classSelected);
		}
		if (aktSubMenuItem !== "" && aktSubMenuItem.selected) {
			jscss("remove",aktSubMenuItem,classSelectedSub);
		}
		aktMenuItem = cT.childNodes[2]; // mit Schatten ! Ohne [0]		
		jscss("add",aktMenuItem,classSelected);
		aktMenuItem.selected = true;	
	} 
	else 
	{
		if (aktSubMenuItem !== "" && aktSubMenuItem.selected) 
		{
			jscss("remove",aktSubMenuItem,classSelectedSub);
		}
		aktSubMenuItem = cT.childNodes[0];
		jscss("add",aktSubMenuItem,classSelectedSub);
		aktSubMenuItem.selected = true;		
	}
	
    var array = treeMenu_getClasses(cT);
	if (hideOpend) 
	{
		for(i = 0; i < array.length; i++) 
		{
			if(array[i] == "level0") 
			{
				if (selLevel != cT) 
				{
					var a = treeMenu_getClasses(selLevel);
					for(i = 0; i < a.length; i++) {
			      		if(a[i] == "treeMenu_opened" ) 
			      		{
			       			a[i] = "treeMenu_closed";
						}
			     	 }
					selLevel.className = a.join(" ");
				}	
			}
		}
	}
    for(i = 0; i < array.length; i++) 
    {
      if(array[i] == "treeMenu_closed") 
      {
			array[i] = "treeMenu_opened";
      }
      else if (array[i] == "treeMenu_opened") 
      {
			array[i] = "treeMenu_closed";
      }
	  if (array[i] == "level0") 
	  {
  			selLevel = cT;
	  }
    }
	cT.className = array.join(" ");
 }

/* ------------------------------------------------------------------------------------------------
Gibt alle Klassen zurück, die einem HTML-Element zugeordnet sind.

element: Das HTML-Element
return: Die zugeordneten Klassen.
-------------------------------------------------------------------------------------------------- */
function treeMenu_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 treeMenu_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 treeMenu_store(id) 
{
	menu = document.getElementById(id);
	var result = new Array();
	var items = menu.getElementsByTagName("li");
	for (var i = 0; i < items.length; i++) 
	{
		if (treeMenu_contains(treeMenu_getClasses(items[i]), "treeMenu_opened")) 
		{
			result.push(i);
		}
	}
	return result.join(" ");
}  

/* ------------------------------------------------------------------------------------------------
Schließt den Baum komplett
-------------------------------------------------------------------------------------------------- */
function treeMenu_restore(id) 
{
	var menu = document.getElementById('menu');
	var items = menu.getElementsByTagName("li");
	for (var i = 0; i < items.length; i++) {
		if (treeMenu_contains(treeMenu_getClasses(items[i]), "treeMenu_opened")) 
		{
			jscss("swap", items[i], "treeMenu_opened", "treeMenu_closed");
		}
	}
	if (aktMenuItem !== "" && aktSubMenuItem !== "") 
	{
		jscss("remove",aktMenuItem,classSelected);
		jscss("remove",aktSubMenuItem,classSelectedSub);
	}
	aktMenuItem.selected = false;
	aktSubMenuItem.selected = false;
	aktMenuItem = "";
	aktSubMenuItem = "";
}

/* ------------------------------------------------------------------------------------------------
Öffnet Baum an bestimmter Stelle (t) und (m) für zweite Ebene
-------------------------------------------------------------------------------------------------- */
function treeMenu_openTree(id, t, m) 
{
	var menu = document.getElementById(id);
	var items = menu.getElementsByTagName("li");
	if (t >= 0)
	{
		var item = items[t];
		treeMenu_handleClick('', item);
	}
	
	if (m > 0)
	{
		item = items[m];
		treeMenu_handleClick('', item);
	}
}

/* ------------------------------------------------------------------------------------------------
Klassen per JavaScript hinzufügen
Ändern, tauschen, löschen von Styleklassen
a: Aktion 
	"swap": tauscht c1 gegen c2
	"add": fügt c1 hinzu
	"remove": löscht c1
	"check": prüft, ob Klasse c1 schon dem Objekt o hinzugefügt wurde und gibt true oder false zurück
o: Objekt
c1: Name Klasse1
c2: Name Klasse2
-------------------------------------------------------------------------------------------------- */
function jscss(a,o,c1,c2) 
{
	switch (a)
	{
		case 'swap':
			o.className=!jscss('check',o,c1)?o.className.replace(c2,c1):o.className.replace(c1,c2);
			break;
		case 'add':
			if (!jscss('check',o,c1)) {o.className+=o.className?' '+c1:c1;}
			break;
		case 'remove':
			var rep=o.className.match(' '+c1)?' '+c1:c1;
			o.className=o.className.replace(rep,'');
			break;
		case 'check':
			return new RegExp('\\b'+c1+'\\b').test(o.className);
			break;
	}	
}