// See menus.README.txt for info on usage.

var UniqueIDs = 0;
var UniqueIDPre = 'MID_';
var MenuParentHREF = 0;

function InitCollapsibleMenu(id,opts,plinks)
{
   if (!document.getElementById)
      return;
   var menu = document.getElementById(id);
   if (!menu)
      return;

   if (opts)
   {
      if (opts.indexOf('expandone')>=0)
         menu.setAttribute('opt_expandone',1);
      if (opts.indexOf('hide')>=0)
         menu.setAttribute('opt_hide',1);
   }

   // Collapse all sub-chunks!
   var chunks = menu.getElementsByTagName('ul');
   // Collapse in reverse order to get around IE css bug.
   for (var i=chunks.length-1;i>=0;i--)
   {
      var chunk = chunks.item(i);
      if (chunk.parentNode && chunk.parentNode != menu)
      {
         // Hide sub-chunk
         chunk.style.display = 'none';
         // Add show-callback to this chunk's A ref...
         // Get parent LI
         var parnode = chunk.parentNode;
         while (parnode && parnode.tagName != 'LI')
         {
            // alert(''+parlnk.tagName+' ne LI');
            parnode = parnode.parentNode;
         }
         parnode.className = "menu_parent_node";

         // Mouse Over stuff...
/*
         if (parlnk)
         {
            //parlnk.onmouseover = new Function("return MouseOverCollapsibleMenuBlock('"+UniqueElementId(chunk)+"');");
            //parlnk.onmouseout = new Function("return MouseOutCollapsibleMenuBlock('"+UniqueElementId(chunk)+"');");
         }
*/

         var newonclick = new Function("return ToggleCollapsibleMenuBlock('"+id+"','"+UniqueElementId(chunk)+"',0);");

         // Find first normal A (Direct child only!)
         var parlnk = parnode.getElementsByTagName('a');
         var plf = 0;
         if (parlnk.length)
         {
            for (var k=0; k<parlnk.length && !plf; k++)
            {
               if (parlnk.item(k).parentNode==parnode || parlnk.item(k).parentNode.parentNode==parnode)
               {
                  plf=1;
                  parlnk = parlnk.item(k);
               }
            }
         }
         if (!plf)
            parlnk = 0;

         // If we have code for branch links, then add these nodes.
         if (plinks)
         {
            var eclink = document.createElement("a");
            parnode.insertBefore(eclink,parnode.firstChild);
            eclink.onclick = newonclick;
            eclink.innerHTML = plinks[0];
            eclink.href='#';
            //eclink.title = id+'/'+UniqueElementId(parnode)+'/'+parlnk;
            eclink.collapsedHTML = plinks[0];
            eclink.expandedHTML = plinks[1];
            //chunk.linkobj = eclink;
            chunk.branchobj = eclink;
            eclink.className = 'menu_branch_open';
         }

         // Back to that link...
         if (parlnk)
         {
            //parlnk = parlnk.item(0);

            // Store Link Obj associated with Chunk
            chunk.linkobj = parlnk;
            if (plinks)
            {
               if (parlnk.getAttribute('href')=='#')
                  parlnk.onclick = newonclick;
               parlnk.className = 'menu_parent_closed';
               chunk.branchobj = eclink;
            }
            else
            {
               parlnk.className = 'menu_parent_closed';
               chunk.branchobj = parlnk;
               parlnk.onclick = newonclick;
            }
         }
      }
   }

   // Find current URL and expand up tree!
   var arefs = menu.getElementsByTagName('a');
   var matchfound = 0;
   for (var i=0;i<arefs.length;i++)
   {
      var aref=arefs.item(i);
      if (aref && (aref.getAttribute('href') == location.pathname
                || aref.getAttribute('href') == location.pathname+location.search
                || aref.getAttribute('href') == location.href))
      {  // This A HREF points to this page!
         // alert("Match: "+aref.href+' = '+location.href);
         matchfound = 1;
         aref.className = "menu_current_item";
         var apar = aref.parentNode;
         // Crawl up the tree expanding things...
         // Also set style of immediate parent LI to same class.
         var setli = 0;
         while (apar && apar!=menu)
         {
            if (apar.tagName == 'UL')
            {
//                // Determine our Parent's A-link - first the LI
//                var apref = apar.parentNode;
//                while (apref.tagName!='LI' && apref.parentNode)
//                   apref=apref.parentNode;
//                // - now the A
//                if (apref.tagName=='LI')
//                   apref = apref.getElementsByTagName('a').item(0);
//                else
//                   apref = 0;
               //alert(apar.id+'/'+apar.linkobj+'/'+menu.id);
               if (apar.id)
                  ToggleCollapsibleMenuBlock(menu.id,apar.id);
//               if (apar.id && apref.id)
//                  ToggleCollapsibleMenuBlock(menu,apar.id,apref.id);
//               apar.style.display = 'block';
            }
            if (apar.tagName == 'LI' && !setli)
            {
               apar.className = "menu_current_item";
               setli = 1;
            }
            apar = apar.parentNode;
         }
         // Expand block directly below (if any)
         apar = aref.parentNode.getElementsByTagName('ul');
         if (apar && apar.length)
            apar.item(0).style.display = 'block';
      }
   }
   // If no match found, but we have a parent, then look for that instead...
   if (matchfound==0 && MenuParentHREF)
   {
   //alert('Searching for matching '+MenuParentHREF);
      for (var i=0;i<arefs.length;i++)
      {
         var aref=arefs.item(i);
         // alert('Comparing '+aref.pathname+' with '+MenuParentHREF);
         if (aref && (aref.href == MenuParentHREF
                  ||  aref.pathname == MenuParentHREF  // Mozilla
                  ||  '/'+aref.pathname == MenuParentHREF)) // IE
         {  // Matching Parent href found!
         //alert('Found!');
            ExpandCollapsibleMenuBranch(aref,menu);
         }
      }
   }
}

