// Constantin Rusan
// 18-FEB-2010
// Creates the base menu bar for a menu.

var timeOn=null;

function sitemap(menuName, menuAlign, source, orientation, showLevels, menuBarClass, menuItemClass, menuItemHoverClass, menuItemSelectedClass, subMenuBarClass, subMenuItemClass, subMenuItemHoverClass)
{
   this.menuName = menuName;
   this.menuAlign = menuAlign;
   this.menuBarClass = menuBarClass;
   this.showLevels = showLevels;
   this.menuItemClass = menuItemClass;
   this.menuItemHoverClass = menuItemHoverClass;
   this.menuItemSelectedClass = menuItemSelectedClass;
   
   this.subMenuBarClass = subMenuBarClass;
   this.subMenuItemClass = subMenuItemClass;
   this.subMenuItemHoverClass = subMenuItemHoverClass;
   
   this.content = new String();
   this.targetType = 'self'; // self, iframe, frame, new
	this.targetFrame = '_self'; // _self, _blank or (i)frame name
   this.orientation = 'horizontal';
   //array of menu items that will hold the top level items of the menu.
   this.Items = new Array();   
   this.itemsCount = 0;
   document.write('<span id="ruler" style="visibility:hidden; white-space:nowrap;"></span>');
   document.write('<div id="ruler1" style="position:absolute;top:0px;left:0px;z-index:1000;visibility:hidden; white-space:nowrap;"></div>');
   this.RecurseNode = function(xmlNode, level, parItm)
   {
      var mnItm = null;
      var x = xmlNode.attributes;
      if (x != null)
      {
         switch (level)
         {
            case 0:
            break;
            case 1:
            {
               mnItm = new menuItem(x.getNamedItem("title").nodeValue, null, x.getNamedItem("url").nodeValue, this.subMenuBarClass, this.subMenuItemClass, this.subMenuItemHoverClass, this.menuItemClass, this.menuItemSelectedClass, this.menuItemHoverClass);
               this.Items[this.itemsCount] = mnItm;
               this.itemsCount++;
            }
            break;
            default:
            {
               
               parItm.addItem(x.getNamedItem("title").nodeValue, x.getNamedItem("url").nodeValue);  
               mnItm = parItm.subItems[parItm.itemsCount-1];
            }
         break;   
         }
      }
      
      if (xmlNode.hasChildNodes())
      {
         for (var i=0;i<xmlNode.childNodes.length;i++)
         {
            var nextLvl = level+1;
            if (this.showLevels == 0 || nextLvl <= this.showLevels)
            {
               this.RecurseNode(xmlNode.childNodes[i], level+1, mnItm);
            }
         }
      }
   }
   
   xmlDoc = loadXMLDoc(source);
   xmlNode = xmlDoc.getElementsByTagName("siteMapNode")[0];
   this.RecurseNode(xmlNode, 0);
   
   this.Render = function()
   {
      menuWidth = 0;
      var contentEnd = new String()
      contentEnd = '</div>\n';
      
      var beginCel = new String();
      beginCel ='\t\t\t<td';
      
      var endCel = new String();
      endCel = '\t\t\t</td>\n';
      
      if (this.orientation == 'horizontal')
      {
         this.content +='\t\t<tr>\n';
         contentEnd = '\t\t</tr>\n' + contentEnd;
      }
      else
      {
         beginCel ='\t\t<tr>\n' + beginCel;
         endCel = '\t\t</tr>\n' + endCel;
      }
      
      for (var i=0;i<this.itemsCount;i++)
      {
         var menuItemName = new String();
         menuItemName = this.menuName +'_menuItem' + i;
         this.Items[i].controlId = menuItemName;
         var celContent = new String();
         celContent += beginCel;
         celContent += ' id="'+ menuItemName + '"';
         var mnItmClass = new String();
         if (location.pathname.toLowerCase() == this.Items[i].url.toLowerCase())
         {
            mnItmClass = this.menuItemSelectedClass;
         }
         else
         {
            mnItmClass = this.menuItemClass;
         }
         celContent += ' class="'+mnItmClass+'"';
         celContent += ' onMouseOver="menuItemMouseOver(\'' + menuItemName + '\',\'' + this.menuItemHoverClass + '\');"';
         celContent += ' onMouseDown="menuItemMouseDown(\'' + menuItemName + '\',\'' + this.menuItemSelectedClass + '\',\'' + mnItmClass + '\');"';
         celContent += ' onMouseOut="menuItemMouseOut(\'' + menuItemName + '\',\'' + mnItmClass + '\');">\n';
         celContent += '\t\t\t\t';
         celContent += '<a href="' + this.Items[i].url + '">'+ this.Items[i].Text +'</a>\n'+ endCel;
         this.content += celContent;
         
      }
      this.content = '\t<table border="0px" cellspacing="0px" cellpadding="0px" style="border-collapse:collapse;">\n' + this.content;
      this.content += '\t</table>\n';
      menuWidth = this.content.visualLength();
      var alignmentCSS = "";
      
      switch (this.menuAlign)
      {
         case "left":
            break;
         case "center":
            alignmentCSS = "margin-left:auto;margin-right:auto";
            break;
         case "right":
            alignmentCSS = "margin-left:auto;margin-right:0px";
            break;
         default:
            break;
      }
      
      this.content = '\n<div id="'+this.menuName+'" class="' + this.menuBarClass + '" style="width:'+ menuWidth +'px;position:relative;' + alignmentCSS + '">\n' + this.content;
      
      this.content += contentEnd;
      
      /*if (this.menuName == "mainMenu")
      {
         var cont = document.getElementById("menuContainer");
         if (cont != null)
         {
            cont.style.width=menuWidth + "px";
         }
      }*/
      document.write(this.content); 
      
      for (var i=0;i<this.itemsCount;i++)
      {
         this.Items[i].drawSubMenu(1);
      }
      
      
   }
}

