var menuId = "menu";
var sprachenId = "sprachen";
var leisteId = "leiste";
var titelId = "titel";
var inhaltId = "inhalt";
var infoId = "info";
var hash = "";              // "E;12;Nimic;Bun;Aici
var geschichte = Array();
var geschichteIndex = -1;

var indent = 16;  // citi pixeli face la dreapta
var AjaxRequest = null;

function nodeIndex(node) {
  var menu = document.getElementById(menuId);
  var divs = menu.getElementsByTagName("div");

  var found = false;
  var t = 0;
  while ((t < divs.length) && (!found)) {
    if (node == divs[t]) {
      found = true;
    };
    t++;
  }
  return t - 1;
}

function getNode(index) {
  var menu = document.getElementById(menuId);
  var divs = menu.getElementsByTagName("div");
  return divs[index];
}

function firstNode() {
  var menu = document.getElementById(menuId);
  var divs = menu.getElementsByTagName("div");
  return divs[0];
}

function subnodes(node) {
  var menu = document.getElementById(menuId);
  var divs = menu.getElementsByTagName("div");
  var level = parseInt(node.getAttribute("level"));

  var found = false;
  var t = 0;
  while ((t < divs.length) && (!found)) {
    if (node == divs[t]) {
      found = true;
    };
    t++;
  };
  var index = t - 1;  // indexul lui node

  var subs = Array();
  var lev;
  var u = 0;
  var ok = true;
  while ((t < divs.length) && ok) {
    lev = parseInt(divs[t].getAttribute("level"));
    if (lev >= (level + 1)) {
      if (lev == (level + 1)) {
        subs[u] = divs[t];
        u++;
      };
    } else {
      ok = false;
    };
    t++;
  };
  return subs;  
}

function hasSubnodes(node) {
  var subs = subnodes(node);
  if (subs.length > 0) {
    return true;
  } else {
    return false;
  };
}

function showNode(node) {
  var subs = subnodes(node);
  if (node.className == "visible") {
    if (node.getAttribute("open") == "true") {
      for (var t = 0; t < subs.length; t++) {
        subs[t].className = "visible";
        showNode(subs[t]);
      };
    } else {  // closed
      for (var t = 0; t < subs.length; t++) {
        subs[t].className = "invisible";
        showNode(subs[t]);
      };
    };
  } else {  // invisible
    for (var t = 0; t < subs.length; t++) {
      subs[t].className = "invisible";
      showNode(subs[t]);
    };
  };
}

function switchNode(node) {
  if (node.getAttribute("open") == "false") {
    node.setAttribute("open", "true");
  } else {
    node.setAttribute("open", "false");
  };
  showNode(node);
}

function toggleNode() {
  switchNode(this);
  setIndex(nodeIndex(this));
}

function clickNode() {
  setIndex(nodeIndex(this));
}

function createMenu() {
  var menu = document.getElementById(menuId);
  var divs = menu.getElementsByTagName("div");
  for (var t = 0; t < divs.length; t++) {
    divs[t].setAttribute("open", "false");
    divs[t].style.left = indent * parseInt(divs[t].getAttribute("level")) + "px";
    divs[t].style.width = "165px";
    if (divs[t].getAttribute("level") == "0") {
      divs[t].className = "visible";
    } else {
      divs[t].className = "invisible";
    };
    if (hasSubnodes(divs[t])) {
      divs[t].innerHTML = divs[t].innerHTML + "&#133;";
      divs[t].onclick = toggleNode;
    } else {
      divs[t].onclick = clickNode;
    };
  };
}

if (window.addEventListener) {
  window.addEventListener("load", load, false)
} else { if (window.attachEvent) {
  window.attachEvent("onload", load)
}};

function expandNode(node) {
  if (node.getAttribute("open") == "false") {
    node.setAttribute("open", "true");
  };
  var subs = subnodes(node);
  for (var t = 0; t < subs.length; t++) {
    expandNode(subs[t]);
  };
  showNode(node);
}

function collapseNode(node) {
  if (node.getAttribute("open") == "true") {
    node.setAttribute("open", "false");
  };
  var subs = subnodes(node);
  for (var t = 0; t < subs.length; t++) {
    collapseNode(subs[t]);
  };
  showNode(node);
}

