var Spry;
if(!Spry)
{
 Spry = {};
}
if(!Spry.Widget)
{
 Spry.Widget = {};
}
 
// Constructor for Menu Bar
// element should be an ID of an unordered list (<ul> tag)
// preloadImage1 and preloadImage2 are images for the rollover state of a menu
Spry.Widget.MenuBar = function(element, opts)
{
 this.init(element, opts);
};
 
Spry.Widget.MenuBar.prototype.init = function(element, opts)
{
 this.element = this.getElement(element);
 
 // represents the current (sub)menu we are operating on
 this.currMenu = null;
 
 var isie = (typeof document.all != 'undefined' && typeof window.opera == 'undefined' && navigator.vendor != 'KDE');
 if(typeof document.getElementById == 'undefined' || (navigator.vendor == 'Apple Computer, Inc.' && typeof window.XMLHttpRequest == 'undefined') || (isie && typeof document.uniqueID == 'undefined'))
 {
  // bail on older unsupported browsers
  return;
 }
 
 // load hover images now
 if(opts)
 {
  for(var k in opts)
  {
   var rollover = new Image;
   rollover.src = opts[k];
  }
 }
 
 if(this.element)
 {
  this.currMenu = this.element;
  var items = this.element.getElementsByTagName('li');
  for(var i=0; i<items.length; i++)
  {
   this.initialize(items[i], element, isie);
   if(isie)
   {
    this.addClassName(items[i], "MenuBarItemIE");
    items[i].style.position = "static";
   }
  }
  if(isie)
  {
   if(this.hasClassName(this.element, "MenuBarVertical"))
   {
    this.element.style.position = "relative";
   }
   var linkitems = this.element.getElementsByTagName('a');
   for(var i=0; i<linkitems.length; i++)
   {
    linkitems[i].style.position = "relative";
   }
  }
 }
};
 
Spry.Widget.MenuBar.prototype.getElement = function(ele)
{
 if (ele && typeof ele == "string")
  return document.getElementById(ele);
 return ele;
};
 
Spry.Widget.MenuBar.prototype.hasClassName = function(ele, className)
{
 if (!ele || !className || !ele.className || ele.className.search(new RegExp("\\b" + className + "\\b")) == -1)
 {
  return false;
 }
 return true;
};
 
Spry.Widget.MenuBar.prototype.addClassName = function(ele, className)
{
 if (!ele || !className || this.hasClassName(ele, className))
  return;
 ele.className += (ele.className ? " " : "") + className;
};
 
Spry.Widget.MenuBar.prototype.removeClassName = function(ele, className)
{
 if (!ele || !className || !this.hasClassName(ele, className))
  return;
 ele.className = ele.className.replace(new RegExp("\\s*\\b" + className + "\\b", "g"), "");
};
 
// addEventListener for Menu Bar
// attach an event to a tag without creating obtrusive HTML code
Spry.Widget.MenuBar.prototype.addEventListener = function(element, eventType, handler, capture)
{
 try
 {
  if (element.addEventListener)
  {
   element.addEventListener(eventType, handler, capture);
  }
  else if (element.attachEvent)
  {
   element.attachEvent('on' + eventType, handler);
  }
 }
 catch (e) {}
};
 
// createIframeLayer for Menu Bar
// creates an IFRAME underneath a menu so that it will show above form controls and ActiveX
Spry.Widget.MenuBar.prototype.createIframeLayer = function(menu)
{
 var layer = document.createElement('iframe');
 layer.tabIndex = '-1';
 layer.src = 'javascript:false;';
 menu.parentNode.appendChild(layer);
 
 layer.style.left = menu.offsetLeft + 'px';
 layer.style.top = menu.offsetTop + 'px';
 layer.style.width = menu.offsetWidth + 'px';
 layer.style.height = menu.offsetHeight + 'px';
};
 
// removeIframeLayer for Menu Bar
// removes an IFRAME underneath a menu to reveal any form controls and ActiveX
Spry.Widget.MenuBar.prototype.removeIframeLayer =  function(menu)
{
 var layers = menu.parentNode.getElementsByTagName('iframe');
 while(layers.length > 0)
 {
  layers[0].parentNode.removeChild(layers[0]);
 }
};
 