function menuItem(text, Parent, url, subMenuClass, subMenuItemClass, subMenuItemHoverClass, menuItemClass, menuItemSelectedClass, menuItemHoverClass)
{
   this.Text = text;
   this.subMenuClass = subMenuClass;
   this.subMenuItemClass = subMenuItemClass;
   this.subMenuItemHoverClass = subMenuItemHoverClass;
   this.menuItemClass = menuItemClass;
   this.menuItemSelectedClass = menuItemSelectedClass;
   this.menuItemHoverClass = menuItemHoverClass;
   this.url = url;
   this.controlId = new String();
   this.subMenu = new String();
   
   // Parent is a menuItem that has this item as a submenu item.
   this.Parent = Parent;
      
   //this is the list of menuItems which represent a submenu of this item.
   this.subItems = new Array();
   this.itemsCount = 0;
   
   this.addItem = function(text, curl)
   {
      newItem = new menuItem(text, this, curl, this.subMenuClass, this.subMenuItemClass, this.subMenuItemHoverClass, this.menuItemClass, this.menuItemSelectedClass, this.menuItemHoverClass);
      this.subItems[this.itemsCount] = newItem;
      this.itemsCount++;
   }
   
   this.drawSubMenu = function(order)
   {
      var maxLength = 0;
      
      var bCel = '\n\t\t<tr>\n\t\t\t<td';
      var eCel = '\n\t\t\t</td>\n\t\t</tr>';
      var sEnd = '\n\t</table>\n</div>\n';
      for (var d=0; d<this.itemsCount; d++)
      {
         var toCheck = new String();
         toCheck += '<table>'
         toCheck += bCel + ' id="'+ this.subItems[d].controlId +'" ';
         toCheck += ' onMouseOver="menuItemMouseOver(\'' + this.subItems[d].controlId + '\',\'' + this.subMenuItemHoverClass + '\');"';
         toCheck += ' onMouseOut="menuItemMouseOut(\'' + this.subItems[d].controlId + '\',\'' + this.subMenuItemClass + '\');" ';
         toCheck += 'class="'+ this.subMenuItemClass + '">';
         toCheck += '\n\t\t\t\t<a href="' + this.subItems[d].url + '">'+ this.subItems[d].Text + '</a>' + eCel;
         toCheck += '</table>';
         curLen = toCheck.visualLength();
         if (maxLength < curLen)
         {
            
            maxLength = curLen;
         }
      }
      
      for (var j=0; j<this.itemsCount; j++)
      {
         
         this.subItems[j].controlId = this.controlId + '_subMenuItem' + j;
         this.subMenu += bCel + ' id="'+ this.subItems[j].controlId +'" style="' + maxLength + '" ';
         this.subMenu += ' onMouseOver="menuItemMouseOver(\'' + this.subItems[j].controlId + '\',\'' + this.subMenuItemHoverClass + '\');"';
         this.subMenu += ' onMouseOut="menuItemMouseOut(\'' + this.subItems[j].controlId + '\',\'' + this.subMenuItemClass + '\');" ';
         this.subMenu += 'class="'+ this.subMenuItemClass + '">';
         this.subMenu += '\n\t\t\t\t<a href="' + this.subItems[j].url + '">'+ this.subItems[j].Text + '</a>' + eCel;
         if (location.pathname.toLowerCase() == this.subItems[j].url.toLowerCase())
         {
            var names = this.controlId.split("_");
            var name = names[0]+'_'+names[1];
            var elem = document.getElementById(name);
            changeClass(name, this.menuItemSelectedClass);
            elem.onmouseover = new Function('menuItemMouseOver(\'' + name + '\', \'' + this.menuItemHoverClass + '\')');
            elem.onmousedown = new Function('menuItemMouseDown(\'' + name + '\', \'' + this.menuItemSelectedClass + '\', \'' + this.menuItemSelectedClass + '\')');
            elem.onmouseout =  new Function('menuItemMouseOut(\'' + name  + '\', \'' + this.menuItemSelectedClass + '\')');
         
         }
      }
      
      var begin = '\n<div id="' + this.controlId; 
      begin += '_subMenu" class="'  + this.subMenuClass;
      begin += '" style="width:' + maxLength;
      begin += 'px;z-index:' + 100 + order; 
      begin += ';position:absolute;left:5px;top:5px;visibility:hidden;">\n\t<table border="0px" cellspacing="0px" cellpadding="0px" style="border-collapse:collapse;width:' + maxLength + 'px;">';
      
      this.subMenu = begin + this.subMenu;
      this.subMenu += sEnd;
      if (this.itemsCount == 0) this.subMenu = '';
      if (this.controlId == null) this.subMenu = '';
      document.write(this.subMenu);
      
      for (var j=0; j<this.itemsCount; j++)
      {
         this.subItems[j].drawSubMenu(order+1);
      }
   }
}

