Menu.objects = new Array();

// class Menu
function Menu(selectedItem, gapPrefix, offset) {
   this.offset         = offset;
   // class members
   this.menuItems      = new Array();
   this.menuDict       = new Array();
   this.gapImages      = new Array();
   this.gapPrefix      = gapPrefix;
   this.selectedItem   = selectedItem;
   this.collapseTimer  = null;

   // class methods
   this.addMenuItem            = addMenuItem;
   this.asString               = asString;
   this.topRowAsHTML           = topRowAsHTML;
   this.drawTopItem            = drawTopItem;
   this.drawTopGap             = drawTopGap;
   this.overTopItem            = overTopItem;
   this.highlightTopItem       = highlightTopItem;
   this.outTopItem             = outTopItem;
   this.deHighlightTopItem     = deHighlightTopItem;
   this.overSubItem            = overSubItem;
   this.outSubItem             = outSubItem;
   this.showSubMenu            = showSubMenu;
   this.collapseSubMenu        = collapseSubMenu;
   this.collapseAllMenus       = collapseAllMenus;
   this.startCollapseTimer     = startCollapseTimer;
   this.clearCollapseTimer     = clearCollapseTimer;
   this.subMenusAsHTML         = subMenusAsHTML;
   this.computeXPosOfTopItem   = computeXPosOfTopItem;
   this.checkNetscape          = checkNetscape;
   this.updatePositions        = updatePositions;

   this.objId = Menu.objects.length;
   Menu.objects[this.objId] = this;
}

// class Menu
function addMenuItem(item, ancestor, imgPrefix, link, altText) {
   with(this) {
      if (ancestor == "") {
         count = menuItems.length;
         menuDict[item] = count;

         menuItems[count] = new Array();
         menuItems[count][0] = new MenuItem(item, imgPrefix, link, altText, true);
      } else {
         pos=0;
         for (var i=0; i<menuItems.length; i++) {
            if (menuItems[i][0].item == ancestor) {
               pos = i;
            }
         }
         count = menuItems[pos].length;
         menuItems[pos][count] = new MenuItem(item, imgPrefix, link, altText, false);
      }
   }
}

// class Menu
function asString() {
   with (this) {
      result = "Menu ("+menuItems.length+" items)<br>\n";

      for (var i=0; i<menuItems.length; i++) {
         result += menuItems[i][0].asString()+" ("+i+")<br>\n";

         for(var j=1; j<menuItems[i].length; j++) {
            result += "|---"+menuItems[i][j].asString()+" ("+i+","+j+")<br>\n";
         }
      }
      return result;
   }
}

// class Menu
function topRowAsHTML(x, y) {
   with (this) {
      gapImages = new Array();
      if (document.layers) {
         result = "<font size='0'><layer name='menu_top' left='"+x+"' top='"+y+"'><nobr>";
      } else {
         result = "<font size='0'><div id='menu_top'><nobr>";
      }

      leftItem = menuItems[0][0];
      result += drawTopItem(leftItem, selectedItem);

      for (var i=1; i<menuItems.length; i++) {
         rightItem = menuItems[i][0]

         result += drawTopGap(leftItem, rightItem, selectedItem);
         result += drawTopItem(rightItem, selectedItem);

         leftItem = rightItem;
      }
      if (document.layers) {
         result += "</nobr></layer></font>";
      } else {
         result += "</nobr></div></font>";
      }
   }
   document.write(result);
}

// class Menu
function drawTopGap(leftItem, rightItem, selectedItem) {
   with(this) {
      if (leftItem.item == selectedItem) {
         l = "s";
         r = "n";
      } else if (rightItem.item == selectedItem) {
         l = "n";
         r = "s";
      } else {
         l = "n";
         r = "n";
      }
      var pos = gapImages.length;
      gapImages[pos] = new GapImage(this, l, r);

      return "<img id='topgap_"+pos+"' name='topgap_"+pos+"' border='0' src='"+gapImages[pos].normalImg.src+"'>";
   }
}

// class Menu
function drawTopItem(item, selectedItem) {
   img = item.normalImg.src;
   if (item.item == selectedItem) {
      img = item.selectImg.src;
   }
   result = "<a href='"+item.link+"' onMouseOver=\"men.overTopItem('"+item.item+"')\" onMouseOut =\"men.outTopItem('"+item.item+"')\">";
   result += "<img id='top_"+item.item+"' name='top_"+item.item+"' border='0' src='"+img+"' alt='"+item.altText+"'></a>";
   return result;
}

