function MainNavWrapper(p_sContainerId) {
 this.instanceId  = p_sContainerId;
 this.containerElm = document.getElementById(this.instanceId);
 this.offsetTop  = this.containerElm.offsetTop;
 this.offsetLeft  = this.containerElm.offsetLeft;
 
 this.items   = {};
 this.itemsArray  = [];
 
 this.init();
 
 MainNavWrapper.instances[this.instanceId] = this;
}
MainNavWrapper.instances = {};
MainNavWrapper.destroy = function() {
 for (var sInstanceId in MainNavWrapper.instances) {
  MainNavWrapper.instances[sInstanceId].destroy();
  delete MainNavWrapper.instances[sInstanceId];
 }
};

MainNavWrapper.prototype.destroy = function() {
 delete this.items;
 delete this.itemsArray;
 delete this.containerElm;
};
MainNavWrapper.prototype.init = function() {
 var aLinks = this.containerElm.getElementsByTagName('a');
 var nL  = aLinks.length;
 for (var nI = 0; nI < nL; nI ++) this.addLink(aLinks[nI]);
 
 // Clean up
 aLinks  = null;
};
MainNavWrapper.prototype.addLink = function(p_oLink) {
 var bReturn     = false;
 if (p_oLink) {
  var sInstanceId   = this.instanceId, oLink;
  var sLinkId    = p_oLink.parentNode.id;
  if (!this.items[sLinkId]) {
   this.itemsArray.push(p_oLink);
   this.items[sLinkId] = p_oLink;
   
   p_oLink.onmouseover = function(e) { MainNavWrapper.instances[sInstanceId].openItem(e, sLinkId); };
   p_oLink.onmouseout = function(e) { MainNavWrapper.instances[sInstanceId].closeItem(e, sLinkId); };
  }
  
  bReturn     = true;
 }
 return bReturn;
};
MainNavWrapper.prototype.openItem = function(e, p_sItemId) {
 var oTarget, oRelatedTarget, oItemExpansion, oItem, oNavMainDivider;
 var sToElmParentId, sInstanceId, nX;
 
 try
 {
  // Normalize event
  if (!e) {
   e    = window.event;
   oTarget   = e.srcElement;
   oRelatedTarget = e.toElement;
  } else {
   oTarget   = e.target;
   oRelatedTarget = e.relatedTarget;
  }
  
  _event_stoppropagation(e);
  _event_preventdefault(e);
  
  // If the event and the src/related elements exist
  // and the element being moused out of is not the same as the item being moused over
  if (e && oTarget && oRelatedTarget && oRelatedTarget != this.items[p_sItemId]) { //&& isChildOf(oTarget, this.items[p_sItemId]) 
  
   sInstanceId      = this.instanceId;
   
   // Get the container element (ItemExpansion)
   oItemExpansion     = document.getElementById('ItemExpansion');
   
   // If the container element (ItemExpansion) does not exist,
   // then create it and set its properties/event handlers else empty it
   if (!oItemExpansion) {
    oItemExpansion    = document.createElement('div');
    oItemExpansion.id   = 'ItemExpansion';
    oItemExpansion.className = this.instanceId + 'ItemExpansion';
    document.body.appendChild(oItemExpansion);
    //if (document.all) {
     oItemExpansion.onmouseout = function(e) {
      _event_stoppropagation(e);
      _event_preventdefault(e);
      MainNavWrapper.instances[sInstanceId].closeItem(e, '');
     };
    //} else {
    // oItemExpansion.addEventListener('mouseout', function(e) { MainNavWrapper.instances[sInstanceId].closeItem(e, ''); }, false);
    //}
   } else {
    emptyElement(oItemExpansion);
   }
   
   oDrop = document.getElementById("CenterDropdown");
   if (oDrop) {
    oDrop.style.display = "none";
   }
   
   // Get the current item
   oItem       = document.getElementById(p_sItemId);
   
   // Calculate the submenus left position basewd upon the current item's left position
   nX        = (this.instanceId == 'NavMain')? 19 : 0;
   if (oItem) nX += oItem.offsetLeft;
   
   // Get and position the submenu divider element (NavDivider)
   oNavMainDivider     = document.getElementById('NavMainDivider');
   if (!oNavMainDivider) {
    oNavMainDivider    = document.createElement('div');
    oNavMainDivider.id   = 'NavMainDivider';
    oNavMainDivider.className = 'NavMainDividerClass';
    oItemExpansion.appendChild(oNavMainDivider);
   }
   oNavMainDivider.style.left  = nX + 'px';
   
   // Build the submenu's html
   this.buildSubMenu(oItemExpansion, p_sItemId, nX);
  }
 } catch (ex) {
  throw ex; //alert(ex.message);
 } finally {
  // Clean up
  oTarget    = null;
  oRelatedTarget  = null;
  oItemExpansion  = null;
  oItem    = null;
  oNavMainDivider  = null;
 }
};
MainNavWrapper.prototype.closeItem = function(e, p_sItemId) {
 var oTarget, oRelatedTarget, oItemExpansion, sToElmParentId;
 
 try
 {
  // Normalize event
  if (!e) {
   e    = window.event;
   oTarget   = e.srcElement;
   oRelatedTarget = e.toElement;
  } else {
   oTarget   = e.target;
   oRelatedTarget = e.relatedTarget;
  }
  
  // If the event and the src/related elements exist
  if (e && oTarget && oRelatedTarget) {
   oItemExpansion  = document.getElementById('ItemExpansion');
   
   // If the element being moused over is in the container element (ItemExpansion),
   // or the element being moused over is not the item being moused out of,
   // then do nothing,
   // else if the container element (ItemExpansion) exists, continue the mouseout.
   
   if (
    oRelatedTarget == this.containerElm
    || isChildOf(oRelatedTarget, oItemExpansion)
    // FIX THIS IN MOZILLA
    /*|| isChildOf(oRelatedTarget, this.items[p_sItemId]*/
    || oRelatedTarget == this.items[p_sItemId]) {
   } else if (oItemExpansion) {
    // Get the id of 
    sToElmParentId  = oRelatedTarget.parentNode.id;
    
    emptyElement(oItemExpansion);
   oDrop = document.getElementById("CenterDropdown");
   if (oDrop) {
    oDrop.style.display = "";
   }
    
    if (this.items[sToElmParentId]) {
     if (document.all) {
      this.items[sToElmParentId].fireEvent('onmouseover');
     } else {
      this.items[sToElmParentId].onmouseover();
     }
    } else {
     document.body.removeChild(oItemExpansion);
    }
   }
  }
  
 } catch (ex) {
  throw ex; //alert(ex.message);
 } finally {
  // Clean up
  oTarget    = null;
  oRelatedTarget  = null;
  oItemExpansion  = null;
 }
};
MainNavWrapper.prototype.addSubItem  = function(p_sItemId, p_sSubItemLabel, p_sSubItemHref) {
 var oItem = this.items[p_sItemId];
 if (oItem) {
  if (!oItem.subItems) {
   oItem.subItems  = {};
   oItem.subItemArray = [];
  }
  
  var nSubItemIndex  = oItem.subItemArray.length;
  var sSubItemId   = p_sItemId + '_' + (nSubItemIndex + 1);
  oItem.subItemArray.push((oItem.subItems[sSubItemId] = new MainNavWrapperSubItem(this, p_sItemId, sSubItemId, p_sSubItemLabel, p_sSubItemHref)));
 }
 oItem  = null;
};
MainNavWrapper.prototype.buildSubMenu = function(p_oItemExpansion, p_sItemId, p_nX) {
 var oItemExpansion = document.getElementById('ItemExpansion');
 oItemExpansion.style.width   = (oItemExpansion.offsetWidth - p_nX) + 'px';
 oItemExpansion.style.paddingLeft = p_nX + 'px';
 
 var oUL    = document.createElement('ul');
 oUL.className  = 'NavMainSubMenu';
 oItemExpansion.appendChild(oUL);
 
 var oItem   = this.items[p_sItemId];
 var sSubItemHTML = '';
 for (var sId in oItem.subItems) {
  sSubItemHTML += oItem.subItems[sId].buildHTML();
 }
 oUL.innerHTML  = sSubItemHTML;
 
 var aListItems  = oUL.getElementsByTagName('a');
 var nL    = aListItems.length;
 var nW    = 0, nW_tmp;
 for (var nI = 0; nI < nL; nI++) {
  nW_tmp   = aListItems[nI].scrollWidth;
  if (nW < nW_tmp) nW = nW_tmp;
 };
 
 nW     += 35;//50;
 
 oUL.style.width  = nW + 'px';
 
 aListItems   = oUL.getElementsByTagName('li');
 nL     = aListItems.length;
 for (var nI = 0; nI < nL; nI++) {
  aListItems[nI].style.backgroundPositionX = (nW - 10) + 'px'; //28
 }
 
 // Clean up
 oItemExpansion  = null;
 oUL     = null;
 oItem    = null;
};

function MainNavWrapperSubItem(p_oNavWrapper, p_sParentId, p_sId, p_sLabel, p_sHref) {
 this.navWrapper = p_oNavWrapper;
 this.parentId = p_sParentId;
 this.id   = p_sId;
 this.label  = p_sLabel;
 this.href  = p_sHref;
 
 return this;
}
MainNavWrapperSubItem.prototype.buildHTML = function() {
 return '<li><a href="' + this.href + '" onmouseover="this.parentNode.className=\'NavMainSelected\';" onmouseout="this.parentNode.className=\'\';">' + this.label + '</a></li>';
};