// Expand current level, and above, for a specific A node.
function ExpandCollapsibleMenuBranch(aref,menu)
{
   var apar = aref.parentNode;
   aref.className = "menu_current_item";

   // Crawl up the tree expanding things...
   // Also set style of immediate parent LI to same class.
   var setli = 0;
   while (apar && apar!=menu)
   {
      if (apar.tagName == 'UL')
         apar.style.display = 'block';
      if (apar.tagName == 'LI' && !setli)
      {
         apar.className = "menu_current_item";
         setli = 1;
      }
      apar = apar.parentNode;
   }
   // Expand block directly below (if any)
   apar = aref.parentNode.getElementsByTagName('ul');
   if (apar && apar.length)
      apar.item(0).style.display = 'block';
}

function InitMenuParentHREF(phref)
{
   MenuParentHREF = phref;
}

function MouseOverCollapsibleMenuBlock(bl)
{
   // alert('Showing '+bl);
   document.getElementById(bl).style.display == 'block';
   return true;
}

function MouseOutCollapsibleMenuBlock(bl)
{
   // alert('Hiding '+bl);
   document.getElementById(bl).style.display == 'none';
   return true;
}

// Low level function to do the functional closing of a branch.
function MNU_CloseBranch(blob,menu)
{
   var lnkob = blob.linkobj;
   var brob = blob.branchobj;

   blob.style.display = 'none';
   if (blob.linkobj)
      blob.linkobj.className = 'menu_parent_closed';
   if (brob && brob!=lnkob)
   {
      brob.className = 'menu_branch_closed';
      if (brob.collapsedHTML)
         brob.innerHTML = brob.collapsedHTML;
   }

}

