www/include/scripts/menu.js

Code
Comments
Other
Rev Date Author Line
2306 22 May 06 jari 1 /* $Id$
417 19 Apr 05 nicklas 2   ------------------------------------------------------------------
3675 16 Aug 07 jari 3   Copyright (C) 2005 Nicklas Nordborg
4889 06 Apr 09 nicklas 4   Copyright (C) 2006 Jari Häkkinen, Nicklas Nordborg, Gregory Vincic
3675 16 Aug 07 jari 5   Copyright (C) 2007 Nicklas Nordborg
417 19 Apr 05 nicklas 6
2304 22 May 06 jari 7   This file is part of BASE - BioArray Software Environment.
2304 22 May 06 jari 8   Available at http://base.thep.lu.se/
417 19 Apr 05 nicklas 9
417 19 Apr 05 nicklas 10   BASE is free software; you can redistribute it and/or
417 19 Apr 05 nicklas 11   modify it under the terms of the GNU General Public License
4476 05 Sep 08 jari 12   as published by the Free Software Foundation; either version 3
417 19 Apr 05 nicklas 13   of the License, or (at your option) any later version.
417 19 Apr 05 nicklas 14
417 19 Apr 05 nicklas 15   BASE is distributed in the hope that it will be useful,
417 19 Apr 05 nicklas 16   but WITHOUT ANY WARRANTY; without even the implied warranty of
417 19 Apr 05 nicklas 17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
417 19 Apr 05 nicklas 18   GNU General Public License for more details.
417 19 Apr 05 nicklas 19
417 19 Apr 05 nicklas 20   You should have received a copy of the GNU General Public License
4510 11 Sep 08 jari 21   along with BASE. If not, see <http://www.gnu.org/licenses/>.
417 19 Apr 05 nicklas 22   ------------------------------------------------------------------
417 19 Apr 05 nicklas 23
417 19 Apr 05 nicklas 24   JavaScript functions for the Menu taglib.
417 19 Apr 05 nicklas 25
417 19 Apr 05 nicklas 26   @author Nicklas
417 19 Apr 05 nicklas 27   @version 2.0
417 19 Apr 05 nicklas 28 */
7419 03 Nov 17 nicklas 29 'use strict';
417 19 Apr 05 nicklas 30
6201 07 Nov 12 nicklas 31 var Menu = function()
417 19 Apr 05 nicklas 32 {
6201 07 Nov 12 nicklas 33   var menu = {};
6201 07 Nov 12 nicklas 34   var internal = {};
6201 07 Nov 12 nicklas 35   var visibleMenus = [];
714 02 Jun 05 nicklas 36   
6201 07 Nov 12 nicklas 37   /**
6201 07 Nov 12 nicklas 38     Show a top-level menu at the given position.
6201 07 Nov 12 nicklas 39     @param menuDiv A menu object or ID
6201 07 Nov 12 nicklas 40     @param x,y The pixel coordinates for the top left/right corner of the menu
6201 07 Nov 12 nicklas 41     @param alignRight If set the x coordinate is counted from the right side of
6201 07 Nov 12 nicklas 42       the window and the right side of the menu is aligned to that pixel
6201 07 Nov 12 nicklas 43   */
6201 07 Nov 12 nicklas 44   menu.showTopMenu = function(menuDiv, x, y, alignRight)
714 02 Jun 05 nicklas 45   {
6201 07 Nov 12 nicklas 46     menu.hideAll();
6201 07 Nov 12 nicklas 47     menuDiv = Doc.element(menuDiv);
6201 07 Nov 12 nicklas 48     if (alignRight)
714 02 Jun 05 nicklas 49     {
6201 07 Nov 12 nicklas 50       menuDiv.style.right = (x)+'px';
6201 07 Nov 12 nicklas 51       menuDiv.style.left = 'auto';
714 02 Jun 05 nicklas 52     }
714 02 Jun 05 nicklas 53     else
714 02 Jun 05 nicklas 54     {
6201 07 Nov 12 nicklas 55       menuDiv.style.left = (x)+'px';
6201 07 Nov 12 nicklas 56       menuDiv.style.right = 'auto';
714 02 Jun 05 nicklas 57     }
6201 07 Nov 12 nicklas 58     menuDiv.style.top = (y)+'px';
6201 07 Nov 12 nicklas 59     menuDiv.style.display = 'block';
7943 04 May 21 nicklas 60     menuDiv.style.zIndex = '999';
6201 07 Nov 12 nicklas 61     menuDiv.canHide = true;
6201 07 Nov 12 nicklas 62     internal.registerVisible(menuDiv);
714 02 Jun 05 nicklas 63   }
714 02 Jun 05 nicklas 64   
6201 07 Nov 12 nicklas 65   /**
6201 07 Nov 12 nicklas 66     Toggle a top-level menu. If the menu is not visible it is shown,
6201 07 Nov 12 nicklas 67     otherwise it is hidden.
6201 07 Nov 12 nicklas 68     @param menuDiv A menu object or ID
6201 07 Nov 12 nicklas 69     @param x,y The pixel coordinates for the top left corner of the menu
6201 07 Nov 12 nicklas 70   */
6201 07 Nov 12 nicklas 71   menu.toggleTopMenu = function(menuDiv, x, y, alignRight)
5808 17 Oct 11 nicklas 72   {
6201 07 Nov 12 nicklas 73     menuDiv = Doc.element(menuDiv);
6201 07 Nov 12 nicklas 74     if (menuDiv.style.display == 'none')
417 19 Apr 05 nicklas 75     {
6201 07 Nov 12 nicklas 76       menu.showTopMenu(menuDiv, x, y, alignRight);
417 19 Apr 05 nicklas 77     }
472 27 Apr 05 nicklas 78     else
472 27 Apr 05 nicklas 79     {
6201 07 Nov 12 nicklas 80       menu.hideSubMenus(menuDiv, true);
472 27 Apr 05 nicklas 81     }
417 19 Apr 05 nicklas 82   }
472 27 Apr 05 nicklas 83
6201 07 Nov 12 nicklas 84   /**
6201 07 Nov 12 nicklas 85     Hide all visible menus and their submenus.
6201 07 Nov 12 nicklas 86   */
6201 07 Nov 12 nicklas 87   menu.hideAll = function()
417 19 Apr 05 nicklas 88   {
6201 07 Nov 12 nicklas 89     var i = 0;
6201 07 Nov 12 nicklas 90     while (visibleMenus.length > 0 && i < 10)
6201 07 Nov 12 nicklas 91     {
6201 07 Nov 12 nicklas 92       menu.hideSubMenus(visibleMenus[0], true);
6201 07 Nov 12 nicklas 93       i++;
6201 07 Nov 12 nicklas 94     }
5808 17 Oct 11 nicklas 95   }
5808 17 Oct 11 nicklas 96   
6201 07 Nov 12 nicklas 97   /**
6201 07 Nov 12 nicklas 98     Get the menu that the given menu-item belongs to.
6201 07 Nov 12 nicklas 99   */
6201 07 Nov 12 nicklas 100   menu.getMenuOfMenuItem = function(menuItem)
5808 17 Oct 11 nicklas 101   {
6201 07 Nov 12 nicklas 102     menuItem = Doc.element(menuItem);
6201 07 Nov 12 nicklas 103     if (!menuItem.menu)
6201 07 Nov 12 nicklas 104     {
6201 07 Nov 12 nicklas 105       var parent = menuItem.parentNode;
6201 07 Nov 12 nicklas 106       while (parent.tagName.toLowerCase() != 'div')
6201 07 Nov 12 nicklas 107       {
6201 07 Nov 12 nicklas 108         parent = parent.parentNode;
6201 07 Nov 12 nicklas 109       }
6201 07 Nov 12 nicklas 110       menuItem.menu = parent;
6201 07 Nov 12 nicklas 111     }
6201 07 Nov 12 nicklas 112     return menuItem.menu;
6201 07 Nov 12 nicklas 113   }
6201 07 Nov 12 nicklas 114   
6201 07 Nov 12 nicklas 115   /**
6201 07 Nov 12 nicklas 116     Show a submenu.
6201 07 Nov 12 nicklas 117     @param menuItem The ID or document element of the menu-item that is linked with the submenu
6201 07 Nov 12 nicklas 118     @param subMenu The submenu object or ID to display
6201 07 Nov 12 nicklas 119   */
6201 07 Nov 12 nicklas 120   menu.showSubMenu = function(menuItem, subMenu)
6201 07 Nov 12 nicklas 121   {
6201 07 Nov 12 nicklas 122     menuItem = Doc.element(menuItem);
6201 07 Nov 12 nicklas 123     subMenu = Doc.element(subMenu);
6201 07 Nov 12 nicklas 124     var menuDiv = menu.getMenuOfMenuItem(menuItem);
6201 07 Nov 12 nicklas 125     menu.hideSubMenus(menuDiv);
6400 27 Jan 14 nicklas 126     var pos = Doc.getElementPosition(menuItem);
6201 07 Nov 12 nicklas 127     var vertical = Data.int(menuDiv, 'vertical');
6610 20 Nov 14 nicklas 128     var dx = vertical ? pos.width : -1; // place submenu to the right of the parent menu
6201 07 Nov 12 nicklas 129     var dy = vertical ? 0 : pos.height; // place submenu below the parent menu
6201 07 Nov 12 nicklas 130     subMenu.style.left = (pos.left+dx)+'px';
6201 07 Nov 12 nicklas 131     subMenu.style.right = 'auto';
6201 07 Nov 12 nicklas 132     subMenu.style.top = (pos.top+dy)+'px';
6201 07 Nov 12 nicklas 133     subMenu.style.display = 'block';
7943 04 May 21 nicklas 134     subMenu.style.zIndex = parseInt(menuDiv.style.zIndex || '999')+1;
6201 07 Nov 12 nicklas 135     subMenu.canHide = true;
6201 07 Nov 12 nicklas 136     menuDiv.activeSubMenu = subMenu;
6201 07 Nov 12 nicklas 137     internal.registerVisible(menuDiv);
6201 07 Nov 12 nicklas 138   }
6201 07 Nov 12 nicklas 139
6201 07 Nov 12 nicklas 140   
6201 07 Nov 12 nicklas 141   /**
6201 07 Nov 12 nicklas 142     Hide submenus that have been opened from the given
6201 07 Nov 12 nicklas 143     menu.
6201 07 Nov 12 nicklas 144     @param menuDiv A menu object or the ID
6201 07 Nov 12 nicklas 145     @param hideTopMenu If set, the top, level menu is hidden as well
6201 07 Nov 12 nicklas 146   */
6201 07 Nov 12 nicklas 147   menu.hideSubMenus = function(menuDiv, hideTopMenu)
6201 07 Nov 12 nicklas 148   {
6201 07 Nov 12 nicklas 149     menuDiv = Doc.element(menuDiv);
6201 07 Nov 12 nicklas 150     var activeSubMenu = menuDiv.activeSubMenu;
472 27 Apr 05 nicklas 151     if (activeSubMenu)
472 27 Apr 05 nicklas 152     {
6201 07 Nov 12 nicklas 153       menu.hideSubMenus(activeSubMenu, false);
472 27 Apr 05 nicklas 154       activeSubMenu.style.display = 'none';
6201 07 Nov 12 nicklas 155       menuDiv.activeSubMenu = null;
6201 07 Nov 12 nicklas 156       internal.unregisterVisible(menuDiv);
472 27 Apr 05 nicklas 157     }
6201 07 Nov 12 nicklas 158     if (menuDiv.canHide && hideTopMenu) 
758 13 Jun 05 nicklas 159     {
6201 07 Nov 12 nicklas 160       menuDiv.style.display = 'none';
6201 07 Nov 12 nicklas 161       internal.unregisterVisible(menuDiv);
758 13 Jun 05 nicklas 162     }
417 19 Apr 05 nicklas 163   }
472 27 Apr 05 nicklas 164
6201 07 Nov 12 nicklas 165   /**
6201 07 Nov 12 nicklas 166     Toggle the visibility of a submenu. If the given
6201 07 Nov 12 nicklas 167     submenu is the currently active submenu, it is hidden,
6201 07 Nov 12 nicklas 168     otherwise it is shown.
6201 07 Nov 12 nicklas 169     @param menuItem The ID or document element of the menu-item that is linked with the submenu
6201 07 Nov 12 nicklas 170     @param subMenu The submenu object or ID to display
6201 07 Nov 12 nicklas 171   */
6201 07 Nov 12 nicklas 172   menu.toggleSubMenu = function(menuItem, subMenu)
5808 17 Oct 11 nicklas 173   {
6201 07 Nov 12 nicklas 174     menuItem = Doc.element(menuItem);
6201 07 Nov 12 nicklas 175     subMenu = Doc.element(subMenu);
6201 07 Nov 12 nicklas 176     var menuDiv = menu.getMenuOfMenuItem(menuItem);
6201 07 Nov 12 nicklas 177     if (menuDiv.activeSubMenu == subMenu)
6201 07 Nov 12 nicklas 178     {
6201 07 Nov 12 nicklas 179       menu.hideSubMenus(menuDiv);
6201 07 Nov 12 nicklas 180     }
6201 07 Nov 12 nicklas 181     else
6201 07 Nov 12 nicklas 182     {
6201 07 Nov 12 nicklas 183       menu.showSubMenu(menuItem, subMenu);
6201 07 Nov 12 nicklas 184     }
5808 17 Oct 11 nicklas 185   }
5808 17 Oct 11 nicklas 186   
6201 07 Nov 12 nicklas 187   /**
6201 07 Nov 12 nicklas 188     Open the given URL. 
6201 07 Nov 12 nicklas 189   */
6201 07 Nov 12 nicklas 190   menu.openUrl = function(url, target)
417 19 Apr 05 nicklas 191   {
6201 07 Nov 12 nicklas 192     var targetWindow = (target == null ? window : window.top.frames[target]);
6201 07 Nov 12 nicklas 193     if (targetWindow != null)
417 19 Apr 05 nicklas 194     {
6201 07 Nov 12 nicklas 195       targetWindow.location = url;
7894 08 Dec 20 nicklas 196       var content = document.getElementsByClassName('content');
7894 08 Dec 20 nicklas 197       setTimeout(Forms.pleaseWait, 1000, content.length == 1 ? content[0] : null);
417 19 Apr 05 nicklas 198     }
417 19 Apr 05 nicklas 199     else
417 19 Apr 05 nicklas 200     {
6201 07 Nov 12 nicklas 201       window.open(url, target);
417 19 Apr 05 nicklas 202     }
417 19 Apr 05 nicklas 203   }
472 27 Apr 05 nicklas 204
6201 07 Nov 12 nicklas 205   /**
6201 07 Nov 12 nicklas 206     Add a click event handler to the menuitem unless it is disabled.
6201 07 Nov 12 nicklas 207     The menuItem is either the ID or a document element
6201 07 Nov 12 nicklas 208   */
6201 07 Nov 12 nicklas 209   menu.addClickHandler = function(menuItem, handler)
417 19 Apr 05 nicklas 210   {
6201 07 Nov 12 nicklas 211     menuItem = Doc.element(menuItem);
6201 07 Nov 12 nicklas 212     if (!menuItem) return;
6201 07 Nov 12 nicklas 213     Events.addEventHandler(menuItem, 'click', handler);
472 27 Apr 05 nicklas 214   }
472 27 Apr 05 nicklas 215   
6201 07 Nov 12 nicklas 216   /**
6201 07 Nov 12 nicklas 217     Add the given menu to the list of visible menus
6201 07 Nov 12 nicklas 218   */
6201 07 Nov 12 nicklas 219   internal.registerVisible = function(menuDiv)
472 27 Apr 05 nicklas 220   {
6201 07 Nov 12 nicklas 221     visibleMenus[visibleMenus.length] = menuDiv;
6201 07 Nov 12 nicklas 222   }
6201 07 Nov 12 nicklas 223   
6201 07 Nov 12 nicklas 224   /**
6201 07 Nov 12 nicklas 225     Remove the given menu from the list of visible menus.
6201 07 Nov 12 nicklas 226   */
6201 07 Nov 12 nicklas 227   internal.unregisterVisible = function(menuDiv)
6201 07 Nov 12 nicklas 228   {
6201 07 Nov 12 nicklas 229     for (var i = visibleMenus.length-1; i >= 0; i--)
417 19 Apr 05 nicklas 230     {
6201 07 Nov 12 nicklas 231       if (visibleMenus[i] == menuDiv) 
6201 07 Nov 12 nicklas 232       {
6201 07 Nov 12 nicklas 233         visibleMenus.splice(i, 1);
6201 07 Nov 12 nicklas 234         return;
6201 07 Nov 12 nicklas 235       }
417 19 Apr 05 nicklas 236     }
417 19 Apr 05 nicklas 237   }
417 19 Apr 05 nicklas 238
6201 07 Nov 12 nicklas 239   /**
6201 07 Nov 12 nicklas 240     Initialize menu items by adding event listeners to the menu items, etc.
6201 07 Nov 12 nicklas 241     This method handle the following auto-initializable elements:
6201 07 Nov 12 nicklas 242     * submenu: A menu-item that opens up a new submenu
6201 07 Nov 12 nicklas 243     * menuitem: A menu-item in a menu that has either a target url or an onclick (deprecated) handler
6201 07 Nov 12 nicklas 244     * menu-anchor: An element that open a new top-level menu
6201 07 Nov 12 nicklas 245   */
6201 07 Nov 12 nicklas 246   internal.initMenuItems = function(element, autoInit)
417 19 Apr 05 nicklas 247   {
6201 07 Nov 12 nicklas 248     if (autoInit == 'submenu')
472 27 Apr 05 nicklas 249     {
6201 07 Nov 12 nicklas 250       Events.addEventHandler(element, 'click', internal.submenuOnClick);
6201 07 Nov 12 nicklas 251       Events.addEventHandler(element, 'mouseover', internal.submenuOnMouseOver);
6201 07 Nov 12 nicklas 252     }
6201 07 Nov 12 nicklas 253     else if (autoInit == 'menuitem')
6201 07 Nov 12 nicklas 254     {
6201 07 Nov 12 nicklas 255       var url = Data.get(element, 'url');
6201 07 Nov 12 nicklas 256       if (url)
472 27 Apr 05 nicklas 257       {
6415 05 Feb 14 nicklas 258         element.addEventListener('click', Events.stopIfDisabled, true);
6201 07 Nov 12 nicklas 259         Events.addEventHandler(element, 'click', internal.menuItemWithUrlOnClick);
472 27 Apr 05 nicklas 260       }
472 27 Apr 05 nicklas 261     }
6201 07 Nov 12 nicklas 262     else if (autoInit == 'menu')
6201 07 Nov 12 nicklas 263     {
6201 07 Nov 12 nicklas 264       Events.addEventHandler(element, 'mouseover', internal.menuOnMouseOver);
6201 07 Nov 12 nicklas 265     }
6201 07 Nov 12 nicklas 266     else if (autoInit == 'menu-anchor')
6201 07 Nov 12 nicklas 267     {
6201 07 Nov 12 nicklas 268       Events.addEventHandler(element, 'click', internal.menuAnchorOnClick);
6201 07 Nov 12 nicklas 269     }
417 19 Apr 05 nicklas 270   }
6201 07 Nov 12 nicklas 271   Doc.addElementInitializer(internal.initMenuItems);
472 27 Apr 05 nicklas 272   
6201 07 Nov 12 nicklas 273   /**
6201 07 Nov 12 nicklas 274     Click handler for menu items that has an 'data-url' attribute specified. 
6201 07 Nov 12 nicklas 275     By default, the url is opened in the main window. If a 'data-target'
6201 07 Nov 12 nicklas 276     attribute is specified, the url is opened in the window named by the target.
6201 07 Nov 12 nicklas 277     If a 'data-popup' is specified, the url is opened in a popup window.
6201 07 Nov 12 nicklas 278   */
6201 07 Nov 12 nicklas 279   internal.menuItemWithUrlOnClick = function(event)
417 19 Apr 05 nicklas 280   {
6201 07 Nov 12 nicklas 281     var menuItem = event.currentTarget;
6201 07 Nov 12 nicklas 282     var url = Data.get(menuItem, 'url');
6401 28 Jan 14 nicklas 283     var popup = Data.get(menuItem, 'popup');
6401 28 Jan 14 nicklas 284     url = url.replace(/\$SESSION\-ID\$/, App.getSessionId());
6201 07 Nov 12 nicklas 285     if (popup)
472 27 Apr 05 nicklas 286     {
6201 07 Nov 12 nicklas 287       var options = popup.split(/[,\s]+/);
6201 07 Nov 12 nicklas 288       Dialogs.openPopup(url, options[0], options[1], options[2]);
472 27 Apr 05 nicklas 289     }
6201 07 Nov 12 nicklas 290     else
6201 07 Nov 12 nicklas 291     {
6201 07 Nov 12 nicklas 292       Menu.openUrl(url, Data.get(menuItem, 'target'));
6201 07 Nov 12 nicklas 293     }
417 19 Apr 05 nicklas 294   }
417 19 Apr 05 nicklas 295   
6201 07 Nov 12 nicklas 296   /**
6201 07 Nov 12 nicklas 297     Event handler for mouse over events which hide all
6201 07 Nov 12 nicklas 298     submenus for the current menu.
6201 07 Nov 12 nicklas 299   */
6201 07 Nov 12 nicklas 300   internal.menuItemOnMouseOver = function(event)
6201 07 Nov 12 nicklas 301   {
6201 07 Nov 12 nicklas 302     var menuItem = event.currentTarget;
6201 07 Nov 12 nicklas 303     var menuDiv = menu.getMenuOfMenuItem(menuItem);
6201 07 Nov 12 nicklas 304     menu.hideSubMenus(menuDiv);
6201 07 Nov 12 nicklas 305   }
417 19 Apr 05 nicklas 306   
6201 07 Nov 12 nicklas 307   /**
6201 07 Nov 12 nicklas 308     Event handler for mouse over events which hide all
6201 07 Nov 12 nicklas 309     submenus for the current menu.
6201 07 Nov 12 nicklas 310   */
6201 07 Nov 12 nicklas 311   internal.menuOnMouseOver = function(event)
417 19 Apr 05 nicklas 312   {
6723 12 Feb 15 nicklas 313     if (!event.target.classList.contains('menuitem')) return;
6201 07 Nov 12 nicklas 314     menu.hideSubMenus(event.currentTarget);
6201 07 Nov 12 nicklas 315   }
6201 07 Nov 12 nicklas 316   
6201 07 Nov 12 nicklas 317   /**
6201 07 Nov 12 nicklas 318     Event handler for a submenu-item that opens a submenu
6201 07 Nov 12 nicklas 319     automatically when the mouse is over the submenu-item.
6201 07 Nov 12 nicklas 320   */
6201 07 Nov 12 nicklas 321   internal.submenuOnMouseOver = function(event)
6201 07 Nov 12 nicklas 322   {
6201 07 Nov 12 nicklas 323     var menuItem = event.currentTarget;
6201 07 Nov 12 nicklas 324     var submenuId = Data.get(menuItem, 'submenu-id');
6201 07 Nov 12 nicklas 325     var menuDiv = menu.getMenuOfMenuItem(menuItem);
6201 07 Nov 12 nicklas 326     var open = Data.get(menuDiv, 'open');
6201 07 Nov 12 nicklas 327     if (open == 'enter')
417 19 Apr 05 nicklas 328     {
6201 07 Nov 12 nicklas 329       menu.showSubMenu(menuItem, submenuId);
417 19 Apr 05 nicklas 330     }
417 19 Apr 05 nicklas 331     else
417 19 Apr 05 nicklas 332     {
6201 07 Nov 12 nicklas 333       var subMenu = Doc.element(submenuId);
6201 07 Nov 12 nicklas 334       if (menuDiv.activeSubMenu && (menuDiv.activeSubMenu != subMenu))
6201 07 Nov 12 nicklas 335       {
6201 07 Nov 12 nicklas 336         menu.showSubMenu(menuItem, subMenu);
6201 07 Nov 12 nicklas 337       }
417 19 Apr 05 nicklas 338     }
6201 07 Nov 12 nicklas 339     event.stopPropagation();
417 19 Apr 05 nicklas 340   }
6201 07 Nov 12 nicklas 341   
6201 07 Nov 12 nicklas 342   /**
6201 07 Nov 12 nicklas 343     Click handler for submenu-items that toggle the visibility of
6201 07 Nov 12 nicklas 344     the submenu.
6201 07 Nov 12 nicklas 345   */
6201 07 Nov 12 nicklas 346   internal.submenuOnClick = function(event)
6201 07 Nov 12 nicklas 347   {
6201 07 Nov 12 nicklas 348     var menuItem = event.currentTarget;
6201 07 Nov 12 nicklas 349     var submenuId = Data.get(menuItem, 'submenu-id');
6201 07 Nov 12 nicklas 350     menu.toggleSubMenu(menuItem, submenuId);
6201 07 Nov 12 nicklas 351     event.stopPropagation();
6201 07 Nov 12 nicklas 352   }
6201 07 Nov 12 nicklas 353   
6201 07 Nov 12 nicklas 354   /**
6201 07 Nov 12 nicklas 355     Event handler for an gui element that, when clicked, open a new
6201 07 Nov 12 nicklas 356     top-level menu. The menu id should be specified by the 'data-menu-id'
6201 07 Nov 12 nicklas 357     attribute. If 'data-align-right' is set, the right border of the menu
6201 07 Nov 12 nicklas 358     is aligned with the right side of the target element, otherwise the
6201 07 Nov 12 nicklas 359     left sides are aligned (the default).
6201 07 Nov 12 nicklas 360    */
6201 07 Nov 12 nicklas 361   internal.menuAnchorOnClick = function(event)
6201 07 Nov 12 nicklas 362   {
6201 07 Nov 12 nicklas 363     var target = event.currentTarget;
6201 07 Nov 12 nicklas 364     var menuId = Data.get(target, 'menu-id');
6201 07 Nov 12 nicklas 365     var alignRight = Data.int(target, 'align-right');
6201 07 Nov 12 nicklas 366     
6400 27 Jan 14 nicklas 367     var pos = Doc.getElementPosition(target);
6201 07 Nov 12 nicklas 368     var x = pos.left;
6201 07 Nov 12 nicklas 369     var y = pos.top+pos.height;
6201 07 Nov 12 nicklas 370     if (alignRight)
6201 07 Nov 12 nicklas 371     {
6201 07 Nov 12 nicklas 372       var winPos = App.getWindowPosition();
6201 07 Nov 12 nicklas 373       x = winPos.width - pos.left - pos.width;
6201 07 Nov 12 nicklas 374     }
6201 07 Nov 12 nicklas 375     menu.toggleTopMenu(menuId, x, y, alignRight);
6201 07 Nov 12 nicklas 376     event.stopPropagation();
6201 07 Nov 12 nicklas 377   }
6201 07 Nov 12 nicklas 378   
6201 07 Nov 12 nicklas 379   return menu;
6201 07 Nov 12 nicklas 380 }();
6201 07 Nov 12 nicklas 381
6201 07 Nov 12 nicklas 382 Events.addEventHandler(document, 'click', Menu.hideAll);