function expandAll() {
  var menu = document.getElementById(menuId);
  var divs = menu.getElementsByTagName("div");
  for (var t = 0; t < divs.length; t++) {
    if (divs[t].getAttribute("level") == "0") {
      expandNode(divs[t]);
    };
  };
}

function collapseAll() {
  var menu = document.getElementById(menuId);
  var divs = menu.getElementsByTagName("div");
  for (var t = 0; t < divs.length; t++) {
    if (divs[t].getAttribute("level") == "0") {
      collapseNode(divs[t]);
    };
  };
}

function getParent(node) {  // nu e parentNode, ci meniul de deasupra lui
  var menu = document.getElementById(menuId);
  var divs = menu.getElementsByTagName("div");
  var level = parseInt(node.getAttribute("level")) - 1;
  var t = nodeIndex(node) - 1;
  var found = false;
  while ((t >= 0) && (!found)) {
    if (parseInt(divs[t].getAttribute("level")) == level) {
      found = true;
    } else {
      t = t - 1;
    };    
  };
  if (found) {
    return getNode(t);
  } else {
    return null;
  };
}

function openTillNode(node) {
  var a = node.getElementsByTagName("a")[0];
  if (typeof a != "unasigned") {
    var firstParent = null;
    var parent = getParent(node);
    while (parent != null) {
      firstParent = parent;
      parent.setAttribute("open", "true");
      parent = getParent(parent);
      showNode(node);
    };
    if (firstParent != null) {
      showNode(firstParent);
    };
    a.onclick();
    setIndex(nodeIndex(node));
  }
}

function getXMLHttpRequest() {
  var httpReq = null;
  if (window.XMLHttpRequest) {
    httpReq = new XMLHttpRequest();
  } else if (typeof ActiveXObject != "undefined") {
    httpReq = new ActiveXObject("Microsoft.XMLHTTP");
  }
  return httpReq;
}

function sendRequest(handler, url, modul, sprache, menu, suchbegriffe) {
  var requestStr = url + "?Modul=" + modul + "&Sprache=" + sprache;
  if (menu != null) {
    requestStr = requestStr + "&Menu=" + menu;
  };
  if (suchbegriffe != null) {
    requestStr = requestStr + "&suchbegriffe=" + suchbegriffe;
  };
  AjaxRequest = getXMLHttpRequest();
  if (AjaxRequest) {
    AjaxRequest.onreadystatechange = handler;
    AjaxRequest.open("get", requestStr, true);
    AjaxRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    AjaxRequest.send(null);
  }
}

function changeChar(st, ci, cf) {
  var rs = "";
  for (var i = 0; i < st.length; i++) {
    if (st.charAt(i) != ci) {
      rs = rs + st.charAt(i);
    } else {
      rs = rs + cf;
    };
  };
  return rs;
}

function makeContent() {
  if (AjaxRequest.readyState == 4) {
    var text = AjaxRequest.responseText;
    var k = text.indexOf("<titel>");
    var l = text.indexOf("</titel>");

    var titel = document.getElementById(titelId);
    titel.innerHTML = text.substring(k + 7, l);

    var inhalt = document.getElementById(inhaltId);
    inhalt.innerHTML = text.substring(l + 8);
  }
}

function clickMenu(menu) {
  sendRequest(makeContent, "vas.exe", "CO", getSprache(), menu, null);
}

function toHex(st) {
  var res = "";
  for (var i = 0; i < st.length; i++) {
    res = res + st.charCodeAt(i).toString(16);
  };
  return res;
}

function clickSuchen(modul, menu) {
  sendRequest(makeContent, "vas.exe", modul, getSprache(), menu, toHex(getSuchbegriffe()));
}

function clickButtonSuchen(modul, menu) {
  var begriff = document.getElementById("begriff");
  var st = begriff.value;
  var suchbegriffe = 
    changeChar(st, " ", ",") + "|" +
    document.getElementById("von").value + "|" +
    document.getElementById("bis").value
  ;
  setSuchbegriffe(suchbegriffe);
  sendRequest(makeContent, "vas.exe", modul, getSprache(), menu, toHex(suchbegriffe));
}