// class Menu
function subMenusAsHTML() {
   with (this) {
      var result = "";
      for (var i=0; i<menuItems.length; i++) {
         if (menuItems[i].length > 1) {
            topItem = menuItems[i][0];

            topStyle = new xbStyle(getLayerById("menu_top"));

            xPos = computeXPosOfTopItem(i)+topStyle.getPageX();
            yPos = topStyle.getPageY()+topStyle.getHeight();

            addOn = "";
            if (!document.layers) addOn = "line-height: 0;";

            result += "<div id='sub_"+topItem.item+"' style='position: absolute; left: "+xPos+"px; top: "+yPos+"px; z-Index: 1; visibility:hidden; "+addOn+"'>";

            for(var j=1; j<menuItems[i].length; j++) {
               subItem = menuItems[i][j];

               result += "<a href='"+subItem.link+"' \
                  onMouseOver=\"men.overSubItem('"+topItem.item+"','"+subItem.item+"')\" \
                  onMouseOut =\"men.outSubItem('"+topItem.item+"','"+subItem.item+"')\" \
               >";
               result += "<img id='subimg_"+subItem.item+"' name='subimg_"+subItem.item+"' border='0' src='"+subItem.normalImg.src+"' alt='"+subItem.altText+"'><br></a>";
            }

            result += "</div>";
         }
      }
   }
   document.write(result);

   this.checkNetscape();
   //return result;
}

// class Menu
function checkNetscape() {
   with (this) {
      if (document.layers) {
         for (var i=0; i<menuItems.length; i++) {
            if (menuItems[i].length > 1) {
               if (!getLayerById("sub_"+menuItems[i][0].item)) {
                  window.location.reload();
               }
            }
         }
      }
   }
}

// class Menu
function computeXPosOfTopItem(pos) {
   with (this) {
      if (pos == 0) return 0;
      var result = 0;
      var gapWidth = gapImages[0].normalImg.width;
      if (gapWidth == 0 && !document.layers) {
         var style = new xbStyle(xbGetElementById("topgap_0"));
         gapWidth = style.getWidth();
      }

      for (var i=0; i<pos; i++) {
         var addValue = menuItems[i][0].normalImg.width;

         if (addValue == 0 && !document.layers) {
            var style = new xbStyle(xbGetElementById("top_"+menuItems[i][0].item));
            addValue = style.getWidth();
         }
         result +=  addValue + gapWidth;
      }
      return result - offset;
   }
}

// class Menu
function updatePositions() {
   with (this) {
      for (var i=0; i<menuItems.length; i++) {
         if (menuItems[i].length > 1) {
            topItem = menuItems[i][0];

            topStyle = new xbStyle(getLayerById("menu_top"));

            xPos = computeXPosOfTopItem(i)+topStyle.getPageX();
            yPos = topStyle.getPageY()+topStyle.getHeight();

            subStyle = new xbStyle(getLayerById("sub_"+topItem.item));
            subStyle.moveTo(xPos, yPos);
         }
      }
   }
}

// class Menu
function overTopItem(id) {
   with (this) {
      clearCollapseTimer();

      pos = menuDict[id];
      collapseAllMenus(pos);
      highlightTopItem(pos);

      showSubMenu(id);
   }
}

// class Menu
function highlightTopItem(pos) {
   with (this) {
      id = menuItems[pos][0].item;
      if (pos > 0) {
         leftImg = getImageById("topgap_"+(pos-1));
         leftImg.src = gapImages[pos-1].hoverRightImg.src;
      }
      if (pos < menuItems.length-1) {
         rightImg = getImageById("topgap_"+pos);
         rightImg.src = gapImages[pos].hoverLeftImg.src;
      }
      middleImg = getImageById("top_"+id);
      middleImg.src = menuItems[pos][0].hoverImg.src;
   }
}

// class Menu
function outTopItem(id) {
   with (this) {
      startCollapseTimer();
   }
}

// class Menu
function deHighlightTopItem(pos) {
   with (this) {
      id = menuItems[pos][0].item;
      if (pos > 0) {
         leftImg = getImageById("topgap_"+(pos-1));
         leftImg.src = gapImages[pos-1].normalImg.src;
      }
      if (pos < menuItems.length-1) {
         rightImg = getImageById("topgap_"+pos);
         rightImg.src = gapImages[pos].normalImg.src;
      }
      middleImg = getImageById("top_"+id);
      if (id == selectedItem) {
         middleImg.src = menuItems[pos][0].selectImg.src;
      } else {
         middleImg.src = menuItems[pos][0].normalImg.src;
      }
   }
}

