// <script>
/*
 (C) Copyright  2002 ACSYS, Inc.  All Rights Reserved. 
 Author:	Jon Scott-Sheldon
 Page:		Generic Dynamic Fly-Out Menu Library

 Built using the DynAPI 2 Cross Browser DHTML library.
 For DynAPI documentation see http://dynapi.sourceforge.net

 Dependencies:
 /scripts/dhtmllib.js
*/

function Show(e, sMenu)
{
  if (window[sMenu])
    if (window[sMenu].ShowMenu)
      window[sMenu].ShowMenu(e, sMenu);
}

function Hide(e, sMenu)
{
  if (window[sMenu])
    if (window[sMenu].HideMenu)
      window[sMenu].HideMenu(e, sMenu);
}

function IsParent(pmenu,cmenu)
{
  if (!cmenu.ParentMenu) return false;
  while (cmenu && cmenu != pmenu)
    cmenu = cmenu.ParentMenu;
  return cmenu && cmenu == pmenu;
}

DynAPI.onResize = function() { HandleResize(); }

var arrRegisteredMenus = [];
var iMoreImgWidth = 9;
var iMoreImgHeight = 22;
var sMoreImg = new Image();
sMoreImg.src = "images/MenuArrow.gif";

var iMoreImgOverWidth = 9;
var iMoreImgOverHeight = 22;
var sMoreImgOver = new Image();
sMoreImgOver.src = "images/menuArrowDown.gif";

var imgPixelClr = new Image();
imgPixelClr.src = "images/pixelClr.gif";

function acsysDynMenu(pI,iW,iH,x,y,sBg,sBgO,iB,sBoC,iP,sDir,fMOv,fMOu,sHImg)
{
  this.DynLayer=DynLayer;
  this.DynLayer();
  this.W=iW;
  this.H=iH;
  this.x=x||0;
  this.y=y||0;
  this.Bg=sBg||"";
  this.BgO=sBgO||this.Bg;
  this.BoC=sBoC||"";
  this.B=iB||0;
  this.P=iP||0;
  this.Dir=sDir;
  this.Active=false;
  this.ActSM=false;
  this.ActI=-1;
  this.CustomMouseOver = (fMOv) ? new Function("",fMOv) : null;
  this.CustomMouseOut = (fMOu) ? new Function("",fMOu) : null;
  this.HImg=sHImg||"";
  this.Items=[];
  this.ParentItem=pI;
  this.bDrawn=false;
  this.ParentMenu=pI?pI.Menu:pI;
  if (this.ParentItem)
  {
    this.ParentItem.SubMenu=this;
    this.ParentItem.HasSubMenu=true;
  }
  this.addEventListener(acsysDynMenu.listener);
  this.index=arrRegisteredMenus.length;
  this.DynBorder=new DynLayer("m" + this.index + "b", 0,0,this.W, 0, this.BoC || null, false, 10);
  arrRegisteredMenus[this.index]=this;
	return this;
}
acsysDynMenu.prototype = new DynLayer();
acsysDynMenu.listener = new EventListener();

acsysDynMenu.listener.onmouseout = function(e)
{
  var o=e.getSource();
  var x=e.getPageX(),y=e.getPageY();

  if (!bPointInRange(x, y, 
                     [o.getPageX(),o.getPageX()+o.getWidth(), 
                      o.getPageY(),o.getPageY()+o.getHeight()])&&is.ns4)
  {
    if (o.ActI > -1)
      if (o.Items[o.ActI].HasSubMenu)
        o.Items[o.ActI].SubMenu.HideMenu(null,null,x,y);
    o.ActI=-1;
    o.ActSM=false;
  }

  if (o.ActI>-1) return;
  if (o.ActSM) return;

  o.Active = false;
  o.setVisible(false);

  if (o.ParentMenu) o.ParentMenu.HideMenu(null,null,e.getPageX(),e.getPageY());
  if (o.CustomMouseOut) o.CustomMouseOut();
}

// Public Methods

