function DynElMenu(id, width, xOff, yOff, img_name, parentID)
{
  if (id != null)
  {
    this.id = id;
    this.dynEl = null;    
    this.width = width;
    this.xOff = xOff;
    this.yOff = yOff;

    this.img_name = img_name;
    this.parentID = parentID;
    this.rollImgs = null;
    this.docImg = null;

    this.pre = '';
    this.post = '';

    this.timeoutID = null;

    this.items = new Array();
    this.itemIdx = new Array();

    DynElMenu.menus[id] = this;
    DynElMenu.menuIdx[DynElMenu.menuIdx.length] = this;
  }
}
new DynElMenu(null, null, null, null, null, null);

DynElMenu.menus = new Array();
DynElMenu.menuIdx = new Array();
DynElMenu.timeoutInit = 6000;
DynElMenu.timeoutOver = 4000;
DynElMenu.timeoutOut = 1000;
DynElMenu.tmp;


if (DynEl.ok == true)
{
  /*
   Class methods
  */
    function DynElMenu_get(id)
    {
      return DynElMenu.menus[id];
    }
    DynElMenu.get = DynElMenu_get;

    function DynElMenu_onclick(id, img)
    {
      var i, menu;

      for (i = 0; i < DynElMenu.menuIdx.length; i++)
      {
        menu = DynElMenu.menuIdx[i];
        if (menu.id == id)
        {
          if ((menu.docImg == null) && (img != null))
          {
            menu.docImg = img;
          }
          menu.show();
        }
        else
        {
          menu.hide();
        }
      }
      return false;
    }
    DynElMenu.onclick = DynElMenu_onclick;

    function DynElMenu_timeout(id)
    {
      var menu = DynElMenu.get(id);
      menu.hide();
    }
    DynElMenu.timeout = DynElMenu_timeout;

    function DynElMenu_onclickItem(id, item_id)
    {
      var menu = DynElMenu.get(id);
      menu.hide();
      return menu.onItemEvent(item_id, 'onclick');
    }
    DynElMenu.onclickItem = DynElMenu_onclickItem;

    function DynElMenu_onmouseoverItem(id, item_id)
    {
      var menu = DynElMenu.get(id);
      menu.setTimeout(DynElMenu.timeoutOver);
      return menu.onItemEvent(item_id, 'onmouseover');
    }
    DynElMenu.onmouseoverItem = DynElMenu_onmouseoverItem;

    function DynElMenu_onmouseoutItem(id, item_id)
    {
      var menu = DynElMenu.get(id);
      menu.setTimeout(DynElMenu.timeoutOut);
      return menu.onItemEvent(item_id, 'onmouseout');
    }
    DynElMenu.onmouseoutItem = DynElMenu_onmouseoutItem;

    function DynElMenu_stopit()
    /* Assign as onclick handler for a menu item to close the menu */
    {
      return false;
    }
    DynElMenu.stopit = DynElMenu_stopit;

    function DynElMenu_output()
    {
      var i;
      for (i = 0; i < DynElMenu.menuIdx.length; i++)
      {
        DynElMenu.menuIdx[i].output();
      }
    }
    DynElMenu.output = DynElMenu_output;

    function DynElMenu_getXYOffset(obj)
    /* Find the XY offset of the HTML item this menu is bound to */
    {
      var xyOff = new Array();
      var xyOffParent;

      if(obj.offsetParent != null)
      {
        xyOffParent = DynElMenu.getXYOffset(obj.offsetParent);
      }
      else
      {
        xyOffParent = new Array();
        xyOffParent['x'] = xyOffParent['y'] = 0;
      }
      xyOff['x'] = parseInt(obj.offsetLeft) + xyOffParent['x'];
      xyOff['y'] = parseInt(obj.offsetTop) + xyOffParent['y'];
      return xyOff;
    }
    DynElMenu.getXYOffset = DynElMenu_getXYOffset;

  /*
   Prototype methods
  */
    function DynElMenu_proto_setTimeout(t)
    {
      if (this.timeoutID)
      {
        clearTimeout(this.timeoutID);
      }
      this.timeoutID = 
       setTimeout("DynElMenu.timeout('" + this.id + "');", t);
    }
    DynElMenu.prototype.setTimeout = DynElMenu_proto_setTimeout;

    function DynElMenu_proto_addItem(item)
    {
      item.menuId = this.id;
      this.items[item.id] = item;
      this.itemIdx[this.itemIdx.length] = item;
    }
    DynElMenu.prototype.addItem = DynElMenu_proto_addItem;

    function DynElMenu_proto_onItemEvent(item_id, event)
    {
      var item, meth,
      item = this.items[item_id];

      if (event == 'onclick')
      {
        meth = item.onclick;
      }
      else if (event == 'onmouseover')
      {
        meth = item.onmouseover;
      }
      else
      {
        meth = item.onmouseout;
      }

      if (meth != null)
      {
        return meth(item);
      }
      else
      {
        return true;
      }
    }
    DynElMenu.prototype.onItemEvent = DynElMenu_proto_onItemEvent;

    function DynElMenu_proto_init()
    {
      var i, body;
      body = '';
      for (i = 0; i < this.itemIdx.length; i++)
      {
        body += this.itemIdx[i].output();
      }

      body = this.pre + body + this.post;
      this.dynEl = new DynEl(window, 'dynElMenu' + this.id, body, 0, 0, this.width, null);
    }
    DynElMenu.prototype.init = DynElMenu_proto_init;

    function DynElMenu_proto_show()
    {
      this.rollOn();

      // Move menu over link item
      if (parentEl = document.getElementById(this.parentID))
      {
        xyOff = DynElMenu.getXYOffset(parentEl);
        this.dynEl.moveTo(xyOff['x'] + this.xOff, xyOff['y'] + this.yOff);
      }

      this.dynEl.show();
      this.setTimeout(DynElMenu.timeoutInit);
    }
    DynElMenu.prototype.show = DynElMenu_proto_show;

    function DynElMenu_proto_hide()
    {
      var i;
      this.dynEl.hide();
      this.rollOff();
      if (this.timeOutID != null)
      {
        clearTimeout(this.timeOutID);
      }
      this.timeoutID = null;

      for (i = 0; i < this.itemIdx.length; i++)
      {
        this.itemIdx[i].rollImg('off');
      }
    }
    DynElMenu.prototype.hide = DynElMenu_proto_hide;

    function DynElMenu_proto_output()
    {
      var i, names, item, xyOff, parentEl;
      this.dynEl.output();
      this.dynEl.hide();
      this.dynEl.setStackingOrder(1000);

      // Bind menu item images to menu item objects
      names = new Array();
      for (i = 0; i < this.itemIdx.length; i++)
      {
        if (this.itemIdx[i].imgName)
        {
          names[this.itemIdx[i].imgName] = this.itemIdx[i];
        }
      }
      for (i = 0; i < document.images.length; i++)
      {
        item = names[document.images[i].name];
        if (item != null)
        {
          item.docImg = document.images[i];
        }
      }
    }
    DynElMenu.prototype.output = DynElMenu_proto_output;

    function DynElMenu_proto_setRollImgs(src_on, src_off)
    /* Use to have a new image display when the menu is shown */
    {
      this.rollImgs = new Array();
      this.rollImgs['on'] = new Image();
      this.rollImgs['on'].src = src_on;
      this.rollImgs['off'] = new Image();
      this.rollImgs['off'].src = src_off;
    }
    DynElMenu.prototype.setRollImgs = DynElMenu_proto_setRollImgs;

    function DynElMenu_proto_rollOn()
    {
      if ((this.rollImgs !=  null) && (this.docImg != null))
      {
        this.docImg.src = this.rollImgs['on'].src;
      }
    }
    DynElMenu.prototype.rollOn = DynElMenu_proto_rollOn;

    function DynElMenu_proto_rollOff()
    {
      if ((this.rollImgs !=  null) && (this.docImg != null))
      {
        this.docImg.src = this.rollImgs['off'].src;
      }
    }
    DynElMenu.prototype.rollOff = DynElMenu_proto_rollOff;
  /* */
}