// class Menu
function overSubItem(topId, subId) {
   with (this) {
      clearCollapseTimer();

      topPos = menuDict[topId];
      subPos = 0;

      for (var i=1; i<menuItems[topPos].length; i++) {
         if (menuItems[topPos][i].item == subId) {
            subPos = i;
         }
      }

      img = getImageById("subimg_"+subId);
      img.src = menuItems[topPos][subPos].hoverImg.src;
   }
}

// class Menu
function outSubItem(topId, subId) {
   with (this) {
      topPos = menuDict[topId];
      subPos = 0;

      for (var i=1; i<menuItems[topPos].length; i++) {
         if (menuItems[topPos][i].item == subId) {
            subPos = i;
         }
      }

      img = getImageById("subimg_"+subId);
      img.src = menuItems[topPos][subPos].normalImg.src;

      startCollapseTimer();
   }
}

// class Menu
function showSubMenu(id) {
   with (this) {
      layer = getLayerById("sub_"+id);
      if (layer) {
         updatePositions();
         layerStyle = new xbStyle(layer);
         layerStyle.setVisibility('visible');
      }
   }
}

// class Menu
function collapseSubMenu(id) {
   with (this) {
      layer = getLayerById("sub_"+id);
      if (layer) {
         layerStyle = new xbStyle(layer);
         layerStyle.setVisibility('hidden');
      }
   }
}

// class Menu
function collapseAllMenus(except) {
   with (this) {
      for (var i=0; i<menuItems.length; i++) {
         if (i != except) {
            if (menuItems[i].length > 0) {
               collapseSubMenu(menuItems[i][0].item);
            }
            deHighlightTopItem(i);
         }
      }
   }
}

//class Menu
function startCollapseTimer() {
   with (this) {
      clearCollapseTimer();
      collapseTimer = window.setTimeout("Menu.objects["+objId+"].collapseAllMenus();", 100);
   }
}

// class Menu
function clearCollapseTimer() {
   with (this) {
      if (collapseTimer) {
         window.clearTimeout(collapseTimer);
         collapseTimer = null;
      }
   }
}

// class GapImage
function GapImage(menu, left, right) {
   imgPrefix = menu.gapPrefix;
   this.normalImg     = new Image();
   this.hoverLeftImg  = new Image();
   this.hoverRightImg = new Image();

   if (l == "s") {
      this.normalImg.src     = imgPrefix+"_sn.gif";
      this.hoverLeftImg.src  = imgPrefix+"_hn.gif";
      this.hoverRightImg.src = imgPrefix+"_sh.gif";
   } else if (r == "s") {
      this.normalImg.src     = imgPrefix+"_ns.gif";
      this.hoverLeftImg.src  = imgPrefix+"_hs.gif";
      this.hoverRightImg.src = imgPrefix+"_nh.gif";
   } else {
      this.normalImg.src     = imgPrefix+"_nn.gif";
      this.hoverLeftImg.src  = imgPrefix+"_hn.gif";
      this.hoverRightImg.src = imgPrefix+"_nh.gif";
   }
}

// class MenuItem
function MenuItem(item, imgPrefix, link, altText, isTop) {
   this.item    = item;
   this.altText = altText;
   this.isTop   = isTop;
   this.link    = link;

   this.normalImg = new Image();
   this.hoverImg  = new Image();

   this.normalImg.src = imgPrefix+"_n.gif";
   this.hoverImg.src  = imgPrefix+"_h.gif";

   if (isTop) {
      this.selectImg = new Image();
      this.selectImg.src = imgPrefix+"_a.gif";
   }

   this.asString = function() {
      with (this) {
         return "MenuItem ("+altText+") isTop ("+isTop+")";
      }
   }
}

function getImageById(id, layer) {
   if (document.layers) {
      if (!layer) {
         layer = window;
      }
      //alert(id+" <==> "+layer.name+":"+layer.document.layers.length);

      for (var i=0; i<layer.document.images.length; i++) {
         //alert (layer.document.images[i].name+" von "+layer.document.images.length);
         if (layer.document.images[i].name == id) {
            return layer.document.images[i];
         }
      }

      for (var i=0; i<layer.document.layers.length; i++) {
         var result = getImageById(id, layer.document.layers[i]);
         if (result) return result;
      }

   } else {
      return xbGetElementById(id);
   }
}

function getLayerById(id) {
   if (document.layers) {
      for (var i=0; i<document.layers.length; i++) {
         if (document.layers[i].name == id) {
            return document.layers[i];
         }
      }
   } else {
      return xbGetElementById(id);
   }
}

xblibrary = new xbLibrary('../xb-lib/');

