/********************************************************************
   IeTree 1.05                                             2004-09-25

   Tree menu for IE version 5 or higher.
   Also support Mozilla/Gecka based browsers (not 100% though).

   // Markus Gemstad
   http://www.gemstad.com (references, samples etc)
********************************************************************/

// Global variables
var g_arrIeTrees  = new Array();
var g_iIconWidth  = 14;
var g_iIconHeight = 15;

// IeTree(sDiv, sLink, [sIconPath], [sDefaultTarget])
function IeTree(sDiv, sLink, sIconPath, sDefaultTarget)
{
   // Properties & settings
   this.m_sIconPath      = (sIconPath != null) ? sIconPath : "";
   this.m_sDefaultTarget = sDefaultTarget;
   this.m_bExternalLoad  = false;
   this.m_bOpenOnSelect  = true;
   this.m_bDrawOnLoad    = true;

   this.m_iIdSelected = null;
   this.m_iIdLatest   = null;

   this.m_sIeTreeDiv  = sDiv;
   this.m_sIeTreeLink = sLink;

   this.m_oIeTreeDiv  = null;
   this.m_oIeTreeLink = null;

   // Place a reference in the global array and save the index
   this.m_iIndex = g_arrIeTrees.length;
   g_arrIeTrees[g_arrIeTrees.length] = this;

   // Object container arrays
   this.m_arrItems = new Array();
   this.m_arrTypes = new Array();

   // Public functions
   this.draw       = IeTreeDraw;
   this.createHtml = IeTreeCreateHtml;

   this.setVisible = IeTreeSetVisible;
   this.addItem    = IeTreeAddItem;
   this.getItem    = IeTreeGetItem;
   this.selectItem = IeTreeSelectItem;
   this.addType    = IeTreeAddType;
   this.getType    = IeTreeGetType;
   this.toggleOpen = IeTreeToggleOpen;

   // Private functions
   this.init       = IeTreeInit;
   this.clickSign  = IeTreeClickSign;
   this.clickItem  = IeTreeClickItem;

   this.init();
}

function IeTreeInit()
{
   // Create default types
   this.addType("folder", "folder.gif", "folder_open.gif", true);
   this.addType("link", "link.gif", null, true);
   this.addType("blank", "blank.gif", null, true);

   // Get references
   this.m_oIeTreeDiv  = document.getElementById(this.m_sIeTreeDiv);
   this.m_oIeTreeLink = document.getElementById(this.m_sIeTreeLink);
}

function IeTreeSetVisible(bShow)
{
   var sVisible = (bShow) ? "visible" : "hidden";
   this.m_oIeTreeDiv.style.visibility = sVisible;
}

function IeTreeGetType(sType)
{
   var oType = null;
   if(sType != null)
   {
      for(var i=0; i<this.m_arrTypes.length; i++)
      {
         if(this.m_arrTypes[i].m_sName == sType)
            oType = this.m_arrTypes[i];
      }
   }
   return oType;
}

// IeTreeAddItem(iParentId, iId, sName, sType, [sUrl], [sTarget], [sRunOnSignClick], [sRunOnItemClick], [sRunOnItemDblClick], [bVisible])
function IeTreeAddItem(iParentId, iId, sName, sType, sUrl, sTarget, sRunOnSignClick, sRunOnItemClick, sRunOnItemDblClick, bVisible)
{
   var iLevel = 1;
   if(iParentId != null)
   {
      var oParentItem = this.getItem(iParentId);
      oParentItem.m_bHasChild = true;
      iLevel = oParentItem.m_iLevel+1;
   }
   if(this.m_sDefaultTarget != null && sTarget == null)
      sTarget = this.m_sDefaultTarget;
   this.m_arrItems[this.m_arrItems.length] = new IeTreeItem(iParentId, iId, sName, this.getType(sType), sUrl, sTarget, sRunOnSignClick, sRunOnItemClick, sRunOnItemDblClick, bVisible, iLevel);
}

function IeTreeGetItem(iId)
{
   var oItem = null;
   if(iId != null)
   {
      for(var i=0; i<this.m_arrItems.length; i++)
      {
         if(this.m_arrItems[i].m_iId == iId)
            oItem = this.m_arrItems[i];
      }
   }
   return oItem;
}

