// Marker, when user jumps between the same level and no new page will reloaded
var oldMarker = null;
// Navigation
var menu = "";

//**********************************************************************
// Init Method
//**********************************************************************
function setDefault(){
  if(activePage != null && activePage != ""){
    openLevel(getObjByPage(activePage));
  }
}

//**********************************************************************
// Methods for enable or disable menu entries.
//**********************************************************************
// obj: element -> It will be marked an his level will be opened.
function openLevel(obj){
  if (obj != null){
	// unmark all old elements
    closeLowerLevel(getObjFirstLevel(oldMarker))
    // mark all upper level
    openUpperLevel(obj);
    // display current level
    if(objHasChild(obj)){
      // show childs, if entry has
      displayLevel(obj, obj);
    } else {
      // show entries on the same level if current entry has no childs
      displayLevel(getUpperLevel(obj), obj);
    }
    // display second levels
    oldMarker = obj;
  }
}

// obj: father element -> open his child's and mark the 'selectedObj'
function displayLevel(obj, selectedObj){
  var i;
  for(i=0;1;i++){
    var pos = getPositionFromObj(obj) + "_" + i;
    var levelAvailable = getObjByPosition(pos);
    if(levelAvailable){
      if(levelAvailable.id == selectedObj.id) {
        setClass(levelAvailable, "Active");
      } else {
        setClass(levelAvailable, "Open");
      }
    }
    else{
      break;
    }
  }
}

// obj: Element in the tree. Goes recursive up to the root element and marks them.
function openUpperLevel(obj){
  if(obj != null){
    setClass(obj, "Active");
    // show all entries on the same level
    openUpperLevel(getUpperLevel(obj));
  }
}

// Close the tree.
function closeTree(){
  var i;
  for(i=0;1;i++){
    var levelAvailable = getObjByPosition("level_" + i);
    if(levelAvailable){
      closeLowerLevel(levelAvailable)
    } else {
      break;
    }
  }
}

// obj: Element in the tree. Goes recursive down to the node elements and unmark them.
function closeLowerLevel(obj){
  if(obj != null){
    setClass(obj, "");
    var i;
    for(i=0;1;i++){
      pos = getPositionFromObj(obj) + "_" + i;
      var levelAvailable = getObjByPosition(pos);
      if(levelAvailable){
        closeLowerLevel(levelAvailable);
      } else {
        break;
      }
    }
  }
}

function clickNode(obj){
  if (obj != null){
    if(obj.getAttribute("url") != null && obj.getAttribute("url") != ""){
      var url = obj.getAttribute("url");
      if(url.indexOf("http") == 0 || url.indexOf("ftp") == 0){
        // absolute path
        document.location.href = getURLwithLang(url);
      } else if(url.indexOf("/root") == 0){
        // e-banking page
        document.location.href = servletPath + url;
      } else {
        // server or page relative
        document.location.href = getURLwithLang(url);
      }      
    } else {
      openLevel(obj)
      // set new state in hover
      setHoverState(obj);
      // save new page
      oldMarker = obj;
    }
  }
}

//**********************************************************************
// Helper methods.
//**********************************************************************
// --------- URL Lang Appender ---------
function getURLwithLang(url){
  if(url.indexOf("?") == -1){
    return url + "?lang=" + lang;
  } else {
  	return url + "&lang=" + lang;
  }
}

// --------- Object Attributes ---------
function getPositionFromObj(obj){
  if(obj != null){
    return obj.id;
  }
  return "";
}

function getClassFromObj(obj){
  if(obj != null){
    return getClassByPosition(getPositionFromObj(obj));
  }
  return "";
}

function objHasChild(obj){
  var position = getPositionFromObj(obj);
  if(getObjByPosition(position + "_0")){
    return true;
  }
  return false;
}

// --------- Select Object ---------
function getObjByPage(page){
  var divs = document.getElementsByTagName("div");
  var i;
  for (i = 0; i<divs.length; i++) {
  	if(divs[i].getAttribute("name") == "navEntry") {
  	  var pages = divs[i].getAttribute("pages")
	  var arr = pages.split(";");
	  var a;
	  for (a = 0; a < arr.length; a++) {
	    if(arr[a] == page){
	      return divs[i];
	    }
	  }
  	}
  }
  return null;
}

function getObjByPosition(position){
  return getObjById(position);
}

