	//
	var flashInit = false;

/* 
   * 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.
   */
  var selLevel = "";
  var hideOpend = true; // true schließt offene auf Level0, wenn anderer auf Level0 geöffnet wird
  var aktMenuItem = "";
  var classSelected = "selected";
  
  
  function treeMenu_init(menu, data) {
    var array = new Array(0);
    if(data != null && data != "") {
      array = data.match(/\d+/g);
    }
  	menu = document.getElementById(menu);
	menuNodes = menu.childNodes
	for (var i = 0; i < menuNodes.length; i++) {
		if (menuNodes[i].nodeType == 1) {
			menuNodes[i].className = menuNodes[i].className + " level0"
		}
	}

    var items = menu.getElementsByTagName("li");
    for(var 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 angeclickten 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) {
  if (htmlObj != undefined) {
  	cT = htmlObj;
  } else {
		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();
		}
		cT = event.currentTarget;
	}

	
	if (aktMenuItem != "" && aktMenuItem.selected) {
		jscss("remove",aktMenuItem,classSelected)
	}
	aktMenuItem = cT.childNodes[2];
	jscss("add",aktMenuItem,classSelected);
	aktMenuItem.selected = true;

  	 // Lässt Willy loslaufen
	 if (!flashInit && aktMenuItem.href.indexOf("#") == -1) { 
  		setFlashVariables('swf_willy', 'action=lauf');
  		flashInit = true;
	}

    var array = treeMenu_getClasses(cT);
	if (hideOpend) {
		for(var i = 0; i < array.length; i++) {
			if(array[i] == "level0") {
				if (selLevel != cT) {
					var a = treeMenu_getClasses(selLevel);
					for(var i = 0; i < a.length; i++) {
			      		if(a[i] == "treeMenu_opened" ) {
			       			a[i] = "treeMenu_closed";
						}
			     	 }
					selLevel.className = a.join(" ");
				}	
			}
		}
	}
    for(var 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(menu) {
    menu = document.getElementById(menu);
	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(menu) {
	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");
		}
		jscss("remove",items[i].childNodes[2],classSelected);
	}
	aktMenuItem.selected = false;
	aktMenuItem = "";
  }
  /*
  	Öffnet Baum an bestimmter Stelle (t)
  */
	function treeMenu_openTree(menu, t, m) {
		var menu = document.getElementById(menu);
		var items = menu.getElementsByTagName("li");
		var item = items[t];
		treeMenu_handleClick('', item);
		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;
	}
}