// IeTreeAddType(sName, sIcon, [sOpenIcon])
function IeTreeAddType(sName, sIcon, sOpenIcon, bUseIconPath)
{
   if(bUseIconPath)
   {
      sIcon     = this.m_sIconPath+sIcon;
      sOpenIcon = (sOpenIcon != null) ? this.m_sIconPath+sOpenIcon : null;
   }
   this.m_arrTypes[this.m_arrTypes.length] = new ItemType(sName, sIcon, sOpenIcon);
}

function IeTreeClickSign(iId)
{
   var oItem = this.getItem(iId);
   this.m_iIdLatest = iId;
   this.toggleOpen(null, oItem);

   if(oItem.m_sRunOnSignClick != null)
      eval(oItem.m_sRunOnSignClick);
}

function IeTreeClickItem(iId, bGoToUrl)
{
   var oItem = this.getItem(iId);

   this.m_iIdLatest = iId;

   if(this.m_bOpenOnSelect)
      this.toggleOpen(null, oItem);
   this.selectItem(null, oItem);

   if(bGoToUrl)
      oItem.click(this.m_iIndex);

   if(oItem.m_sRunOnItemClick != null)
      eval(oItem.m_sRunOnItemClick);
}

function IeTreeToggleOpen(iId, oItem)
{
   if(oItem == null)
      oItem = this.getItem(iId);
   else
      iId = oItem.m_iId;

   if(oItem.m_bHasChild)
   {
      var oDiv = document.getElementById("divIeTreeItem"+iId);
      var oImg = document.getElementById("imgIeTreeItem"+iId);

      oItem.m_bOpen = !oItem.m_bOpen;
      if(oItem.m_bOpen)
      {
         if(!oItem.m_bChildDrawn)
         {
            oDiv.innerHTML = this.createHtml(iId);
            oItem.m_bChildDrawn = true;
         }
         oDiv.style.display = "";
         oImg.src = oItem.m_oType.m_sOpenIcon;
      }
      else
      {
         oDiv.style.display = "none";
         oImg.src = oItem.m_oType.m_sIcon;
      }
   }
}

function IeTreeSelectItem(iId, oItem)
{
   if(oItem == null)
      oItem = this.getItem(iId);
   else
      iId = oItem.m_iId;

   if(this.m_iIdSelected != null)
   {
      document.getElementById("aIeTreeItem"+this.m_iIdSelected).className = "txtMenuItem";
      this.getItem(this.m_iIdSelected).m_bSelected = false;
   }

   this.m_iIdSelected = iId;
   oItem.m_bSelected = true;
   document.getElementById("aIeTreeItem"+iId).className = "txtMenuItemSel";
}

function IeTreeDraw()
{
   this.m_oIeTreeDiv.innerHTML = this.createHtml();
   if(this.m_bDrawOnLoad) // Draw entire meny at once
   {
      var oItem = null;
      for(var i=0; i<this.m_arrItems.length; i++)
      {
         oItem = this.m_arrItems[i];
         if(oItem.m_bHasChild && oItem.m_bVisible)
         {
            var oDiv = document.getElementById("divIeTreeItem"+oItem.m_iId);
            if(!oItem.m_bChildDrawn)
            {
               oDiv.innerHTML = this.createHtml(oItem.m_iId);
               oItem.m_bChildDrawn = true;
            }
         }
      }
   }
}

function IeTreeCreateHtml(iId)
{
   var sHtml      = "";
   var oItem      = null;
   var sChildHtml = null;

   for(var i=0; i<this.m_arrItems.length; i++)
   {  
      sChildHtml = null;
      oItem      = this.m_arrItems[i];

      if(oItem.m_iParentId == iId) // If item is child to iId
      {
         if(oItem.m_bOpen && oItem.m_bHasChild)
         {
            sChildHtml = this.createHtml(oItem.m_iId);
            oItem.m_bChildDrawn = true;
         }
         sHtml += oItem.createHtml(this.m_iIndex, sChildHtml);
      }
   }
   return sHtml;
}