acsysDynMenu.prototype.Draw = function()
{
  var iMenuHeight = this.B;
  
  var htmContent = new String();
  var iWidth,item;
  
  if (this.Items.length > 0)
    iWidth = (this.Items[0].HasSubMenu == true) ? (this.W - ((2 * this.B) + (4 * this.P) + iMoreImgWidth))
                                                : (this.W - (2 * (this.B + this.P)));

  for (var i=0,len=this.Items.length; i<len;++i)
  {
    item=this.Items[i];
    htmContent = "<table width='" + (this.W - (2 *  this.B)) + "' " +
                 "border='0' cellpadding='" + this.P + "' cellspacing='0'>" +
                 "<tr><td" + item.htmCss + " width='" + iWidth + "'>" +
                 "<a href=\"" + item.Url + "\"" + item.htmCss + ">" +
                 (this.Items[i].Img ? "<img src='" + item.Img + "' name='m" + this.index + "i" + i + "' id='m" + this.index + "i" + i + "'/>" : item.Label) +
                 "</a></td>" +
                 "<td width='" + iMoreImgWidth + "'>" +
                 "<img src='" + 
                 ((item.HasSubMenu == true)?sMoreImg.src:imgPixelClr.src) +
                 "' border='0'" +
                 " width='" + ((item.HasSubMenu==true)?iMoreImgWidth:2) + "'" +
                 " height='" + this.H + "'" +
                 " name='more" + this.index + "i" + i + "' id='more" + this.index + "i" + i + "'/>" +
                 "</td></tr></table>";

    item.setVisible(false);
    item.setHTML(htmContent);
    if (item.Bg)
      item.setBgColor(item.Bg);
    this.DynBorder.addChild(item);
    item.setWidth(this.W-(2*this.B));
    item.setHeight(this.H+4);
    item.setZIndex(1000+""+this.index+item.index);
    item.setVisible(true);
    item.moveTo(this.B,iMenuHeight);
    iMenuHeight+=this.H+this.B+4;
  }
  this.addChild(this.DynBorder);
  this.DynBorder.setSize(this.W,iMenuHeight);
  this.DynBorder.setVisible(true);
  this.DynBorder.moveTo(2,2);
  this.setZIndex(1000-this.index);
  this.setSize(this.W+4,iMenuHeight+4);
  this.moveTo(-2,-2);
  this.setVisible(false);
  this.bDrawn=true;
}

acsysDynMenu.prototype.ShowMenu = function(e,sMenuName,cx,cy)
{
  if (this.Active) return true;
  var x=0,y=0;
  if (!this.bDrawn) this.Draw();
  if (sMenuName)
  {
    var theLayer=null;
    if (is.ns4)
    {
      theLayer=DynAPI.document.all[sMenuName+"Layer"];
      switch (this.Dir)
      {
        case "l":
          x=theLayer.getPageX()-(this.getWidth())+4;
          y=theLayer.getPageY()-this.B;
          break;
        case "r":
          x=theLayer.getPageX()+theLayer.getWidth();
          y=theLayer.getPageY()-this.B;
          break;
        case "d":
          x=theLayer.getPageX();
          y=theLayer.getPageY()+(this.HImg ? document.images[this.HImg].height : theLayer.getHeight());
          break;
        case "u":
          x=theLayer.getPageX()-this.B;
          y=theLayer.getPageY()-(this.getHeight());
      }
    }
    else
    {
      theLayer = (is.ie4) ? document.all[sMenuName+"Link"]
                          : document.getElementById(sMenuName+"Link");
      switch (this.Dir)
      {
        case "l":
          if (!is.ie4)
            if (theLayer.hasChildNodes())
              if (theLayer.tagName == "A" && theLayer.firstChild.tagName == "IMG")
                theLayer = theLayer.firstChild;
          x=acsysGetPageX(theLayer)-(this.getWidth())+4;
          y=acsysGetPageY(theLayer);
          break;
        case "r":
          if (!is.ie4)
            if (theLayer.hasChildNodes())
              if (theLayer.tagName == "A" && theLayer.firstChild.tagName == "IMG")
                theLayer = theLayer.firstChild;
          x=acsysGetPageX(theLayer)+acsysGetWidth(theLayer)+2;
          y=acsysGetPageY(theLayer);
          break;
        case "d":
          x=acsysGetPageX(theLayer);
          y=acsysGetPageY(theLayer)+acsysGetHeight(theLayer);
          break;
        case "u":
          x=acsysGetPageX(theLayer);
          y=acsysGetPageY(theLayer)-this.getHeight();
      }
    }
    if (this.CustomMouseOver) this.CustomMouseOver();
  }
  else
  {
    switch (this.Dir)
    {
      case "l":
        x=cx-(this.getWidth()+this.ParentMenu.getWidth())+8+(2*this.B);
        y=cy-this.B;
        break;
      default:
        x=cx;
        y=cy-this.B;
        break;
    }
  }

  if (is.ie)  
  {
    for (var i=0, len=arrRegisteredMenus.length;i<len;++i)
    {
      if (arrRegisteredMenus[i].Active==true&&!IsParent(arrRegisteredMenus[i],this))
        arrRegisteredMenus[i].HideMenu(e,null,cx,cy)
    }
  }

  this.Active=true;
  this.moveTo(x-2,y-2);
  this.setVisible(true);
}

