function treeMenu_init(menu, data, openSingleNode) {
  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 = 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.push("treeMenu_opened")
      }
      else {
        classes.push("treeMenu_closed")
      }
      items[i].className = classes.join(" ");
    }
    if(array.length > 0 && array[0] == i) {
      array.shift();
    }
// ANFANG
    if(openSingleNode) {
      var classes = treeMenu_getClasses(items[i].parentNode);
      if(!treeMenu_contains(classes, "treeMenu_openSingleNode")) {
        classes.push("treeMenu_openSingleNode");
        items[i].parentNode.className = classes.join(" ");
      }
    }
// ENDE
  }
}

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;
  }

function treeMenu_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 = treeMenu_getClasses(event.currentTarget);

// ANFANG

if(treeMenu_contains(treeMenu_getClasses(event.currentTarget.parentNode), "treeMenu_openSingleNode") && treeMenu_contains(array, "treeMenu_closed")) {
    for(var i = 0; i < event.currentTarget.parentNode.childNodes.length; i++) {
      var element = event.currentTarget.parentNode.childNodes[i];
      if(element.nodeName.toLowerCase() == "li" && element != event.currentTarget){
        var array2 = treeMenu_getClasses(element);
        for(var j = 0; j < array2.length; j++) {
          if(array2[j] == "treeMenu_opened") {
            array2[j] = "treeMenu_closed";
          }
        }
        element.className = array2.join(" ");
      }
    }
  }
// ENDE
  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"
    }
  }
  event.currentTarget.className = array.join(" ");
}
