src/cm/media/js/lib/yui/yui3.0.0/examples/node-focusmanager/assets/menubutton.js
author Yves-Marie Haussonne <ymh.work+github@gmail.com>
Fri, 09 May 2014 18:35:26 +0200
changeset 656 a84519031134
parent 0 40c8f766c9b8
permissions -rw-r--r--
add link to "privacy policy" in the header test
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
YUI().use("*", function (Y) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
	var menuButton = Y.one("#button-1"),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
		menu;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
	var initMenu = function () {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     8
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
		menu = new Y.Overlay({
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
			contentBox: "#menu-1",
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
			visible: false,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
			tabIndex: null
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
		});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
		menu.render();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
		Y.one("#menu-1").setStyle("display", "");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
		var boundingBox = menu.get("boundingBox"),
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
			contentBox = menu.get("contentBox");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
		boundingBox.addClass("yui-buttonmenu");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
		contentBox.addClass("yui-buttonmenu-content");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
		// Append a decorator element to the bounding box to render the shadow.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
		boundingBox.append('<div class="yui-menu-shadow"></div>');
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
		//	Apply the ARIA roles, states and properties to the menu.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
		boundingBox.setAttrs({
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
			role: "menu",
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
			"aria-labelledby": menuButton.get("id")
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
		});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
		boundingBox.all("input").set("role", "menuitem");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
		//	For NVDA: Add the role of "presentation" to each LI 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
		//	element to prevent NVDA from announcing the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
		//	"listitem" role.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
		boundingBox.all("div,ul,li").set("role", "presentation");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
		//	Use the FocusManager Node Plugin to manage the focusability
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
		//	of each menuitem in the menu.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
		contentBox.plug(Y.Plugin.NodeFocusManager, { 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    53
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    54
				descendants: "input",
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    55
				keys: { next: "down:40", // Down arrow
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    56
						previous: "down:38" },	// Up arrow
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    57
				focusClass: {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    58
					className: "yui-menuitem-active",
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    59
					fn: function (node) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    60
						return node.get("parentNode");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    61
					}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    62
				},
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
				circular: true
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
			});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    68
		//	Subscribe to the change event for the "focused" attribute
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    69
		//	to listen for when the menu initially gains focus, and 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    70
		//	when the menu has lost focus completely.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    71
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    72
		contentBox.focusManager.after("focusedChange", function (event) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    73
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    74
			if (!event.newVal) {	// The menu has lost focus
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    75
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    76
				//	Set the "activeDescendant" attribute to 0 when the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    77
				//	menu is hidden so that the user can tab from the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    78
				//	button to the first item in the menu the next time 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    79
				//	the menu is made visible.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    80
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    81
				this.set("activeDescendant", 0);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    82
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    83
			}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    84
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    85
		});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    86
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    87
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    88
		//	Hide the button's menu if the user presses the escape key
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    89
		//	while focused either on the button or its menu.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    90
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    91
		Y.on("key", function () {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    92
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    93
			menu.hide();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    94
			menuButton.focus();				
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    95
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    96
		}, [menuButton, boundingBox] ,"down:27");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    97
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    98
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    99
		if (Y.UA.ie === 6) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   100
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   101
			//	Set the width and height of the menu's bounding box -  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   102
			//	this is necessary for IE 6 so that the CSS for the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   103
			//	shadow element can simply set the shadow's width and 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   104
			//	height to 100% to ensure that dimensions of the shadow 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   105
			//	are always sync'd to the that of its parent menu.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   106
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   107
			menu.on("visibleChange", function (event) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   108
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   109
				if (event.newVal) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   110
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   111
					boundingBox.setStyles({ height: "", width: "" });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   112
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   113
					boundingBox.setStyles({ 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   114
						height: (boundingBox.get("offsetHeight") + "px"), 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   115
						width: (boundingBox.get("offsetWidth") + "px") });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   116
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   117
				}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   118
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   119
			});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   120
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   121
		}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   122
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   123
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   124
		menu.after("visibleChange", function (event) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   125
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   126
			var bVisible = event.newVal;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   127
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   128
			//	Focus the first item when the menu is made visible
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   129
			//	to allow users to navigate the menu via the keyboard
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   130
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   131
			if (bVisible) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   132
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   133
				//	Need to set focus via a timer for Webkit and Opera
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   134
				Y.Lang.later(0, contentBox.focusManager, contentBox.focusManager.focus);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   135
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   136
			}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   137
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   138
			boundingBox.set("aria-hidden", (!bVisible));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   139
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   140
		});				
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   141
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   142
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   143
		//	Hide the menu when one of menu items is clicked.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   144
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   145
		boundingBox.delegate("click", function (event) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   146
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   147
			alert("You clicked " + this.query("input").get("value"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   148
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   149
			contentBox.focusManager.blur();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   150
			menu.hide();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   151
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   152
		}, "li");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   153
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   154
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   155
		//	Focus each menuitem as the user moves the mouse over 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   156
		//	the menu.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   157
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   158
		boundingBox.delegate("mouseenter", function (event) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   159
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   160
			var focusManager = contentBox.focusManager;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   161
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   162
			if (focusManager.get("focused")) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   163
				focusManager.focus(this.query("input"));
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   164
			}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   165
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   166
		}, "li");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   167
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   168
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   169
		//	Hide the menu if the user clicks outside of it or if the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   170
		//	user doesn't click on the button
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   171
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   172
		boundingBox.get("ownerDocument").on("mousedown", function (event) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   173
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   174
			var oTarget = event.target;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   175
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   176
			if (!oTarget.compareTo(menuButton) && 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   177
				!menuButton.contains(oTarget) && 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   178
				!oTarget.compareTo(boundingBox) && 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   179
				!boundingBox.contains(oTarget)) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   180
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   181
				menu.hide();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   182
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   183
			}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   184
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   185
		});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   186
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   187
	};
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   188
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   189
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   190
	menuButton.addClass("yui-menubutton");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   191
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   192
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   193
	//	Hide the list until it is transformed into a menu
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   194
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   195
	Y.one("#menu-1").setStyle("display", "none");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   196
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   197
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   198
	//	Remove the "yui-loading" class from the documentElement
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   199
	//	now that the necessary YUI dependencies are loaded and the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   200
	//	menu button has been skinned.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   201
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   202
	menuButton.get("ownerDocument").get("documentElement").removeClass("yui-loading");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   203
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   204
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   205
	//	Apply the ARIA roles, states and properties to the anchor.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   206
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   207
	menuButton.setAttrs({
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   208
		role: "button",
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   209
		"aria-haspopup": true
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   210
	});
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   211
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   212
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   213
	//	Remove the "href" attribute from the anchor element to  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   214
	//	prevent JAWS and NVDA from reading the value of the "href"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   215
	//	attribute when the anchor is focused.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   216
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   217
	if ((Y.UA.gecko || Y.UA.ie) && navigator.userAgent.indexOf("Windows") > -1) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   218
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   219
		menuButton.removeAttribute("href");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   220
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   221
		//	Since the anchor's "href" attribute has been removed, the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   222
		//	element will not fire the click event in Firefox when the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   223
		//	user presses the enter key.  To fix this, dispatch the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   224
		//	"click" event to the anchor when the user presses the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   225
		//	enter key.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   226
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   227
		Y.on("key", function (event) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   228
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   229
			menuButton.simulate("click");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   230
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   231
		}, menuButton, "down:13");
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   232
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   233
	}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   234
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   235
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   236
	//	Set the "tabIndex" attribute of the anchor element to 0 to 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   237
	//	place it in the browser's default tab flow.  This is 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   238
	//	necessary since 1) anchor elements are not in the default 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   239
	//	tab flow in Opera and 2) removing the "href" attribute  
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   240
	//	prevents the anchor from firing its "click" event 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   241
	//	in Firefox.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   242
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   243
	menuButton.set("tabIndex", 0);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   244
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   245
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   246
	var showMenu = function (event) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   247
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   248
		//	For performance: Defer the creation of the menu until 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   249
		//	the first time the button is clicked.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   250
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   251
		if (!menu) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   252
			initMenu();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   253
		}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   254
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   255
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   256
		if (!menu.get("visible")) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   257
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   258
	        menu.set("align", {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   259
	            node: menuButton,
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   260
	            points: [Y.WidgetPositionExt.TL, Y.WidgetPositionExt.BL]
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   261
	        });
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   262
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   263
			menu.show();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   264
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   265
		}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   266
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   267
		//	Prevent the anchor element from being focused 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   268
		//	when the users mouses down on it.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   269
		event.preventDefault();
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   270
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   271
	}; 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   272
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   273
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   274
	//	Bind both a "mousedown" and "click" event listener to 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   275
	//	ensure the button's menu can be invoked using both the 
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   276
	//	mouse and the keyboard.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   277
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   278
	menuButton.on("mousedown", showMenu);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   279
	menuButton.on("click", showMenu);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   280
	
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   281
});