// primeste "<leiste>...</leiste><menu>...</menu><info>...</info>"
function makeMenu() {
  if (AjaxRequest.readyState == 4) {
    var text = AjaxRequest.responseText;
    var k;
    var l;

    k = text.indexOf("<leiste>");
    l = text.indexOf("</leiste>");
    var leiste = document.getElementById(leisteId);
    leiste.innerHTML = text.substring(k + 8, l);

    k = text.indexOf("<menu>");
    l = text.indexOf("</menu>");
    var menu = document.getElementById(menuId);
    menu.innerHTML = text.substring(k + 6, l);

    k = text.indexOf("<info>");
    l = text.indexOf("</info>");
    var info = document.getElementById(infoId);
    info.innerHTML = text.substring(k + 6, l);

    createMenu();
    openTillNode(getNode(getIndex()));
  };
}

function clickSprache(sprache) {
  setSprache(sprache);
  sendRequest(makeMenu, "vas.exe", "ME", sprache, null, null);
}

function load() {
  hash = "E;0";
  location.hash = "E;0";
  geschichte[0] = "E;0";
  geschichteIndex = 0;
  document.getElementById('E').className = "active";
  sendRequest(makeMenu, "vas.exe", "ME", 'E', null, null);
}

function getSprache() {
  return hash.substr(0, 1);
}

function getIndex() {
  return parseInt(hash.split(";")[1]);
}

function getSuchbegriffe() {
  var res = "";
  var hashA = hash.split(";");
  if (hashA.length > 2) {
    res = hashA[2];
  };
  return res;
}

function setSprache(sprache) {
  //demarcheaza sprache veche
  document.getElementById(getSprache()).className = "inactive";
  //actualizeaza variabilele
  if (sprache != getSprache()) {
    //face setarea
    var st = sprache + hash.substr(1);
    hash = st;
    location.hash = st;
    geschichteIndex = geschichte.length;
    geschichte[geschichte.length] = st;
  };
  //marcheaza sprache noua
  document.getElementById(sprache).className = "active";
}

function setIndex(index) {
  // demarcheaza meniul vechi
  var node = getNode(getIndex());
  node.getElementsByTagName("a")[0].className = "inactive";
  //actualizeaza variabilele
  if (index != getIndex()) {
    // face setarea
    var st = hash.substr(0, 1) + ";" + index;
    var hashA = hash.split(";");
    for (var t = 2; t < hashA.length; t++) {
      st = st + ";" + hashA[t];
    };
    hash = st;
    location.hash = st;
    geschichteIndex = geschichte.length;
    geschichte[geschichte.length] = st;
  };
  // marcheaza meniul nou
  var node = getNode(index);
  node.getElementsByTagName("a")[0].className = "active";
}

function setSuchbegriffe(suchbegriffe) {
  if (suchbegriffe != getSuchbegriffe()) {
    // face setarea
    var hashA = hash.split(";");
    var st = hashA[0] + ";" + hashA[1];
    if (suchbegriffe != "") {
      st = st + ";" + suchbegriffe;
    };
    hash = st;
    location.hash = st;
    geschichteIndex = geschichte.length;
    geschichte[geschichte.length] = st;
  };
}

function clickBack() {
  if (geschichteIndex > 0) {
    // demarcheaza sprache veche
    document.getElementById(getSprache()).className = "inactive";
    // marcheaza sprache noua
    geschichteIndex = geschichteIndex - 1;
    hash = geschichte[geschichteIndex];
    location.hash = geschichte[geschichteIndex];
    var sprache = getSprache();
    document.getElementById(sprache).className = "active";
    sendRequest(makeMenu, "vas.exe", "ME", sprache, null, null);
  };
}

function clickForward() {
  if (geschichteIndex < geschichte.length - 1) {
    // demarcheaza sprache veche
    document.getElementById(getSprache()).className = "inactive";
    // marcheaza sprache noua
    geschichteIndex = geschichteIndex + 1;
    hash = geschichte[geschichteIndex];
    location.hash = geschichte[geschichteIndex];
    var sprache = getSprache();
    document.getElementById(sprache).className = "active";
    sendRequest(makeMenu, "vas.exe", "ME", sprache, null, null);
  };
}

function clickInhalt(modul, menu) {
  var divs = document.getElementById(menuId).getElementsByTagName("div");
  var found = false;
  var t = 0;
  while ((t < divs.length) && (!found)) {
    if (divs[t].getAttribute("menu") == menu) {
      setIndex(nodeIndex(divs[t]));
      found = true;
    };
    t++;
  };
  // trebuie actualizat si meniul
  sendRequest(makeMenu, "vas.exe", "ME", getSprache(), null, null);
}
