

 function object_menulistbuilder(oMenuList, identifierPrefix, menuStyle, objIdentifier, hoverSubMenus, menuTimeoutMilliseconds, menuTimeout)
 {
 	  oMenuList.identifierPrefix = identifierPrefix;
 	  oMenuList.menuStyle = menuStyle;
 	  oMenuList.objectIdentifier = identifierPrefix + '_' + menuStyle;
 	  oMenuList.objIdentifier = objIdentifier;
	
    oMenuList.openSubmenuStack = new Array(0); 
    oMenuList.hoveredmenuItemStack = new Array(0); 
    oMenuList.hoverSubmenus = hoverSubMenus; 
    oMenuList.menuTimeoutMilliseconds = menuTimeoutMilliseconds; 
    oMenuList.menuTimeout = menuTimeout; 
 		oMenuList.bDisableDHTML = false;
	
	  oMenuList.arrayContainsValue = function(arrayToSearch, valueToFind) { 
      for (var i = 0; i < arrayToSearch.length; i++) { 
        if (arrayToSearch[i] == valueToFind) return true; 
      } 
      return false; 
    } 
		
    oMenuList.getArrayOfElementIdsAndAncestorIds = function(MenuItemDiv) { 
      var El = new Array(); 
 
      // add the id of the current menu item element to the array 
      El[0] = MenuItemDiv.id; 
 
      // add all parent items to the array 
      var parentNodeOfMenuItem; 
      parentNodeOfMenuItem = MenuItemDiv.parentNode; 
      while (parentNodeOfMenuItem.id != this.objectIdentifier + '_sub_0') { 
        El[El.length] = parentNodeOfMenuItem.id.replace('_sub', '_item'); 
        parentNodeOfMenuItem = parentNodeOfMenuItem.parentNode; 
      } 
 
      // return array of menu items and all parent menu items and their parent menu items etc 
      return El; 
    } 		
		
    oMenuList.mouseOverMenuItemDiv = function (MenuItemDiv, iLevel) { 
      this.dehoverHoveredMenuItems(); 
      this.hoverMenuItemAndAncestors(MenuItemDiv); 
      
      if (this.hoverSubmenus) {
        var iSubmenuDivID = MenuItemDiv.id.replace('_item', '_sub'); 
        var objSubmenuDiv = document.getElementById(iSubmenuDivID); 
        
        // dehover all submenus of and below the current level 
        while (this.openSubmenuStack.length >= iLevel) { 
          var objOpenSubmenuDiv = this.openSubmenuStack.pop(); 
          var iLevelOfSubmenu = iLevel; 
          if (objOpenSubmenuDiv.id != iSubmenuDivID) { 
            this.dehoverSubmenu(objOpenSubmenuDiv, iLevelOfSubmenu); 
            iLevelOfSubmenu--; 
          } 
        } 
 
        // hover submenu 
        this.hoverSubmenu(objSubmenuDiv, iLevel) 
 
        // set timeout to reset the menu 
        window.clearTimeout(this.menuTimeout); 
        this.menuTimeout = window.setTimeout('obj_' + this.objIdentifier + '.closeMenu();', this.menuTimeoutMilliseconds); 
      } 
    } 
 		
    oMenuList.mouseOutMenuItemDiv = function (MenuItemDiv, iLevel) { 
      // dehover current item immediately 
      this.dehoverMenuItem(MenuItemDiv, iLevel) 
    } 
    
    oMenuList.closeMenu = function () { 
      // dehover all submenus and items 
      this.closeOpenSubmenus(); 
      this.dehoverHoveredMenuItems(); 
    } 
    
    oMenuList.closeOpenSubmenus = function () { 
      // dehover all submenus 
      while (this.openSubmenuStack.length > 0) { 
        var objOpenSubmenuDiv = this.openSubmenuStack.pop(); 
        this.dehoverSubmenu(objOpenSubmenuDiv); 
      } 
    } 
    
    oMenuList.dehoverHoveredMenuItems = function () { 
      while (this.hoveredmenuItemStack.length > 0) { 
        var objCurrentMenuItemDiv = this.hoveredmenuItemStack.pop(); 
        objCurrentMenuItemDiv.className = objCurrentMenuItemDiv.className.replace('-hover', ''); 
        objCurrentMenuItemDiv.className = objCurrentMenuItemDiv.className.replace(/ hover\d+/, ''); 
      } 
    
    }
    
    oMenuList.hoverMenuItem = function (objMenuItemDiv, iLevel) { 
      var sClassNameMenuItemDiv = objMenuItemDiv.className; 
      sClassNameMenuItemDiv = sClassNameMenuItemDiv.replace('-hover', ''); 
      sClassNameMenuItemDiv = sClassNameMenuItemDiv.replace(' hover'+ iLevel, ''); 
      sClassNameMenuItemDiv = sClassNameMenuItemDiv.replace(' item' + iLevel, '-hover item' + iLevel); 
      sClassNameMenuItemDiv += ' hover' + iLevel; 
      objMenuItemDiv.className = sClassNameMenuItemDiv; 
      
      this.hoveredmenuItemStack.push(objMenuItemDiv); 
    } 
    
    oMenuList.dehoverMenuItem = function (objMenuItemDiv, iLevel) { 
      var sClassNameMenuItemDiv = objMenuItemDiv.className; 
      sClassNameMenuItemDiv = sClassNameMenuItemDiv.replace('-hover', ''); 
      sClassNameMenuItemDiv = sClassNameMenuItemDiv.replace(' hover'+ iLevel, ''); 
      objMenuItemDiv.className = sClassNameMenuItemDiv; 
    } 
    
    oMenuList.dehoverSubmenu = function (objSubmenuDiv, iLevel) { 
      var sClassNameSubmenuDiv = objSubmenuDiv.className; 
      sClassNameSubmenuDiv = sClassNameSubmenuDiv.replace('-hover', ''); 
      sClassNameSubmenuDiv = sClassNameSubmenuDiv.replace(/ smhover\d+/, ''); 
      objSubmenuDiv.className = sClassNameSubmenuDiv; 
    } 
    
    oMenuList.hoverMenuItemAndAncestors = function (objSubmenuDiv) { 
      var iAncestorItem; 
      var iaAncestorItemIDs = this.getArrayOfElementIdsAndAncestorIds(objSubmenuDiv); 
      var iAncestorLevel = 1; 
      for (iAncestorItem = iaAncestorItemIDs.length - 1; iAncestorItem >= 0; iAncestorItem--) { 
        var objMenuItemDiv = document.getElementById(iaAncestorItemIDs[iAncestorItem]); 
        this.hoverMenuItem(objMenuItemDiv, iAncestorLevel); 
        iAncestorLevel++; 
      }
    }
     
    oMenuList.hoverSubmenu = function (objSubmenuDiv, iLevel) { 
      if (objSubmenuDiv) { 
        var iLevelOfSubmenu = iLevel + 1; 
        var sClassNameSubmenuDiv = objSubmenuDiv.className; 
        sClassNameSubmenuDiv = sClassNameSubmenuDiv.replace('-hover', '').replace(' level' + iLevelOfSubmenu, '-hover level' + iLevelOfSubmenu); 
        sClassNameSubmenuDiv = sClassNameSubmenuDiv.replace(' smhover'+ iLevelOfSubmenu, '') + ' smhover' + iLevelOfSubmenu; 
        objSubmenuDiv.className = sClassNameSubmenuDiv; 
        this.openSubmenuStack.push(objSubmenuDiv); 
      } 
    } 		
		
		oMenuList.WriteMenu = function(iLevel, sSubMenuActiveClass1, sSubMenuActiveClass2, sItemIDPrefix )
		{
		 document.write('<div class="' + this.identifierPrefix + '-' + this.menuStyle + '-level' + iLevel.toString() + sSubMenuActiveClass1 + ' level' + iLevel.toString() + sSubMenuActiveClass2 + '"')
		 if (sItemIDPrefix > '')
		 {
		 	  document.write(' id="' + this.objectIdentifier + '_sub' + sItemIDPrefix + '"')
		 } else
		 {
		 	  document.write(' id="' + this.objectIdentifier + '_sub_0' + '"')
 		 }
	   document.write('>')
		}
		
		oMenuList.WriteMenuItem = function(iLevel, sClassnameOfCurrentMenuItem, sItemID, bDisableDHTML )
		{
		 document.write('<div class="' + sClassnameOfCurrentMenuItem + '" id="' + this.objectIdentifier + '_item' + sItemID + '" ')
		 if (bDisableDHTML == false)
		 {
        document.write(' onMouseOver="obj_' + this.objIdentifier + '.mouseOverMenuItemDiv(this, ' + iLevel.toString() + ');" ')
        document.write(' onMouseOut="obj_' + this.objIdentifier + '.mouseOutMenuItemDiv(this, ' + iLevel.toString() + ');" ')
 		 }
	   document.write('>')
		}		
		
	  oMenuList.WriteMenuItemLink = function(sLinkUrl, sLinkTarget, sLinkTitle, sText )
		{
		  if (sLinkUrl > '')
			{
		     document.write('<a href="' + sLinkUrl + '" target="' + sLinkTarget + '" title="' + sLinkTitle + '" >')
		     document.write(sText)
				 document.write('</a>')
			}
			else
			{
		     document.write(sText)
			}
		}

    oMenuList.WriteMenuEnd = function()
		{
		   document.write('</div>')
		}			

    oMenuList.WriteMenuItemEnd = function()
		{
		   document.write('</div>')
		}
		
		/*    CUSTOM     */
				
    oMenuList.WriteCustom = function(sMbMethod, object_mb, custom_function)
		{  
			 //alert(object_mb.mb_method);
			 
  	   object_mb.objMenu = this;
			 object_mb.mb_method = sMbMethod;
			 try
			 {
  		   if (typeof(custom_function)=="function")
			 	 { 
			 			custom_function(object_mb);
				 }
			   else
			   { 
				   mb_normallink(object_mb);
			   }
			}	 
			catch(err)
			{
			  window.status = err.description;
 			}	 
 	 
		}			
		
		return oMenuList;
 }

 function obj_mb_menu(iId, sSubMenuActiveClass1, sSubMenuActiveClass2, iLevel, sItemIDPrefix)
 {
 	  this.objMenu = null;
		this.mb_method = ''; // menu_start, menu_end 
		// 
 	  this.id = iId;
 	  this.classname = null;
		this.submenu_active_class1 = sSubMenuActiveClass1;
		this.submenu_active_class2 = sSubMenuActiveClass2;
		this.itemIdPrefix = sItemIDPrefix;
 	  this.level = iLevel;
 	  this.itemId = null;
 	  this.linkUrl = null;
 	  this.linkTarget = null;
 	  this.linkTitle = null;
 	  this.text = null;
 	  this.menuStyle = null;
 }
  
 function obj_mb_menu_item(iId, sLinkUrl, sLinkTarget, sLinkTitle, 
 					sText, sMenuStyle, sClassname, iLevel, sItemId )
 {
 	  this.objMenu = null;
		this.mb_method = ''; // menu_item, link, menu_item_end
 	  this.id = iId;
 	  this.classname = sClassname;
		this.submenu_active_class1 = null;
		this.submenu_active_class2 = null;
		this.itemIdPrefix = null;
 	  this.level = iLevel;
 	  this.itemId = sItemId;
 	  this.linkUrl = sLinkUrl;
 	  this.linkTarget = sLinkTarget;
 	  this.linkTitle = sLinkTitle;
 	  this.text = sText;
 	  this.menuStyle = sMenuStyle;
 }
	
  // twee voorbeeldjes:	
	
 function mb_normallink(object_mb)
 {
	 switch(object_mb.mb_method)
   {
     case 'menu':
		   object_mb.objMenu.WriteMenu(object_mb.level, object_mb.submenu_active_class1, object_mb.submenu_active_class2, object_mb.itemIdPrefix);
       break;
     case 'menu_item':
		 	 object_mb.objMenu.WriteMenuItem(object_mb.level, object_mb.classname, object_mb.itemId, false );
       break;
     case 'menu_item_link':
			 object_mb.objMenu.WriteMenuItemLink(  object_mb.linkUrl , object_mb.linkTarget,
				 	 object_mb.linkTitle, object_mb.text);
       break;
     case 'menu_item_end':
    	 object_mb.objMenu.WriteMenuItemEnd();
       break;
     case 'menu_item_end_na':
       break;
     case 'menu_item_combined':
		 	 object_mb.mb_method = 'menu_item';		
		   mb_normallink(object_mb);
		 	 object_mb.mb_method = 'menu_item_link';		
		   mb_normallink(object_mb);
		 	 object_mb.mb_method = 'menu_item_end';
		   mb_normallink(object_mb);
			 //
			 // menu_item_end_na kan nog niet makkelijk in 'all' zitten
			 //		
       break;
     case 'menu_end':
  	   object_mb.objMenu.WriteMenuEnd();
       break;
   }
 }	
 
 function mb_customlink_image(object_mb)
 {
   if (object_mb.mb_method == 'menu_item_link') 
	 {
     document.write('<a href="' + object_mb.linkUrl + 
		 		'" target="' + object_mb.linkTarget + 
				'" title="' + object_mb.linkTitle + '" >');
     document.write(object_mb.text);
     document.write('<img style="position:relative;top:+0px;left:-70px;" ' + 
  	    'src="/cms/publish/menulistbuilder/menuitemimage.asp?id=' + object_mb.id.toString() + 
  			'&level=' + object_mb.level.toString() + 
  			'&class=' + object_mb.classname + 
  			'&itemid=' + object_mb.itemId + '" alt="">');
  	 document.write('</a>');
	 } else
	 {
	   mb_normallink(object_mb);
	 }	 
 }	 

 /*
 <ul>
    <li> <a href="">Bouwbesluit</a>
       <ul>
          <li><a href="">Modulen</a></li>
          <li><a href="">XXX</a></li>
			 </ul>	
    </li>
</ul>
 */
 
 function mb_customlink_ul_li(object_mb)
 {
  switch(object_mb.mb_method)
   {
     case 'menu':
		   document.write('<ul>');
       break;
     case 'menu_item':
		   document.write('<li>');
       break;
     case 'menu_item_link':
     		 document.write('<a href="' + object_mb.linkUrl + 
    		 		'" target="' + object_mb.linkTarget + 
    				'" title="' + object_mb.linkTitle + '" >');
         document.write(object_mb.text);
      	 document.write('</a>');		 
       break;
     case 'menu_item_end':
       break;
		 case 'menu_item_combined':
	 	   object_mb.mb_method = 'menu_item';		
		   mb_customlink_ul_li(object_mb);
		 	 object_mb.mb_method = 'menu_item_link';		
		   mb_customlink_ul_li(object_mb);
		 	 object_mb.mb_method = 'menu_item_end';
			 mb_customlink_ul_li(object_mb);
			 //
			 // menu_item_end_na kan nog niet makkelijk in 'all' zitten
			 //		
       break;
		 case 'menu_item_end_na':
		   document.write('</li>');
       break;			 
     case 'menu_end':
		   document.write('</ul>');
       break;
   }
 }