// clearMenus for Menu Bar
// root is the top level unordered list (<ul> tag)
Spry.Widget.MenuBar.prototype.clearMenus = function(root)
{
 var menus = root.getElementsByTagName('ul');
 for(var i=0; i<menus.length; i++)
 {
  this.hideSubmenu(menus[i]);
 }
 this.removeClassName(this.element, "MenuBarActive");
};
 
// bubbledTextEvent for Menu Bar
// identify bubbled up text events in Safari so we can ignore them
Spry.Widget.MenuBar.prototype.bubbledTextEvent = function()
{
 return (navigator.vendor == 'Apple Computer, Inc.' && (event.target == event.relatedTarget.parentNode || (event.eventPhase == 3 && event.target.parentNode == event.relatedTarget)));
};
 
// showSubmenu for Menu Bar
// set the proper CSS class on this menu to show it
Spry.Widget.MenuBar.prototype.showSubmenu = function(menu)
{
 if(this.currMenu)
 {
  this.clearMenus(this.currMenu);
  this.currMenu = null;
 }
 
 if(menu)
 {
  this.addClassName(menu, "MenuBarSubmenuVisible");
  if(typeof document.all != 'undefined' && typeof window.opera == 'undefined' && navigator.vendor != 'KDE')
  {
   if(!this.hasClassName(this.element, "MenuBarHorizontal") || menu.parentNode.parentNode != this.element)
   {
    menu.style.top = menu.parentNode.offsetTop + 'px';
   }
  }
  if(typeof document.uniqueID != "undefined")
  {
   this.createIframeLayer(menu);
  }
 }
 this.addClassName(this.element, "MenuBarActive");
};
 
// hideSubmenu for Menu Bar
// remove the proper CSS class on this menu to hide it
Spry.Widget.MenuBar.prototype.hideSubmenu = function(menu)
{
 if(menu)
 {
  this.removeClassName(menu, "MenuBarSubmenuVisible");
  if(typeof document.all != 'undefined' && typeof window.opera == 'undefined' && navigator.vendor != 'KDE')
  {
   menu.style.top = '';
   menu.style.left = '';
  }
  this.removeIframeLayer(menu);
 }
};
 
// initialize for Menu Bar
// create event listeners for the Menu Bar widget so we can properly
// show and hide submenus
Spry.Widget.MenuBar.prototype.initialize = function(listitem, element, isie)
{
 var opentime, closetime;
 var link = listitem.getElementsByTagName('a')[0];
 var submenus = listitem.getElementsByTagName('ul');
 var menu = (submenus.length > 0 ? submenus[0] : null);
 
 var hasSubMenu = false;
 if(menu)
 {
  this.addClassName(link, "MenuBarItemSubmenu");
  hasSubMenu = true;
 }
 
 if(!isie)
 {
  // define a simple function that comes standard in IE to determine
  // if a node is within another node
  listitem.contains = function(testNode)
  {
   // this refers to the list item
   if(testNode == null)
   {
    return false;
   }
   if(testNode == this)
   {
    return true;
   }
   else
   {
    return this.contains(testNode.parentNode);
   }
  };
 }
 
 // need to save this for scope further down
 var self = this;
 
 this.addEventListener(listitem, 'mouseover', function(e)
 {
  if(self.bubbledTextEvent())
  {
   // ignore bubbled text events
   return;
  }
  clearTimeout(closetime);
  if(self.currMenu == listitem)
  {
   self.currMenu = null;
  }
  // show menu highlighting
  self.addClassName(link, hasSubMenu ? "MenuBarItemSubmenuHover" : "MenuBarItemHover");
  if(menu && !self.hasClassName(menu, "MenuBarSubmenuVisible"))
  {
   opentime = window.setTimeout(function(){self.showSubmenu(menu);}, 250);
  }
 }, false);
 
 this.addEventListener(listitem, 'mouseout', function(e)
 {
  if(self.bubbledTextEvent())
  {
   // ignore bubbled text events
   return;
  }
 
  var related = (typeof e.relatedTarget != 'undefined' ? e.relatedTarget : e.toElement);
  if(!listitem.contains(related))
  {
   clearTimeout(opentime);
   self.currMenu = listitem;
 
   // remove menu highlighting
   self.removeClassName(link, hasSubMenu ? "MenuBarItemSubmenuHover" : "MenuBarItemHover");
   if(menu)
   {
    closetime = window.setTimeout(function(){self.hideSubmenu(menu);}, 600);
   }
  }
 }, false);
};

