  var undefined;

  // ##########################################
  
  function Menu () {
    
  }

  // ##########################################
  
  Menu._activeSub = undefined;
  Menu._timeout = undefined;
  Menu._timeoutMove = undefined;
  Menu._timeoutDelay = 6000;
  Menu._isMoving = false;
  Menu._holdState = false;
  Menu._speedPX = 25;
  Menu._speedTime = 1;
  Menu._fixedSub = undefined;

  // ##########################################
  
  Menu.fixedSub = function (elem) {
    if (! elem) {
      return;
    }
    Menu._fixedSub = elem;
  }

  // ##########################################
  
  Menu.displaySub = function (idx) {
    if (Menu._isMoving) {
      return;      
    }
    var elem = document.getElementById(idx);
    if (! elem) {
      return;
    }
    var _menIsActive = false;
    if (Menu._activeSub == elem) {
      _menIsActive = true;
    }
    var func = function () {
      Menu._activeSub = elem;
      Menu.moveIn(elem);
    }
    if (_menIsActive || Menu._fixedSub == elem) {
      func = function () {
        return;
      }
    }
    if (Menu._activeSub) {
      if (Menu._fixedSub != Menu._activeSub) {
        Menu.moveOut(Menu._activeSub, func);
      }
    } else {
      func();
    }
  }

  // ##########################################
  
  Menu.undisplaySub = function (elem) {
    if (Menu._isMoving) {
      return;
    }
    if (Menu._holdState) {
      return;
    }
    if (! elem) {
      return;
    }
    Menu.moveOut(elem);
  }

  // ##########################################
  
  Menu.doHideSub = function () {
    if (Menu._isMoving) {
      return;
    }
    Menu._holdState = false;
    var func = function () {
      if (Menu._timeout) {
        window.clearTimeout(Menu._timeout);
      }
      if (! Menu._activeSub) {
        return;
      }
      if (Menu._holdState) {
        return;
      }
      if (Menu._isMoving) {
        return;
      }
      Menu.moveOut(Menu._activeSub);
    }
    Menu._timeout = window.setTimeout(func ,Menu._timeoutDelay);
  }

  // ##########################################
  
  Menu.holdSub = function () {
    Menu._holdState = true;
  }
  
  // ##########################################
  
  Menu.init = function() {
    for (var i=1; i<4; i++) {
      var id = "sub_" + i;
      var elem = document.getElementById(id);
      if (! elem) {
        continue;
      }
      var pos = (parseFloat(elem.offsetWidth) + 10);
      pos *= -1;
      pos += 'px';
      elem.style.left = pos;
      if (elem.className == 'aktiv') {
        Menu.fixedSub(elem);
        elem.style.left = 0;
      }
    }
  }

  // ##########################################
  
  Menu.moveIn_ = function (elem) {
    if (Menu._timeoutMove) {
      window.clearTimeout(Menu._timeoutMove);
    }
    if (! elem) {
      return;
    }
    Menu._isMoving = true;
    elem.style.left = 0;
    Menu._isMoving = false;
  }

  // ##########################################
  
  Menu.moveIn = function (elem) {
    if (Menu._timeoutMove) {
      window.clearTimeout(Menu._timeoutMove);
    }
    if (Menu._timeout) {
      window.clearTimeout(Menu._timeout);
    }
    if (! elem) {
      return;
    }
    if (elem == Menu._fixedSub) {
       return;
    }
    Menu._isMoving = true;
    var pos = parseFloat(elem.style.left);
    if (pos == undefined) {
      return;
    }
    if (pos >= 0) {
      Menu._isMoving = false;
      Menu.doHideSub();
      return;
    }
    var diff =  Menu._speedPX;
    if (parseFloat(pos + diff ) > 0) {
      diff = Math.abs(parseFloat(0 - pos));
    }
    var endpos =  pos + diff;
    if (endpos != '0') {
      endpos += 'px';
    }
    elem.style.left = endpos;
    var func = function() {
      Menu.moveIn(elem);
    }
    Menu._timeoutMove = window.setTimeout(func, Menu._speedTime);
  }

  // ##########################################
  
  Menu.moveOut = function (elem, endfunc) {
    if (Menu._timeoutMove) {
      window.clearTimeout(Menu._timeoutMove);
    }
    if (Menu._timeout) {
      window.clearTimeout(Menu._timeout);
    }
    if (! elem) {
      return;
    }
    if (elem == Menu._fixedSub) {
       return;
    }
    Menu._isMoving = true;
    var pos = parseFloat(elem.style.left);
    if (pos == undefined) {
      return;
    }
    var target_pos = (parseFloat(elem.offsetWidth) + 10);
    target_pos *= -1;
    if (pos <= target_pos) {  
      Menu._activeSub = undefined;
      Menu._isMoving = false;
      if (endfunc) {
        endfunc();
      }
      return;
    }
    var diff =  Menu._speedPX;
    diff *= 3;
    if (parseFloat(pos - diff ) < target_pos) {
      diff = Math.abs(parseFloat(target_pos + pos));
    }
    var endpos =  pos - diff;
    if (endpos != '0') {
      endpos += 'px';
    }
    elem.style.left = endpos;
    var func = function() {
      Menu.moveOut(elem, endfunc);
    }
    Menu._timeoutMove = window.setTimeout(func, Menu._speedTime);
  }

  // ##########################################
  
  Menu.moveOut_ = function (elem, endfunc) {
    if (Menu._timeoutMove) {
      window.clearTimeout(Menu._timeoutMove);
    }
    if (! elem) {
      return;
    }
    Menu._isMoving = true;
    elem.style.left = '-375px';    
    Menu._activeSub = undefined;
    Menu._isMoving = false;
    if (endfunc) {
      endfunc();
    }
  }

  // ##########################################

  Menu.getElementDocumentPositionTop = function(elem){
    var pos = 0;
    if (elem.nodeName.toLowerCase() == 'area'){
      elem = elem.parentNode;
    }
    if (elem.nodeName.toLowerCase() == 'map'){
      elem = elem.parentNode;
    }
    var nextElem = elem;
    pos += nextElem.offsetTop;
    while (nextElem.offsetParent) {
      pos += nextElem.offsetParent.offsetTop;
      nextElem = nextElem.offsetParent;
    }
    return parseFloat(pos);
  }
  
  // ##########################################
  
  Menu.getElementDocumentPositionLeft = function(elem){
    var pos = 0;
    if (elem.nodeName.toLowerCase() == 'area'){
      elem = elem.parentNode;
    }
    if (elem.nodeName.toLowerCase() == 'map'){
      elem = elem.parentNode;
    }
    var nextElem = elem;
    pos += nextElem.offsetLeft;
    while (nextElem.offsetParent) {
      pos += nextElem.offsetParent.offsetLeft;
      nextElem = nextElem.offsetParent;
    }
    return parseFloat(pos);
  }
  
  // ##########################################
  
  Menu.getElementDocumentPositionRight = function(elem){
    var pos = 0;
    pos += Menu.getElementDocumentPositionLeft(elem) + elem.offsetWidth;
    return parseFloat(pos);
  }
  
  // ##########################################
  
  Menu.getElementDocumentPositionBottom = function(elem){
    var pos = 0;
    pos += Menu.getElementDocumentPositionTop(elem) + elem.offsetHeight;
    return parseFloat(pos);
  }
  
  // ##########################################
    
  Menu.getScreenHeight = function() {
    var height = 0;
    if (document.documentElement != undefined && document.documentElement.clientHeight != undefined) {
       height = parseFloat(document.documentElement.clientHeight);
    } else {
       height = parseFloat(window.innerHeight);
    }
    return height;
  }   
  
  // ##########################################
  
  Menu.getScreenWidth = function() {
    var width = 0;
    if (document.documentElement != undefined && document.documentElement.clientWidth != undefined) {
       width = parseFloat(document.documentElement.clientWidth);
    } else {
       width = parseFloat(window.innerWidth);
    }
    return width;
  }
  
  // ##########################################
  
  Menu.getScrollPositionTop = function() {
    var pos = 0;
    if (document.documentElement != undefined && document.documentElement.scrollTop != undefined) {
       pos = parseFloat(document.documentElement.scrollTop);
    } else {
       pos = parseFloat(window.pageYOffset);
    }
    return pos;
  }
  
  // ##########################################
  