function MNU_OpenBranch(blob,menu)
{
   var lnkob = blob.linkobj;
   var brob = blob.branchobj;

   blob.style.display = 'block';
   if (lnkob)
      lnkob.className = 'menu_parent_open';
   if (brob && brob!=lnkob)
   {
      brob.className = 'menu_branch_open';
      if (brob.expandedHTML)
         brob.innerHTML = brob.expandedHTML;
   }
}

//function ToggleCollapsibleMenuBlock(menuid,bl,lnk,ret)
function ToggleCollapsibleMenuBlock(menuid,bl,ret)
{
//alert('TogBlock: '+menu+'/'+bl+'/'+lnk+'/'+ret);
   var blob = document.getElementById(bl);
   var lnkob = blob.linkobj;
//   var lnkob = document.getElementById(lnk);
   var menu = document.getElementById(menuid);

   if (blob.style.display == 'none')
   {
      MNU_OpenBranch(blob,menu);
      if (menu.getAttribute('opt_expandone') || menu.getAttribute('opt_hide'))
      {
         // Go through and collapse other expanded branches...

         // But first, record the nodes from this branch.
         var branch = new Object();
         branch[UniqueElementId(blob)]=1;

         var apar = blob.parentNode;
         while (apar && apar!=menu)
         {
            if (apar.tagName == 'UL')
               branch[UniqueElementId(apar)]=1;
            apar = apar.parentNode;
         }

         // Now collapse all others.
         var chunks = menu.getElementsByTagName('ul');
         // Collapse in reverse order to get around IE css bug.
         for (var i=chunks.length-1;i>=0;i--)
         {
            var chunk = chunks.item(i);
            //alert(UniqueElementId(chunk)+'='+branch[UniqueElementId(chunk)]);
            if (!branch[UniqueElementId(chunk)])
            {
               MNU_CloseBranch(chunk,menu);
            }
         }
      }
      if (menu.getAttribute('opt_hide'))
      {
         // Go through and hide adjacent menu items of parents...
         var apar = blob.parentNode;
         var citm = 0;
         while (apar && apar!=menu)
         {
            if (apar.tagName == 'LI')
               citm = apar;

            if (apar.tagName == 'UL')
            {
               var oitm = apar.firstChild;
               while (oitm)
               {
                  if (oitm.tagName == 'LI')
                     oitm.style.display = (oitm==citm?'':'none');
                  oitm = oitm.nextSibling;
               }
            }
            apar = apar.parentNode;
         }

         // Go through sub-items and make sure they're all visible
         var oitm = blob.firstChild;
         while (oitm)
         {
            if (oitm.tagName == 'LI')
               oitm.style.display = '';
            oitm = oitm.nextSibling;
         }

      }
   }
   else
   {
      MNU_CloseBranch(blob,menu);

      if (menu.getAttribute('opt_hide'))
      {
         // Go through and re-show adjacent menu items of parents...
         var apar = blob.parentNode;

         while (apar && apar!=menu && apar.tagName != 'UL')
            apar=apar.parentNode; // Next parent up

         if (apar.tagName == 'UL')
         {
            var oitm = apar.firstChild;
            while (oitm)
            {
               if (oitm.tagName == 'LI')
                  oitm.style.display = '';
               oitm = oitm.nextSibling;
            }
         }
      }

   }
//   alert('Toggled '+bl+' returning '+ret);
   return (ret?true:false);
}

function UniqueElementId(obj)
{
   if (!obj)
      return;
   if (!obj.id)
      obj.id = GenerateNewElementId();
   return obj.id;
}

function GenerateNewElementId()
{
   UniqueIDs++;
   return UniqueIDPre+UniqueIDs;
}

function dumpProps(obj, parent) {
   for (var i in obj) {
      if (parent) { msg = parent + "." + i + "\n" + obj[i]; } else { var msg = i + "\n" + obj[i]; }
      if (!confirm(msg)) { return; }
      if (typeof obj[i] == "object") {
         if (parent) { dumpProps(obj[i], parent + "." + i); } else { dumpProps(obj[i], i); }
      }
   }
}