acsysDynMenu.prototype.HideMenu = function(e,sMenuName,cx,cy)
{
  var x=0,y=0;

  if (sMenuName)
  {
    x=(is.ns4&&!is.ns6)?e.pageX:(is.ie?e.clientX+document.body.scrollLeft:e.clientX+pageXOffset);//acsysGetPageX(e.srcElement);//
    y=(is.ns4&&!is.ns6)?e.pageY:(is.ie?e.clientY+document.body.scrollTop:e.clientY+pageYOffset);//acsysGetPageY(e.srcElement);//
  }
  else
  {
    x=cx;
    y=cy;
  }

  if (bPointInRange(x,y, 
                    [this.getPageX(),this.getPageX()+this.getWidth(), 
                     this.getPageY(),this.getPageY()+this.getHeight()]))
     return;

  this.Active=false;
  this.setVisible(false);

  for (var i=0,len=this.Items.length;i<len;++i)
    if (this.Items[i].Bg != this.Items[i].BgO)
      this.Items[i].setBgColor(this.Items[i].Bg);
    
  if (this.ParentMenu) this.ParentMenu.HideMenu(null,null,x,y);
  if (this.CustomMouseOut) this.CustomMouseOut();
}

acsysDynMenu.prototype.Add = function(sLabel,sURL,sCSSClass,sBg,sBgO,sImgSrc,sImgSrcOver)
{
  var i=this.Items.length;
  this.Items[i]=new acsysDynMenuItem(this,i,sLabel,sURL,sCSSClass,sBg||this.Bg,sBgO||this.BgO,sImgSrc,sImgSrcOver);
}

acsysDynMenu.prototype.a = function(sLabel,sURL,sCSSClass,sBg,sBgO,sImg,sImgO)
{
  var i=this.Items.length;
  this.Items[i]=new acsysDynMenuItem(this,i,sLabel,sURL,sCSSClass,sBg||this.Bg,sBgO||this.BgO,sImg,sImgO);
}

function acsysDynMenuItem(menu,id,sLabel,sURL,sCSSClass,sBg,sBgO,sImg,sImgO)
{
  this.DynLayer=DynLayer;
  this.DynLayer();
  this.index=id;
  this.Label=sLabel;
  this.Url=sURL;
  this.Css=sCSSClass||"";
  this.htmCss=sCSSClass?" class='"+sCSSClass+"'":"";
  this.Bg=sBg||"";
  this.BgO=sBgO||this.Bg;
  this.Img=sImg||"";
  this.ImgO=sImgO||this.Img;
  this.Active=false;
  this.HasSubMenu=false;
  this.Menu=menu;
  this.addEventListener(acsysDynMenuItem.listener);
  return this;
}

