var docType = (document.compatMode && document.compatMode == "CSS1Compat");

function menu(size, orientation, x, y, offsetX, offsetY, bgOut, bgOver, fontFace, fontSize,
              fontStyleOut, fontStyleOver, textColorOut, textColorOver, borderSize,
              borderColor, margin, showChar, showOnClick, sepItems, isMainMenu,
              hasAnimations, animationType, hasShadow, sOffX, sOffY, shadowColor) {
  for(var i = 0; i < arguments.length; i++)
    if(typeof(arguments[i]) == "string")
      arguments[i] = arguments[i].toLowerCase();

  this.size = size;
  this.orientation = orientation;
  this.offsetX = offsetX;
  this.offsetY = offsetY;
  this.bgOut = bgOut;
  this.bgOver = bgOver;
  this.fontFace = fontFace;
  this.fontSize = fontSize;
  this.fontStyleOut = fontStyleOut;
  this.fontStyleOver = fontStyleOver;
  this.textColorOut = textColorOut;
  this.textColorOver = textColorOver;
  this.borderSize = borderSize;
  this.margin = margin;
  this.showChar = showChar;
  this.showOnClick = showOnClick;
  this.sepItems = sepItems;
  this.isMainMenu = isMainMenu;
  this.hasAnimations = hasAnimations;
  this.animationType = animationType;
  this.hasShadow = hasShadow;
  this.sOffX = sOffX;
  this.sOffY = sOffY;
  this.shadowColor = shadowColor;
  this.position = borderSize;
  this.addSeparator = separator;
  this.addItem = item;
  this.debug = debug;
  this.floatMenu = floatMenu;
  this.items = new Array();
  this.activeItems = new Array();
  this.animate = true;
  this.docMargin = docType ? margin : 0;

  this.main = document.createElement("div");
  document.body.appendChild(this.main);
  with(this.main) {
    style.backgroundColor = borderColor;
    style.position = "absolute";
    style.left = x;
    style.top = y;
    style.zIndex = 1001 + menus.length;
    if(orientation == "horizontal") {
      style.height = size;
      style.width = (sepItems) ? borderSize : borderSize * 2;
    } else {
      style.height = (sepItems) ? borderSize : borderSize * 2;
      style.width = size;
    }
    style.visibility = (isMainMenu) ? "visible" : "hidden";
    onmouseover = new Function("keepOpen();");
    onmouseout = new Function("hide();");
  }
  if(this.hasShadow) {
    this.shadow = document.createElement("div");
    with(this.shadow.style) {
      backgroundColor = shadowColor;
      position = "absolute";
      left = x + sOffX;
      top = y + sOffY;
      zIndex = 1000 + menus.length;
      height = this.main.style.height;
      width = this.main.style.width;
      visibility = (isMainMenu) ? "visible" : "hidden";
    }
    document.body.appendChild(this.shadow);
    this.siframe = createIFrame(this, true);
  }
  this.iframe = createIFrame(this, false);
}

function separator(sSize, sColor) {
  if(!this.sepItems) {
    var div = document.createElement("div");
    with(div.style) {
      backgroundColor = sColor;
      padding = 0;
      position = "absolute";
      if(this.orientation == "horizontal") {
        height = this.size - this.borderSize * 2;
        width = sSize;
        left = this.position;
        top = this.borderSize;
      } else {
        height = sSize;
        width = this.size - this.borderSize * 2;
        left = this.borderSize;
        top = this.position;
      }
    }
    var img = document.createElement("img");
    img.src = blank.src;
    img.height = div.style.pixelHeight;
    img.width = div.style.pixelWidth;
    div.appendChild(img);
    this.main.appendChild(div);
    div.style.visibility = "inherit";

    if(this.orientation == "horizontal")
      this.main.style.width = this.main.offsetWidth + sSize;
    else
      this.main.style.height = this.main.offsetHeight + sSize;
    this.position += sSize;

    this.iframe.style.height = this.main.offsetHeight;
    this.iframe.style.width = this.main.offsetWidth;

    if(this.hasShadow) {
      this.shadow.style.height = this.main.style.height;
      this.shadow.style.width = this.main.style.width;
      this.siframe.style.height = this.main.offsetHeight;
      this.siframe.style.width = this.main.offsetWidth;
    }
  }
}