/*********************************************************/
function IeTreeItem(iParentId, iId, sName, oType, sUrl, sTarget, sRunOnSignClick, sRunOnItemClick, sRunOnItemDblClick, bVisible, iLevel)
{
   // Properties
   this.m_iParentId = iParentId;
   this.m_iId       = iId;
   this.m_sName     = sName;
   this.m_oType     = oType;
   this.m_sUrl      = sUrl;
   this.m_sTarget   = sTarget;
   this.m_iLevel    = iLevel;
   this.m_bVisible  = (bVisible == null) ? true : bVisible;

   this.m_sRunOnSignClick    = sRunOnSignClick;
   this.m_sRunOnItemClick    = sRunOnItemClick;
   this.m_sRunOnItemDblClick = sRunOnItemDblClick;

   this.m_bHasChild   = false; // Has this item any children
   this.m_bChildDrawn = false; // Has children (if any) been drawn
   this.m_bOpen       = false; // Is this item open (is children visible)
   this.m_bSelected   = false; // Is this item selected
   this.m_bLoaded     = false; // Has this items children been loaded

   // Public functions
   this.createHtml = IeTreeItemCreateHtml;
   this.click      = IeTreeItemClick;
}

function IeTreeItemCreateHtml(iContainer, sChildHtml)
{
   var sHtml       = "";
   var sBlank      = "";
   var sChildDiv   = "";
   var sIcon       = (this.m_bOpen)     ? this.m_oType.m_sOpenIcon : this.m_oType.m_sIcon;
   var sClass      = (this.m_bSelected) ? "txtMenuItemSel" : "txtMenuItem";
   var sOnDblClick = (this.m_sRunOnItemDblClick != null) ? " onDblClick=\""+this.m_sRunOnItemDblClick+"\"" : "";

   if(!this.m_bVisible)
      return "";

   sChildDiv += "<DIV ID=\"divIeTreeItem"+this.m_iId+"\"";
   sChildDiv += (sChildHtml != null) ? ">"+sChildHtml : " STYLE=\"display:none;\">";
   sChildDiv += "</DIV>";

   for(var i=1; i<this.m_iLevel; i++)
      sBlank += "<IMG SRC=\""+g_arrIeTrees[iContainer].getType("blank").m_sIcon+"\" BORDER=0 WIDTH="+g_iIconWidth+" HEIGHT="+g_iIconHeight+">";
   var iWidth = g_iIconWidth*i;

   var sIcon = "<A HREF=# onClick=\"g_arrIeTrees["+iContainer+"].clickSign("+this.m_iId+");return false;\" onFocus=\"this.blur();\"><IMG SRC=\""+sIcon+"\" ID=\"imgIeTreeItem"+this.m_iId+"\" BORDER=0 WIDTH="+g_iIconWidth+" HEIGHT="+g_iIconHeight+"></A>";
   var sLink = "<A HREF=# onClick=\"g_arrIeTrees["+iContainer+"].clickItem("+this.m_iId+",true);return false;\" "+sOnDblClick+"onFocus=\"this.blur();\" CLASS="+sClass+" ID=\"aIeTreeItem"+this.m_iId+"\">"+this.m_sName+"</A>";

   sHtml += "<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>\n";
   sHtml += " <TR>\n";
   sHtml += "   <TD WIDTH="+iWidth+" VALIGN=top>"+sBlank+sIcon+"</TD>\n";
   sHtml += "   <TD HEIGHT=\"16\">"+sLink+"</TD>\n";
   sHtml += " </TR>\n";
   sHtml += "</TABLE>\n";
   sHtml += sChildDiv;

   return sHtml;
}

function IeTreeItemClick(iContainer)
{
   if(this.m_sUrl != null)
   {
      var oTree = g_arrIeTrees[iContainer];
      oTree.m_oIeTreeLink.href = this.m_sUrl;
      if(this.m_sTarget != null)
         oTree.m_oIeTreeLink.target = this.m_sTarget;
      else
         oTree.m_oIeTreeLink.target = "";

      if(document.all != null)
         oTree.m_oIeTreeLink.click();
      else
         eval("top."+this.m_sTarget+".location='"+this.m_sUrl+"'");
   }
}

/*********************************************************/
function ItemType(sName, sIcon, sOpenIcon)
{
   // Properties
   this.m_sName     = sName;
   this.m_sIcon     = sIcon;
   this.m_sOpenIcon = (sOpenIcon != null) ? sOpenIcon : sIcon;
}