/*
 DynElMenuItem
*/
function DynElMenuItem(id, txt, href, css_class, onmouseover, onmouseout, onclick, imgName)
{
  if (id != null)
  {
    this.id = id;
    this.menuId = null;
    this.txt = txt;
    this.href = href;
    this.css_class = css_class;

    this.pre = '';
    this.post = '';

    this.imgName = imgName;
    this.rollImgs = null;
    this.docImg = null;

    this.onmouseover = onmouseover;
    this.onmouseout = onmouseout;
    this.onclick = onclick;
  }
}
new DynElMenu(null, null, null, null, null, null, null, null);


if (DynEl.ok == true)
{
  function DynElMenuItem_proto_output()
  {
    var str = (
     this.pre + 
     '<a href="' + this.href + '"' + 
       (this.css_class ? (' class="' + this.css_class + '"') : '') +
       ' onclick="return DynElMenu.onclickItem('+"'"+ this.menuId + "', '"+ this.id + "'"+');"' +
       ' onmouseover="return DynElMenu.onmouseoverItem('+"'"+ this.menuId + "', '"+ this.id + "'"+');"' +
       ' onmouseout="return DynElMenu.onmouseoutItem('+"'"+ this.menuId + "', '"+ this.id + "'"+');"' +
     '">' +
      this.txt + '<' + '/a>' + this.post
    );
    return str;
  }
  DynElMenuItem.prototype.output = DynElMenuItem_proto_output;

  function DynElMenuItem_proto_setRollImgs(src_on, src_off)
  {
    this.rollImgs = new Array();
    this.rollImgs['on'] = new Image();
    this.rollImgs['on'].src = src_on;
    this.rollImgs['off'] = new Image();
    this.rollImgs['off'].src = src_off;
    this.onmouseover = DynElMenuItem.rollImgOn;
    this.onmouseout = DynElMenuItem.rollImgOff;
  }
  DynElMenuItem.prototype.setRollImgs = DynElMenuItem_proto_setRollImgs;

  function DynElMenuItem_rollImgOn(item)
  {
    item.rollImg('on');
  }
  DynElMenuItem.rollImgOn = DynElMenuItem_rollImgOn;

  function DynElMenuItem_rollImgOff(item)
  {
    item.rollImg('off');
  }
  DynElMenuItem.rollImgOff = DynElMenuItem_rollImgOff;

  function DynElMenuItem_proto_rollImg(on_off)
  {
    if ((this.rollImgs != null) && (this.docImg != null))
    {
      this.docImg.src = this.rollImgs[on_off].src;
    }
  }
  DynElMenuItem.prototype.rollImg = DynElMenuItem_proto_rollImg;
}