function getObjById(id){
  var divs = document.getElementsByTagName("div");
  var i;
  for (i = 0; i<divs.length; i++) {
  	if(divs[i].getAttribute("name") == "navEntry") {
  	  if(divs[i].id == id){
    	return divs[i];
      }
  	}
  }
  return null;
}

function getObjFirstLevel(obj){
  var position = getPositionFromObj(obj);
  var arr = position.split("_");
  var i;
  for (i = 0; i < arr.length && arr.length > 1; i++) {
    if(arr[i] == "level"){
      return getObjByPosition("level_" + arr[i+1]);
    }
  }
  return null;
}

function getUpperLevel(obj){
  var position = getPositionFromObj(obj);
  var arr = position.split("_");
  var i;
  if(arr.length > 1){
  	var upperLevel = "level";
  	if(arr[0] == "level"){
  	  for (i = 1; i < arr.length-1; i++) {
  	    upperLevel += "_" + arr[i];
  	  }
      return getObjByPosition(upperLevel);
    }
  }
  return null;
}

// --------- Routine for Style ---------
function getClassByPosition(position){
  return "entry" + getLevelByPosition(position) +"Level";
}
function getLevelByPosition(position){
  var arr = position.split("_");
  if(arr.length > 1){
  	if(arr[0] == "level"){
      return arr.length-1;
    }
  }
  return "";
}

var headerNodeSet = false;
function headerNode() {
  if(!headerNodeSet){
    menu += "<div class=\"headerNode\">&#160;</div>";
    headerNodeSet = true;
  }
}

var oldHoverState  = null;
function setHoverState(obj){
  if (obj != null){
    // save old state
    var className = obj.className;
    if(className.indexOf("Active") != -1){
      oldHoverState = "Active";
    } else if(className.indexOf("Open") != -1){
      oldHoverState = "Open";
    } else {
      oldHoverState = "";
    }
  }
}
function hover(obj){
  if (obj != null && isHoverEnabled){
    var className = obj.className;
    // do not change active elements
    if(className.indexOf("Active") != -1 && !isHoverActiveElementsEnabled){
      return;
    }
    // save old state
    setHoverState(obj);
    // chage state to hover
    setClass(obj, "Hover");
  }
}
function hoverOut(obj){
  if (obj != null && oldHoverState != null && isHoverEnabled){
    var className = obj.className;
    // do not change active elements
    if(className.indexOf("Active") != -1 && !isHoverActiveElementsEnabled){
      return;
    }
    // set old state
    setClass(obj, oldHoverState);
  }
}

function setClass(obj, status){
  obj.className = "entryGlobal " + getClassFromObj(obj) + status;
  var imgDiv = document.getElementById( obj.id + "_img" );
  if(imgDiv != null){
    imgDiv.className = "entryImage " + getClassFromObj(obj) + "Image" + status;
  }
  var imgText = document.getElementById( obj.id + "_text" );
  if(imgText != null){
    imgText.className = "entryText " + getClassFromObj(obj) + "Text" + status;
  }
}

//**********************************************************************
// Insert method for new menu entries.
//**********************************************************************
function addNode(id, pages, label, url) {
	headerNode();
	
	var text = "&#160;";
	if(label != null && label != ""){
		text = label;
	}
	var position = id;
	//display: none;
	menu += "<div id=\"" + id  + "\" name=\"navEntry\" pages=\"" + pages + "\" url=\"" + url + "\" class=\"entryGlobal " + getClassByPosition(position) + "\" onclick=\"clickNode(this);\" onmouseover=\"hover(this);\" onmouseout=\"hoverOut(this);\">"
	     + "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\"><tr>"
	     + "<td class=\"entryTdImage " + getClassByPosition(position) + "TdImage\" align=\"right\">&nbsp;"
	     +   "<div id=\"" + id  + "_img\" class=\"entryImage " + getClassByPosition(position) + "Image\"><img src=\"./img/pfeil.gif\"></div>"
	     + "</td>"
	     + "<td class=\"entryTdText " + getClassByPosition(position) + "TdText\">"
	     +   "<div id=\"" + id  + "_text\" class=\"entryText " + getClassByPosition(position) + "Text\">" + text + "</div>"
	     + "</td>"
	     + "</tr></table>"
	     + "</div>";
}