function item(content, link, target, iSize, alignment, menuToShow, szImage) {
  alignment = alignment.toLowerCase();
  var div = document.createElement("div");
  this.main.appendChild(div);
  if(this.orientation == "horizontal") {
    div.style.height = this.size - this.borderSize*2;
    div.style.width = iSize;
  } else {
    div.style.height = iSize;
    div.style.width = this.size - this.borderSize*2;
  }

  with(div.style) {
    if(this.bgOut.indexOf("img:") != -1)
      background = "url(" + this.bgOut.substr(4) + ")";
    else
      backgroundColor = this.bgOut;
    padding = 0;
    position = "absolute";
    if(this.orientation == "horizontal") {
      left = this.position;
      top = this.borderSize;
    } else {
      left = this.borderSize;
      top = this.position;
    }
  }

  var fnt = document.createElement("font");
  fnt.face = this.fontFace;
  fnt.color = this.textColorOut;
  fnt.style.fontSize = this.fontSize + "pt";
  if(this.fontStyleOut.indexOf("bold") != -1)
    fnt.style.fontWeight = "bold";
  else if(this.fontStyleOut.indexOf("italic") != -1)
    fnt.style.fontStyle = "italic";
  else if(this.fontStyleOut.indexOf("underline") != -1)
    fnt.style.textDecoration = "underline";

  var szMenuFunc;
  if(menuToShow != 0)
    szMenuFunc = "showMenu(" + menuToShow + ", " + (menus.length - 1) + ", " + (this.items.length)
      + ", " + this.offsetX + ", " + this.offsetY + ");";
  else
    szMenuFunc = "hideAfter(" + (menus.length-1) + ");";

  var dwSize = this.size - this.borderSize * 2;
  if(this.orientation == "horizontal")
    dwSize = iSize;
  else
    dwSize = this.size - this.borderSize * 2;

  if(!isNaN(this.showChar)) this.showChar = String.fromCharCode(this.showChar);
  var imgOut, szOverParam = "none", szOutParam = "none";
  if(this.showChar.indexOf("rollover:") != -1) {
    var aryChar = this.showChar.split(":");
    imgOut = document.createElement("img");
    imgOut.src = aryChar[1];
    imgOut.border = 0;
    szOverParam = aryChar[2];
    szOutParam = aryChar[1];
  } else
    imgOut = document.createTextNode(this.showChar);
  var fntChar = fnt.cloneNode(true);
  if(menuToShow != 0)
    fntChar.appendChild(imgOut);
  else {
    szOverParam = "none";
    szOutParam = "none";
    fntChar.innerHTML = "&nbsp;";
  }

  var szOverFunc = "", szOutFunc = "";
  var aryContent;
  var rollover;
  if(content.indexOf("rollover:") != -1) {
    aryContent = content.split(":");
    content = document.createElement("img");
    content.src = aryContent[1];
    content.border = 0;
    margin = 0;
    this.docMargin = 0;
    div.style.padding = 0;
    rollout = aryContent[1];
    rollover = aryContent[2];
  }

  var tbl = document.createElement("table");
  var bdy = document.createElement("tbody");
  var row = document.createElement("tr");
  var td1 = document.createElement("td");
  var td2 = td1.cloneNode(false);

  tbl.border = 0;
  tbl.cellPadding = 0;
  tbl.cellSpacing = 0;
  tbl.width = dwSize - this.margin * 2;
  div.appendChild(tbl);
  tbl.appendChild(bdy);
  bdy.appendChild(row);

  if(content.src)
    fnt.appendChild(content);
  else
    fnt.innerHTML = content;
  td1.align = alignment;
  td1.width = (content.src || this.showChar == "" || this.showChar == 0) ? "100%" : "80%";
  td1.style.paddingLeft = this.margin;
  td1.style.paddingTop = this.margin;
  row.appendChild(td1);
  td1.appendChild(fnt);

  if(!(content.src || this.showChar == "" || this.showChar == 0)) {
    td2.align = "right";
    td2.width = "20%";
    td2.style.paddingTop = this.margin;
    row.appendChild(td2);
    td2.appendChild(fntChar);
  }

  link = link.replace(/[']/g, "\\'");
  link = link.replace(/\"/g, "\\'");

  if(!content.src) {
    szOverFunc = "html(this, '" + this.bgOver + "', '" + this.textColorOver + "', '" +
      this.fontStyleOver + "', '" + szOverParam + "');";
    szOutFunc = "html(this, '" + this.bgOut + "', '" + this.textColorOut + "', '" +
      this.fontStyleOut + "', '" + szOutParam + "');";
    if(link != "" && link != "#") {
      szOverFunc += "status='" + content + "';";
      szOutFunc += "status='';";
    }
  } else {
    szOverFunc = "roll(this, '" + rollover + "');";
    szOutFunc = "roll(this, '" + rollout + "');";
  }

  if(this.showOnClick && menuToShow != 0)
    div.onmouseover = new Function("reset(" + (menus.length - 1) + ", " + menuToShow + ");" +
      szOverFunc);
  else
    div.onmouseover = new Function(szMenuFunc + szOverFunc);

  if(menuToShow != 0) {
    if(!content.src)
      this.activeItems[this.activeItems.length] = "html(menus[" + (menus.length-1) + "].items[" +
        this.items.length + "], '" + this.bgOut + "', '" + this.textColorOut + "', '" +
        this.fontStyleOut + "', '" + szOutParam + "');";
    else
      this.activeItems[this.activeItems.length] = "roll(menus[" + (menus.length-1) + "].items[" +
        this.items.length + "], '" + rollout + "');";
      if(link != "" && link != "#") this.activeItems[this.activeItems.length-1] += "status='';";
  }
  else
    div.onmouseout = new Function(szOutFunc);

  if(link != "" && link != "#") {
    if(target != "")
      div.onmouseup = new Function("window.open('" + link + "', '" + target + "');");
    else
      div.onmouseup = new Function("location.href = '" + link + "';");
  }

  if(this.showOnClick && menuToShow != 0) div.onmouseup = new Function(szMenuFunc + szOverFunc);
  div.style.visibility = "inherit";
  if(this.sepItems) {
    if(this.orientation == "horizontal")
      this.main.style.width = this.main.offsetWidth + iSize + this.borderSize;
    else
      this.main.style.height = this.main.offsetHeight + iSize + this.borderSize;
    this.position += iSize + this.borderSize;
  } else {
    if(this.orientation == "horizontal")
      this.main.style.width = this.main.offsetWidth + iSize;
    else
      this.main.style.height = this.main.offsetHeight + iSize;
    this.position += iSize;
  }

  with(this.main) {
    this.iframe.style.height = offsetHeight;
    this.iframe.style.width = offsetWidth;
    if(this.hasShadow) {
      this.shadow.style.height = style.height;
      this.shadow.style.width = style.width;
      this.siframe.style.height = offsetHeight;
      this.siframe.style.width = offsetWidth;
    }
  }
  this.items[this.items.length] = div;
}

function html(elm, bgChange, clrText, fontStyle, szCharParam) {
  var szBold, szItalic, szUnderline;
  if(bgChange.indexOf("img:") != -1)
    elm.style.background = "url(" + bgChange.substr(4) + ")";
  else
    elm.style.backgroundColor = bgChange;
  elm.style.cursor = (elm.onmouseup) ? "hand" : "default";
  szBold = (fontStyle.indexOf("bold") != -1) ? "bold" : "normal";
  szItalic = (fontStyle.indexOf("italic") != -1) ? "italic" : "normal";
  szUnderline = (fontStyle.indexOf("underline") != -1) ? "underline" : "none";

  if(elm.firstChild.tagName == "TABLE") {
    var el = elm.firstChild.firstChild.firstChild.firstChild.firstChild;
    el.color = clrText;
    el.style.fontWeight = szBold;
    el.style.fontStyle = szItalic;
    el.style.textDecoration = szUnderline;

    var el = elm.firstChild.firstChild.firstChild.lastChild.firstChild;
    if(szCharParam != "none")
      el.firstChild.src = szCharParam;
    else {
      el.color = clrText;
      el.style.fontWeight = szBold;
      el.style.fontStyle = szItalic;
      el.style.textDecoration = szUnderline;
    }
  } else {
    var el = elm.firstChild;
    el.color = clrText;
    el.style.fontWeight = szBold;
    el.style.fontStyle = szItalic;
    el.style.textDecoration = szUnderline;
  }
}

function reset(num, sNum) {
  for(var i = 0; i < menus[num].activeItems.length; i++)
    eval(menus[num].activeItems[i]);
  for(i = num + 1; i < menus.length; i++) {
    if(i != sNum) {
      if(menus[i].hasShadow) {
        menus[i].shadow.style.visibility = "hidden";
        menus[i].siframe.style.visibility = "hidden";
      }
      menus[i].main.style.visibility = "hidden";
      menus[i].iframe.style.visibility = "hidden";
      menus[i].animate = true;
    }
  }
}

function roll(elm, source) {
  elm.style.cursor = (elm.onmouseup) ? "hand" : "default";
  elm.firstChild.firstChild.firstChild.firstChild.firstChild.firstChild.src = source;
}

function showMenu(num, pNum, iNum, offsetX, offsetY) {
  var pMenu = menus[pNum];
  var pItem = pMenu.items[iNum];
  var cMenu = menus[num];

  if(cMenu.main.style.visibility != "visible") {
    hideAfter(pNum);
    var showX = pMenu.main.offsetLeft, showY = menus[pNum].main.offsetTop;
    if(pMenu.orientation == "horizontal") {
      if(pMenu.items.length > iNum) {
        showY += pMenu.main.offsetHeight;
        showX += pItem.offsetLeft;
      }
    } else {
      if(pMenu.items.length > iNum) {
        showX += pMenu.main.offsetWidth;
        showY += pItem.offsetTop;
      }
    }

    var bodyHeight = 0, bodyWidth = 0;
    var scrollX = 0, scrollY = 0;
    if(docType) {
      with(document.getElementsByTagName("HTML")[0]) {
        bodyHeight = offsetHeight;
        bodyWidth = offsetWidth;
        scrollX = scrollLeft;
        scrollY = scrollTop;
      }
    } else {
      with(document.body) {
        bodyHeight = clientHeight;
        bodyWidth = clientWidth;
        scrollX = scrollLeft;
        scrollY = scrollTop;
      }
    }

    if(showX + cMenu.main.offsetWidth > bodyWidth + scrollX) {
      showX -= (showX + cMenu.main.offsetWidth) - (bodyWidth + scrollX);
      if(cMenu.hasShadow) showX -= cMenu.sOffX;
    }
    if(showY + cMenu.main.offsetHeight > bodyHeight + scrollY) {
      showY -= (showY + cMenu.main.offsetHeight) - (bodyHeight + scrollY);
      if(cMenu.hasShadow) showY -= cMenu.sOffY;
    }

    showX += offsetX;
    showY += offsetY;
    cMenu.main.style.left = showX;
    cMenu.main.style.top = showY;
    cMenu.iframe.style.left = showX;
    cMenu.iframe.style.top = showY;

    if(cMenu.hasShadow) {
      cMenu.shadow.style.left = showX + cMenu.sOffX;
      cMenu.shadow.style.top = showY + cMenu.sOffY;
      cMenu.siframe.style.left = cMenu.shadow.offsetLeft;
      cMenu.siframe.style.top = cMenu.shadow.offsetTop;
    }

    if(pMenu.hasAnimations && cMenu.animate) {
      if(pMenu.animationType >= 24) {
        var szAnim;
        switch(pMenu.animationType) {
          case 24: szAnim = "Pixelate(duration=.5,maxSquare=25)"; break;
          case 25: szAnim = "Iris(duration=.5)"; break;
          case 26: szAnim = "Slide(duration=.5,slideStyle=SWAP,bands=0)"; break;
          default: szAnim = "Fade(duration=.5)"; break;
        }
        cMenu.main.style.filter = "progid:DXImageTransform.Microsoft." + szAnim;
        cMenu.shadow.style.filter = "progid:DXImageTransform.Microsoft." + szAnim;
      } else {
        cMenu.main.style.filter = "revealTrans(duration=.5,transition=" +
          menus[pNum].animationType + ")";
        if(cMenu.hasShadow) cMenu.shadow.style.filter = "revealTrans(duration=.5,transition=" +
          menus[pNum].animationType + ")";
      }
      cMenu.main.filters[0].apply();
      if(cMenu.hasShadow) cMenu.shadow.filters[0].apply();
    }

    cMenu.main.style.visibility = "visible";
    cMenu.iframe.style.visibility = "visible";
    if(cMenu.hasShadow) {
      cMenu.shadow.style.visibility = "visible";
      cMenu.siframe.style.visibility = "visible";
    }
    if(cMenu.animate && pMenu.hasAnimations) {
      cMenu.main.filters[0].play();
      if(cMenu.hasShadow) cMenu.shadow.filters[0].play();
    }
    cMenu.animate = false;
  }
}

function hideAfter(num) {
  for(var i = num + 1; i < menus.length; i++) {
    if(!menus[i].isMainMenu) {
      if(menus[i].hasShadow) {
        menus[i].shadow.style.visibility = "hidden";
        menus[i].siframe.style.visibility = "hidden";
      }
      menus[i].main.style.visibility = "hidden";
      menus[i].iframe.style.visibility = "hidden";
      menus[i].animate = true;
    }
  }
  for(var i = num; i < menus.length; i++)
    for(var j=  0; j < menus[i].activeItems.length; j++)
      eval(menus[i].activeItems[j]);
}

var wait = 500;
var hideTimer;

function keepOpen() {
  if(hideTimer != null)
    clearTimeout(hideTimer);
}

function hide() {
  hideTimer = setTimeout("hideAll()", wait);
}

function hideAll() {
  for(var i = 0; i < menus.length; i++) {
    if(!menus[i].isMainMenu) {
      if(menus[i].hasShadow) {
        menus[i].shadow.style.visibility = "hidden";
        menus[i].siframe.style.visibility = "hidden";
      }
      menus[i].main.style.visibility = "hidden";
      menus[i].iframe.style.visibility = "hidden";
      menus[i].animate = true;
    }
  }
  for(i = 0; i < menus.length; i++)
    for(var j = 0; j < menus[i].activeItems.length; j++)
      eval(menus[i].activeItems[j]);
}

function debug() {
  var win = window.open();
  win.document.open();
  win.document.write('<textarea cols=50 rows=25 wrap=virtual>' + this.main.innerHTML + '</textarea>');
  win.document.close();
  win.focus();
}

function createIFrame(mnu, forShadow) {
  var div = (forShadow) ? mnu.shadow : mnu.main;
  var fra = document.createElement("iframe");

  with(fra.style) {
    backgroundColor = div.style.backgroundColor;
    position = div.style.position;
    left = div.offsetLeft;
    top = div.offsetTop;
    zIndex = div.style.zIndex - 100;
    height = div.offsetHeight;
    width = div.offsetWidth;
  }
  fra.frameBorder = 0;
  fra.border = 0;
  fra.src = "";
  fra.scrolling = "no";
  fra.style.visibility = div.style.visibility;
  document.body.appendChild(fra);
  return fra;
}

function floatMenu(scrWidth, scrHeight, mrgLeft, adjustNum) {
  if(this.isMainMenu) {
    var bodyWidth = 0, mrg = 0;
    if(docType) {
      mrg = mrgLeft + 10;
      bodyWidth = document.getElementsByTagName("BODY")[0].offsetWidth;
    } else {
      mrg = 10;
      bodyWidth = document.body.scrollWidth;
    }

    if(adjustNum == 0 || adjustNum == 2) {
      var menuLeft = Math.ceil(this.main.offsetLeft + (screen.width - scrWidth)/2);
      this.main.style.left = Math.ceil(menuLeft - (screen.width - bodyWidth)/2 + mrg);
      this.iframe.style.left = this.main.offsetLeft;
    }
    if(adjustNum == 1 || adjustNum == 2) {
      this.main.style.top = this.main.offsetTop + (screen.height - scrHeight)/2;
      this.iframe.style.top = this.main.offsetTop;
    }

    if(this.hasShadow) {
      this.shadow.style.left = this.main.offsetLeft + this.sOffX;
      this.shadow.style.top = this.main.offsetTop + this.sOffY;
      this.siframe.style.left = this.shadow.offsetLeft;
      this.siframe.style.top = this.shadow.offsetTop;
    }
    window.onresize = new Function("location.reload();");
  }
}

var menus = new Array();