if (DynEl.ok != true)
/* Non-dynel place holders */
{
  /*
   DynElMenu
  */
    function DynElMenu_non_get(id){ return DynElMenu.prototype; }
    DynElMenu.get = DynElMenu_non_get;

    function DynElMenu_non_onclick(id, img){ return true; }
    DynElMenu.onclick = DynElMenu_non_onclick;

    function DynElMenu_non_timeout(id){}
    DynElMenu.timeout = DynElMenu_non_timeout;

    function DynElMenu_non_onclickItem(id, item_id){ return true; }
    DynElMenu.onclickItem = DynElMenu_non_onclickItem;

    function DynElMenu_non_onmouseoverItem(id, item_id){ return true; }
    DynElMenu.onmouseoverItem = DynElMenu_non_onmouseoverItem;

    function DynElMenu_non_onmouseoutItem(id, item_id){ return true; }
    DynElMenu.onmouseoutItem = DynElMenu_non_onmouseoutItem;

    function DynElMenu_non_stopit(){ return false; }
    DynElMenu.stopit = DynElMenu_non_stopit;

    function DynElMenu_non_output(){}
    DynElMenu.output = DynElMenu_non_output;

    function DynElMenu_non_getXYOffset(obj){ return new Array();}
    DynElMenu.getXYOffset = DynElMenu_non_getXYOffset;
  /*
   DynElMenu.prototype
  */
    function DynElMenu_non_proto_setTimeout(t){}
    DynElMenu.prototype.setTimeout = DynElMenu_non_proto_setTimeout;

    function DynElMenu_non_proto_addItem(item){}
    DynElMenu.prototype.addItem = DynElMenu_non_proto_addItem;

    function DynElMenu_non_proto_onItemEvent(item_id, event){ return true;}
    DynElMenu.prototype.onItemEvent = DynElMenu_non_proto_onItemEvent;

    function DynElMenu_non_proto_init(){}
    DynElMenu.prototype.init = DynElMenu_non_proto_init;

    function DynElMenu_non_proto_show(){}
    DynElMenu.prototype.show = DynElMenu_non_proto_show;

    function DynElMenu_non_proto_hide(){}
    DynElMenu.prototype.hide = DynElMenu_non_proto_hide;

    function DynElMenu_non_proto_output(){}
    DynElMenu.prototype.output = DynElMenu_non_proto_output;

    function DynElMenu_non_proto_setRollImgs(src_on, src_off){}
    DynElMenu.prototype.setRollImgs = DynElMenu_non_proto_setRollImgs;

    function DynElMenu_non_proto_rollOn(){}
    DynElMenu.prototype.rollOn = DynElMenu_non_proto_rollOn;

    function DynElMenu_non_proto_rollOff(){}
    DynElMenu.prototype.rollOff = DynElMenu_non_proto_rollOff;
  /*
   DynElMenuItem.prototype
  */
    function DynElMenuItem_non_proto_output(){}
    DynElMenuItem.prototype.output = DynElMenuItem_non_proto_output;

    function DynElMenuItem_non_proto_setRollImgs(src_on, src_off){}
    DynElMenuItem.prototype.setRollImgs = DynElMenuItem_non_proto_setRollImgs;

    function DynElMenuItem_non_rollImgOn(item){}
    DynElMenuItem.rollImgOn = DynElMenuItem_non_rollImgOn;

    function DynElMenuItem_non_rollImgOff(item){}
    DynElMenuItem.rollImgOff = DynElMenuItem_non_rollImgOff;

    function DynElMenuItem_non_proto_rollImg(on_off){}
    DynElMenuItem.prototype.rollImg = DynElMenuItem_non_proto_rollImg;
  /**/
}