function loadXMLDoc(dname)
{
   if (window.XMLHttpRequest)
   {
      xhttp = new XMLHttpRequest();
   }
   else
   {
      xhttp = new ActiveXObject("Microsoft.XMLHTTP");
   }
   
   xhttp.open("GET", dname, false);
   xhttp.send("");
   return xhttp.responseXML;
}

String.prototype.visualLength = function()
{
    var browser = navigator.appName;
    var rulerid = (browser!="Netscape")?"ruler":"ruler1";
    
    var ruler = document.getElementById(rulerid);
    
    ruler.innerHTML = this;
    var browser = navigator.appName;
    var len = 0;
    len = ruler.offsetWidth;
    ruler.innerHTML = "";
    return len;   
}

function menuItemMouseDown(elemName, cssClass ,orClass)
{
   
   var t=0;
   var nameParts = elemName.split("_");
   var sibName = new String();
   for (var i=0; i<nameParts.Length-1;i++)
   {
      sibName += nameParts[i] + '_';
   }
   sibName += 'menuItem';
   while (document.getElementById(sibName+t) != null)
   {
      changeClass(sibName+t,orClass);
      t++;
   }
   changeClass(elemName, cssClass);
}

function menuItemMouseOver(elemName, cssClass)
{
   clearTimeout(timeOn);
   changeClass(elemName, cssClass);
   hideTierSubmenus(elemName);
}

function menuItemMouseOut(elemName, cssClass)
{
   changeClass(elemName, cssClass);
   timeOn = setTimeout("hideAllSubmenus()",300);
}

function menuItemClick()
{

}

function hideAllSubmenus()
{
   var divs = document.getElementsByTagName("div");
   for (var i=0;i<divs.length;i++)
   {
      var oneDiv = divs[i];
      var names = oneDiv.id.split("_");
      if (names[names.length-1]=='subMenu')
      {
         changeObjectVisibility(oneDiv.id,'hidden');
      }
   }
}

function getMousePos()
{

}

function hideTierSubmenus(elementId)
{
   var divs = document.getElementsByTagName("div");
   var menuId = elementId.split('_')[0];
   for (var i=0;i<divs.length;i++)
   {
      var oneDiv = divs[i];
      var names = oneDiv.id.split("_");
      if (names[names.length-1]=='subMenu')
      {
         var thisSubmenuId = elementId+'_subMenu'
         if(oneDiv.id.length >= thisSubmenuId.length )
         {
            if(oneDiv.id == elementId+'_subMenu')
            {  
               mnu = document.getElementById(menuId);
               elem = document.getElementById(elementId);
               
               var top = 0;
               var left = 0;
               if (elementId.split('_').length == 2 )
               {
                  ch = elem.children[0];
                  var top = elem.offsetTop + mnu.offsetTop + elem.offsetHeight;
                  var left = elem.offsetLeft + mnu.offsetLeft + ch.offsetLeft ;
               }
               else
               {
                  ch = elem.children[0];
                  parSubId = elementId.substring(0,elementId.lastIndexOf("_"))+'_subMenu';
                  parSub = document.getElementById(parSubId);
                  var top = elem.offsetTop + parSub.offsetTop ;
                  var left = parSub.offsetLeft + parSub.offsetWidth  ;
               }             
               oneDiv.style.top = top +'px';
               oneDiv.style.left = left + 'px';
               changeObjectVisibility(oneDiv.id, 'visible');
            }
            else
            {
               changeObjectVisibility(oneDiv.id, 'hidden');
            }
         }
      }
   }   
}