acsysDynMenuItem.prototype = new DynLayer();
acsysDynMenuItem.listener = new EventListener();

acsysDynMenuItem.listener.onmouseover = function(e)
{
  var o=e.getSource();

  if (o.HasSubMenu)
    if (!o.SubMenu.bDrawn) o.SubMenu.Draw();

  if (o.Menu.ActI>-1&&is.ns4)
  {
    if (o.Menu.Items[o.Menu.ActI].Bg != o.Menu.Items[o.Menu.ActI].BgO)
      o.Menu.Items[o.Menu.ActI].setBgColor(o.Menu.Items[o.Menu.ActI].Bg);

    if (o.Menu.Items[o.Menu.ActI].HasSubMenu)
    {
      o.Menu.Items[o.Menu.ActI].SubMenu.HideMenu(null, null,e.getPageX(),e.getPageY());
      SwitchImg("more" + o.Menu.index + "i" + o.Menu.Items[o.Menu.ActI].index, "sMoreImg", (is.ns4 ? o.Menu.Items[o.Menu.ActI].elm.document : null));
    }
    
    o.Menu.ActSM = false;
    o.Menu.ActI = -1;
  }

  o.Menu.ActI = o.index;

  for (var i = 0, len = o.Menu.Items.length; i < len; ++i)
  {
    if (i == o.index) continue;

    if (o.Menu.Items[i].Bg != o.Menu.Items[i].BgO)
      o.Menu.Items[i].setBgColor(o.Menu.Items[i].Bg);
    
    if (o.Menu.Items[i].HasSubMenu)
      SwitchImg("more" + o.Menu.index + "i" + o.Menu.Items[i].index, "sMoreImg", (is.ns4 ? o.Menu.Items[i].elm.document : null));


    if (is.ns4)
    {
      if (o.Menu.Items[i].HasSubMenu)
      {
        if (o.Menu.Items[i].SubMenu.getVisible())
        {
          o.Menu.ActSM = false;
          o.Menu.Items[i].SubMenu.Active = false;
          o.Menu.Items[i].SubMenu.setVisible(false);
        }
      }
    }
  }

  if (o.Bg != o.BgO) o.setBgColor(o.BgO);
  if (o.HasSubMenu)
  {
    SwitchImg("more" + o.Menu.index + "i" + o.index, "sMoreImgOver", (is.ns4 ? o.elm.document : null));
    if (!o.SubMenu.getVisible())
    {
      o.SubMenu.ShowMenu(null, null, o.getPageX() + o.getWidth(), o.getPageY())
      o.Menu.ActSM = true;
    }
  }
}

acsysDynMenuItem.listener.onmouseout = function(e)
{
  var o = e.getSource();
  var x = e.getPageX(), y = e.getPageY();
  if (o.HasSubMenu)
  {
    if (bPointInRange(x, y, 
                      [o.SubMenu.getPageX(),o.SubMenu.getPageX()+o.SubMenu.getWidth(), 
                       o.SubMenu.getPageY(),o.SubMenu.getPageY()+o.SubMenu.getHeight()]))
    {
       return;
    }
    else if (o.SubMenu.Active &&
             is.ns4 &&
             bPointInRange(x, y, 
                           [o.getPageX(),parseInt(o.getPageX())+parseInt(o.getWidth())+parseInt(o.Menu.B),
                            o.getPageY(),parseInt(o.getPageY())+parseInt(o.getHeight())+parseInt(o.Menu.B)]))
    {
      return;
    }
    else
    {
      o.Menu.ActSM = false;
      o.Menu.ActI = -1;
      o.SubMenu.HideMenu(null,null,x,y);
    }
  }
  o.Menu.ActI = -1;
  if (o.Bg != o.BgO) o.setBgColor(o.Bg);
  if (o.HasSubMenu) SwitchImg("more" + o.Menu.index + "i" + o.index, "sMoreImg", (is.ns4 ? o.elm.document : null));
}

