src/cm/media/js/lib/yui/yui_3.10.3/build/node-focusmanager/node-focusmanager-debug.js
author gibus
Tue, 16 Jul 2013 14:29:46 +0200
changeset 525 89ef5ed3c48b
permissions -rw-r--r--
Upgrades to yui 3.10.3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
525
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     1
/*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     2
YUI 3.10.3 (build 2fb5187)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     3
Copyright 2013 Yahoo! Inc. All rights reserved.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     4
Licensed under the BSD License.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     5
http://yuilibrary.com/license/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     6
*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     7
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     8
YUI.add('node-focusmanager', function (Y, NAME) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
     9
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    10
/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    11
* <p>The Focus Manager Node Plugin makes it easy to manage focus among
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    12
* a Node's descendants.  Primarily intended to help with widget development,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    13
* the Focus Manager Node Plugin can be used to improve the keyboard
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    14
* accessibility of widgets.</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    15
*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    16
* <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    17
* When designing widgets that manage a set of descendant controls (i.e. buttons
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    18
* in a toolbar, tabs in a tablist, menuitems in a menu, etc.) it is important to
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    19
* limit the number of descendants in the browser's default tab flow.  The fewer
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    20
* number of descendants in the default tab flow, the easier it is for keyboard
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    21
* users to navigate between widgets by pressing the tab key.  When a widget has
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    22
* focus it should provide a set of shortcut keys (typically the arrow keys)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    23
* to move focus among its descendants.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    24
* </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    25
*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    26
* <p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    27
* To this end, the Focus Manager Node Plugin makes it easy to define a Node's
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    28
* focusable descendants, define which descendant should be in the default tab
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    29
* flow, and define the keys that move focus among each descendant.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    30
* Additionally, as the CSS
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    31
* <a href="http://www.w3.org/TR/CSS21/selector.html#x38"><code>:focus</code></a>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    32
* pseudo class is not supported on all elements in all
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    33
* <a href="http://developer.yahoo.com/yui/articles/gbs/">A-Grade browsers</a>,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    34
* the Focus Manager Node Plugin provides an easy, cross-browser means of
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    35
* styling focus.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    36
* </p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    37
*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    38
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    39
DEPRECATED: The FocusManager Node Plugin has been deprecated as of YUI 3.9.0. This module will be removed from the library in a future version. If you require functionality similar to the one provided by this  module, consider taking a look at the various modules in the YUI Gallery <http://yuilibrary.com/gallery/>. 
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    40
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    41
* @module node-focusmanager
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    42
* @deprecated 3.9.0
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    43
*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    44
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    45
	//	Frequently used strings
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    46
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    47
var ACTIVE_DESCENDANT = "activeDescendant",
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    48
	ID = "id",
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    49
	DISABLED = "disabled",
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    50
	TAB_INDEX = "tabIndex",
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    51
	FOCUSED = "focused",
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    52
	FOCUS_CLASS = "focusClass",
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    53
	CIRCULAR = "circular",
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    54
	UI = "UI",
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    55
	KEY = "key",
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    56
	ACTIVE_DESCENDANT_CHANGE = ACTIVE_DESCENDANT + "Change",
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    57
	HOST = "host",
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    58
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    59
	//	Collection of keys that, when pressed, cause the browser viewport
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    60
	//	to scroll.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    61
	scrollKeys = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    62
		37: true,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    63
		38: true,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    64
		39: true,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    65
		40: true
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    66
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    67
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    68
	clickableElements = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    69
		"a": true,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    70
		"button": true,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    71
		"input": true,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    72
		"object": true
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    73
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    74
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    75
	//	Library shortcuts
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    76
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    77
	Lang = Y.Lang,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    78
 	UA = Y.UA,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    79
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    80
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    81
	* The NodeFocusManager class is a plugin for a Node instance.  The class is used
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    82
	* via the <a href="Node.html#method_plug"><code>plug</code></a> method of Node
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    83
	* and should not be instantiated directly.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    84
	* @namespace plugin
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    85
	* @class NodeFocusManager
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    86
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    87
	NodeFocusManager = function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    88
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    89
		NodeFocusManager.superclass.constructor.apply(this, arguments);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    90
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    91
	};
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    92
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    93
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    94
NodeFocusManager.ATTRS = {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    95
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    96
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    97
	* Boolean indicating that one of the descendants is focused.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    98
	*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
    99
	* @attribute focused
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   100
	* @readOnly
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   101
	* @default false
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   102
	* @type boolean
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   103
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   104
	focused: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   105
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   106
		value: false,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   107
		readOnly: true
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   108
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   109
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   110
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   111
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   112
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   113
	* String representing the CSS selector used to define the descendant Nodes
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   114
	* whose focus should be managed.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   115
	*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   116
	* @attribute descendants
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   117
	* @type Y.NodeList
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   118
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   119
	descendants: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   120
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   121
		getter: function (value) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   122
			
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   123
			return this.get(HOST).all(value);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   124
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   125
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   126
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   127
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   128
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   129
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   130
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   131
	* <p>Node, or index of the Node, representing the descendant that is either
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   132
	* focused or is focusable (<code>tabIndex</code> attribute is set to 0).
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   133
	* The value cannot represent a disabled descendant Node.  Use a value of -1
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   134
	* to remove all descendant Nodes from the default tab flow.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   135
	* If no value is specified, the active descendant will be inferred using
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   136
	* the following criteria:</p>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   137
	* <ol>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   138
	* <li>Examining the <code>tabIndex</code> attribute of each descendant and
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   139
	* using the first descendant whose <code>tabIndex</code> attribute is set
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   140
	* to 0</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   141
	* <li>If no default can be inferred then the value is set to either 0 or
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   142
	* the index of the first enabled descendant.</li>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   143
	* </ol>
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   144
	*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   145
	* @attribute activeDescendant
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   146
	* @type Number
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   147
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   148
	activeDescendant: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   149
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   150
		setter: function (value) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   151
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   152
			var isNumber = Lang.isNumber,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   153
				INVALID_VALUE = Y.Attribute.INVALID_VALUE,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   154
				descendantsMap = this._descendantsMap,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   155
				descendants = this._descendants,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   156
				nodeIndex,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   157
				returnValue,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   158
				oNode;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   159
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   160
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   161
			if (isNumber(value)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   162
				nodeIndex = value;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   163
				returnValue = nodeIndex;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   164
			}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   165
			else if ((value instanceof Y.Node) && descendantsMap) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   166
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   167
				nodeIndex = descendantsMap[value.get(ID)];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   168
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   169
				if (isNumber(nodeIndex)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   170
					returnValue = nodeIndex;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   171
				}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   172
				else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   173
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   174
					//	The user passed a reference to a Node that wasn't one
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   175
					//	of the descendants.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   176
					returnValue = INVALID_VALUE;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   177
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   178
				}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   179
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   180
			}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   181
			else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   182
				returnValue = INVALID_VALUE;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   183
			}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   184
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   185
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   186
			if (descendants) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   187
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   188
				oNode = descendants.item(nodeIndex);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   189
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   190
				if (oNode && oNode.get("disabled")) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   191
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   192
					//	Setting the "activeDescendant" attribute to the index
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   193
					//	of a disabled descendant is invalid.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   194
					returnValue = INVALID_VALUE;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   195
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   196
				}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   197
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   198
			}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   199
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   200
			
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   201
			return returnValue;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   202
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   203
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   204
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   205
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   206
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   207
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   208
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   209
	* Object literal representing the keys to be used to navigate between the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   210
	* next/previous descendant.  The format for the attribute's value is
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   211
	* <code>{ next: "down:40", previous: "down:38" }</code>.  The value for the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   212
	* "next" and "previous" properties are used to attach
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   213
	* <a href="event/#keylistener"><code>key</code></a> event listeners. See
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   214
	* the <a href="event/#keylistener">Using the key Event</a> section of
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   215
	* the Event documentation for more information on "key" event listeners.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   216
	*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   217
	* @attribute keys
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   218
	* @type Object
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   219
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   220
	keys: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   221
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   222
		value: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   223
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   224
			next: null,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   225
			previous: null
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   226
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   227
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   228
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   229
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   230
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   231
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   232
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   233
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   234
	* String representing the name of class applied to the focused active
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   235
	* descendant Node.  Can also be an object literal used to define both the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   236
	* class name, and the Node to which the class should be applied.  If using
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   237
	* an object literal, the format is:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   238
	* <code>{ className: "focus", fn: myFunction }</code>.  The function
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   239
	* referenced by the <code>fn</code> property in the object literal will be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   240
	* passed a reference to the currently focused active descendant Node.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   241
	*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   242
	* @attribute focusClass
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   243
	* @type String|Object
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   244
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   245
	focusClass: { },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   246
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   247
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   248
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   249
	* Boolean indicating if focus should be set to the first/last descendant
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   250
	* when the end or beginning of the descendants has been reached.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   251
	*
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   252
	* @attribute circular
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   253
	* @type Boolean
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   254
	* @default true
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   255
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   256
	circular: {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   257
		value: true
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   258
	}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   259
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   260
};
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   261
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   262
Y.extend(NodeFocusManager, Y.Plugin.Base, {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   263
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   264
	//	Protected properties
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   265
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   266
	//	Boolean indicating if the NodeFocusManager is active.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   267
	_stopped: true,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   268
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   269
	//	NodeList representing the descendants selected via the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   270
	//	"descendants" attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   271
	_descendants: null,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   272
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   273
	//	Object literal mapping the IDs of each descendant to its index in the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   274
	//	"_descendants" NodeList.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   275
	_descendantsMap: null,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   276
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   277
	//	Reference to the Node instance to which the focused class (defined
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   278
	//	by the "focusClass" attribute) is currently applied.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   279
	_focusedNode: null,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   280
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   281
	//	Number representing the index of the last descendant Node.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   282
	_lastNodeIndex: 0,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   283
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   284
	//	Array of handles for event handlers used for a NodeFocusManager instance.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   285
	_eventHandlers: null,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   286
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   287
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   288
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   289
	//	Protected methods
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   290
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   291
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   292
	* @method _initDescendants
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   293
	* @description Sets the <code>tabIndex</code> attribute of all of the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   294
	* descendants to -1, except the active descendant, whose
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   295
	* <code>tabIndex</code> attribute is set to 0.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   296
	* @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   297
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   298
	_initDescendants: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   299
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   300
		var descendants = this.get("descendants"),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   301
			descendantsMap = {},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   302
			nFirstEnabled = -1,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   303
			nDescendants,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   304
			nActiveDescendant = this.get(ACTIVE_DESCENDANT),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   305
			oNode,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   306
			sID,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   307
			i = 0;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   308
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   309
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   310
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   311
		if (Lang.isUndefined(nActiveDescendant)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   312
			nActiveDescendant = -1;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   313
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   314
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   315
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   316
		if (descendants) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   317
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   318
			nDescendants = descendants.size();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   319
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   320
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   321
            for (i = 0; i < nDescendants; i++) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   322
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   323
                oNode = descendants.item(i);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   324
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   325
                if (nFirstEnabled === -1 && !oNode.get(DISABLED)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   326
                    nFirstEnabled = i;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   327
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   328
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   329
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   330
                //	If the user didn't specify a value for the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   331
                //	"activeDescendant" attribute try to infer it from
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   332
                //	the markup.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   333
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   334
                //	Need to pass "2" when using "getAttribute" for IE to get
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   335
                //	the attribute value as it is set in the markup.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   336
                //	Need to use "parseInt" because IE always returns the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   337
                //	value as a number, whereas all other browsers return
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   338
                //	the attribute as a string when accessed
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   339
                //	via "getAttribute".
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   340
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   341
                if (nActiveDescendant < 0 &&
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   342
                        parseInt(oNode.getAttribute(TAB_INDEX, 2), 10) === 0) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   343
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   344
                    nActiveDescendant = i;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   345
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   346
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   347
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   348
                if (oNode) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   349
                    oNode.set(TAB_INDEX, -1);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   350
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   351
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   352
                sID = oNode.get(ID);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   353
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   354
                if (!sID) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   355
                    sID = Y.guid();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   356
                    oNode.set(ID, sID);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   357
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   358
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   359
                descendantsMap[sID] = i;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   360
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   361
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   362
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   363
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   364
            //	If the user didn't specify a value for the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   365
            //	"activeDescendant" attribute and no default value could be
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   366
            //	determined from the markup, then default to 0.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   367
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   368
            if (nActiveDescendant < 0) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   369
                nActiveDescendant = 0;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   370
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   371
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   372
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   373
            oNode = descendants.item(nActiveDescendant);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   374
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   375
            //	Check to make sure the active descendant isn't disabled,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   376
            //	and fall back to the first enabled descendant if it is.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   377
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   378
            if (!oNode || oNode.get(DISABLED)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   379
                oNode = descendants.item(nFirstEnabled);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   380
                nActiveDescendant = nFirstEnabled;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   381
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   382
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   383
            this._lastNodeIndex = nDescendants - 1;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   384
            this._descendants = descendants;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   385
            this._descendantsMap = descendantsMap;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   386
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   387
            this.set(ACTIVE_DESCENDANT, nActiveDescendant);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   388
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   389
            //	Need to set the "tabIndex" attribute here, since the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   390
            //	"activeDescendantChange" event handler used to manage
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   391
            //	the setting of the "tabIndex" attribute isn't wired up yet.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   392
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   393
            if (oNode) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   394
                oNode.set(TAB_INDEX, 0);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   395
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   396
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   397
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   398
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   399
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   400
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   401
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   402
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   403
	* @method _isDescendant
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   404
	* @description Determines if the specified Node instance is a descendant
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   405
	* managed by the Focus Manager.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   406
	* @param node {Node} Node instance to be checked.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   407
	* @return {Boolean} Boolean indicating if the specified Node instance is a
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   408
	* descendant managed by the Focus Manager.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   409
	* @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   410
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   411
	_isDescendant: function (node) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   412
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   413
		return (node.get(ID) in this._descendantsMap);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   414
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   415
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   416
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   417
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   418
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   419
	* @method _removeFocusClass
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   420
	* @description Removes the class name representing focus (as specified by
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   421
	* the "focusClass" attribute) from the Node instance to which it is
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   422
	* currently applied.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   423
	* @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   424
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   425
	_removeFocusClass: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   426
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   427
		var oFocusedNode = this._focusedNode,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   428
			focusClass = this.get(FOCUS_CLASS),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   429
			sClassName;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   430
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   431
		if (focusClass) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   432
			sClassName = Lang.isString(focusClass) ?
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   433
				focusClass : focusClass.className;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   434
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   435
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   436
		if (oFocusedNode && sClassName) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   437
			oFocusedNode.removeClass(sClassName);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   438
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   439
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   440
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   441
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   442
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   443
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   444
	* @method _detachKeyHandler
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   445
	* @description Detaches the "key" event handlers used to support the "keys"
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   446
	* attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   447
	* @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   448
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   449
	_detachKeyHandler: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   450
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   451
		var prevKeyHandler = this._prevKeyHandler,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   452
			nextKeyHandler = this._nextKeyHandler;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   453
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   454
		if (prevKeyHandler) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   455
			prevKeyHandler.detach();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   456
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   457
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   458
		if (nextKeyHandler) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   459
			nextKeyHandler.detach();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   460
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   461
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   462
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   463
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   464
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   465
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   466
	* @method _preventScroll
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   467
	* @description Prevents the viewport from scolling when the user presses
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   468
	* the up, down, left, or right key.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   469
	* @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   470
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   471
	_preventScroll: function (event) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   472
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   473
		if (scrollKeys[event.keyCode] && this._isDescendant(event.target)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   474
			event.preventDefault();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   475
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   476
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   477
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   478
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   479
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   480
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   481
	* @method _fireClick
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   482
	* @description Fires the click event if the enter key is pressed while
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   483
	* focused on an HTML element that is not natively clickable.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   484
	* @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   485
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   486
	_fireClick: function (event) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   487
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   488
		var oTarget = event.target,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   489
			sNodeName = oTarget.get("nodeName").toLowerCase();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   490
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   491
		if (event.keyCode === 13 && (!clickableElements[sNodeName] ||
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   492
				(sNodeName === "a" && !oTarget.getAttribute("href")))) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   493
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   494
			Y.log(("Firing click event for node:" + oTarget.get("id")), "info", "nodeFocusManager");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   495
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   496
			oTarget.simulate("click");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   497
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   498
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   499
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   500
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   501
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   502
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   503
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   504
	* @method _attachKeyHandler
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   505
	* @description Attaches the "key" event handlers used to support the "keys"
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   506
	* attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   507
	* @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   508
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   509
	_attachKeyHandler: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   510
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   511
		this._detachKeyHandler();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   512
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   513
		var sNextKey = this.get("keys.next"),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   514
			sPrevKey = this.get("keys.previous"),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   515
			oNode = this.get(HOST),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   516
			aHandlers = this._eventHandlers;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   517
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   518
		if (sPrevKey) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   519
 			this._prevKeyHandler =
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   520
				Y.on(KEY, Y.bind(this._focusPrevious, this), oNode, sPrevKey);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   521
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   522
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   523
		if (sNextKey) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   524
 			this._nextKeyHandler =
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   525
				Y.on(KEY, Y.bind(this._focusNext, this), oNode, sNextKey);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   526
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   527
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   528
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   529
		//	In Opera it is necessary to call the "preventDefault" method in
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   530
		//	response to the user pressing the arrow keys in order to prevent
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   531
		//	the viewport from scrolling when the user is moving focus among
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   532
		//	the focusable descendants.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   533
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   534
		if (UA.opera) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   535
			aHandlers.push(oNode.on("keypress", this._preventScroll, this));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   536
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   537
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   538
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   539
		//	For all browsers except Opera: HTML elements that are not natively
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   540
		//	focusable but made focusable via the tabIndex attribute don't
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   541
		//	fire a click event when the user presses the enter key.  It is
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   542
		//	possible to work around this problem by simplying dispatching a
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   543
		//	click event in response to the user pressing the enter key.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   544
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   545
		if (!UA.opera) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   546
			aHandlers.push(oNode.on("keypress", this._fireClick, this));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   547
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   548
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   549
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   550
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   551
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   552
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   553
	* @method _detachEventHandlers
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   554
	* @description Detaches all event handlers used by the Focus Manager.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   555
	* @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   556
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   557
	_detachEventHandlers: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   558
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   559
		this._detachKeyHandler();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   560
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   561
		var aHandlers = this._eventHandlers;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   562
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   563
		if (aHandlers) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   564
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   565
			Y.Array.each(aHandlers, function (handle) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   566
				handle.detach();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   567
			});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   568
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   569
			this._eventHandlers = null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   570
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   571
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   572
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   573
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   574
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   575
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   576
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   577
	* @method _detachEventHandlers
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   578
	* @description Attaches all event handlers used by the Focus Manager.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   579
	* @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   580
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   581
	_attachEventHandlers: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   582
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   583
		var descendants = this._descendants,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   584
			aHandlers,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   585
			oDocument,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   586
			handle;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   587
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   588
		if (descendants && descendants.size()) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   589
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   590
			aHandlers = this._eventHandlers || [];
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   591
			oDocument = this.get(HOST).get("ownerDocument");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   592
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   593
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   594
			if (aHandlers.length === 0) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   595
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   596
		        Y.log("Attaching base set of event handlers.", "info", "nodeFocusManager");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   597
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   598
				aHandlers.push(oDocument.on("focus", this._onDocFocus, this));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   599
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   600
				aHandlers.push(oDocument.on("mousedown",
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   601
					this._onDocMouseDown, this));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   602
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   603
				aHandlers.push(
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   604
						this.after("keysChange", this._attachKeyHandler));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   605
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   606
				aHandlers.push(
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   607
						this.after("descendantsChange", this._initDescendants));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   608
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   609
				aHandlers.push(
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   610
						this.after(ACTIVE_DESCENDANT_CHANGE,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   611
								this._afterActiveDescendantChange));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   612
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   613
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   614
				//	For performance: defer attaching all key-related event
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   615
				//	handlers until the first time one of the specified
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   616
				//	descendants receives focus.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   617
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   618
				handle = this.after("focusedChange", Y.bind(function (event) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   619
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   620
					if (event.newVal) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   621
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   622
				        Y.log("Attaching key event handlers.", "info", "nodeFocusManager");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   623
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   624
						this._attachKeyHandler();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   625
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   626
						//	Detach this "focusedChange" handler so that the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   627
						//	key-related handlers only get attached once.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   628
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   629
						handle.detach();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   630
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   631
					}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   632
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   633
				}, this));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   634
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   635
				aHandlers.push(handle);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   636
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   637
			}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   638
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   639
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   640
			this._eventHandlers = aHandlers;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   641
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   642
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   643
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   644
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   645
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   646
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   647
	//	Protected event handlers
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   648
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   649
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   650
	* @method _onDocMouseDown
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   651
	* @description "mousedown" event handler for the owner document of the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   652
	* Focus Manager's Node.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   653
	* @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   654
	* @param event {Object} Object representing the DOM event.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   655
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   656
	_onDocMouseDown: function (event) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   657
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   658
		var oHost = this.get(HOST),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   659
			oTarget = event.target,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   660
			bChildNode = oHost.contains(oTarget),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   661
			node,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   662
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   663
			getFocusable = function (node) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   664
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   665
				var returnVal = false;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   666
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   667
				if (!node.compareTo(oHost)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   668
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   669
					returnVal = this._isDescendant(node) ? node :
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   670
									getFocusable.call(this, node.get("parentNode"));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   671
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   672
				}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   673
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   674
				return returnVal;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   675
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   676
			};
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   677
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   678
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   679
		if (bChildNode) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   680
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   681
			//	Check to make sure that the target isn't a child node of one
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   682
			//	of the focusable descendants.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   683
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   684
			node = getFocusable.call(this, oTarget);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   685
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   686
			if (node) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   687
				oTarget = node;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   688
			}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   689
			else if (!node && this.get(FOCUSED)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   690
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   691
				//	The target was a non-focusable descendant of the root
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   692
				//	node, so the "focused" attribute should be set to false.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   693
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   694
	 			this._set(FOCUSED, false);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   695
	 			this._onDocFocus(event);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   696
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   697
			}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   698
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   699
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   700
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   701
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   702
		if (bChildNode && this._isDescendant(oTarget)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   703
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   704
			//	Fix general problem in Webkit: mousing down on a button or an
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   705
			//	anchor element doesn't focus it.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   706
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   707
			//	For all browsers: makes sure that the descendant that
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   708
			//	was the target of the mousedown event is now considered the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   709
			//	active descendant.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   710
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   711
			this.focus(oTarget);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   712
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   713
		else if (UA.webkit && this.get(FOCUSED) &&
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   714
			(!bChildNode || (bChildNode && !this._isDescendant(oTarget)))) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   715
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   716
			//	Fix for Webkit:
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   717
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   718
			//	Document doesn't receive focus in Webkit when the user mouses
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   719
			//	down on it, so the "focused" attribute won't get set to the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   720
			//	correct value.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   721
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   722
			//	The goal is to force a blur if the user moused down on
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   723
			//	either: 1) A descendant node, but not one that managed by
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   724
			//	the FocusManager, or 2) an element outside of the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   725
			//	FocusManager
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   726
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   727
 			this._set(FOCUSED, false);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   728
 			this._onDocFocus(event);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   729
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   730
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   731
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   732
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   733
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   734
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   735
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   736
	* @method _onDocFocus
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   737
	* @description "focus" event handler for the owner document of the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   738
	* Focus Manager's Node.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   739
	* @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   740
	* @param event {Object} Object representing the DOM event.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   741
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   742
	_onDocFocus: function (event) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   743
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   744
		var oTarget = this._focusTarget || event.target,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   745
			bFocused = this.get(FOCUSED),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   746
			focusClass = this.get(FOCUS_CLASS),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   747
			oFocusedNode = this._focusedNode,
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   748
			bInCollection;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   749
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   750
		if (this._focusTarget) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   751
			this._focusTarget = null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   752
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   753
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   754
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   755
		if (this.get(HOST).contains(oTarget)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   756
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   757
			//	The target is a descendant of the root Node.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   758
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   759
			bInCollection = this._isDescendant(oTarget);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   760
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   761
			if (!bFocused && bInCollection) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   762
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   763
				//	The user has focused a focusable descendant.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   764
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   765
				bFocused = true;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   766
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   767
			}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   768
			else if (bFocused && !bInCollection) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   769
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   770
				//	The user has focused a child of the root Node that is
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   771
				//	not one of the descendants managed by this Focus Manager
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   772
				//	so clear the currently focused descendant.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   773
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   774
				bFocused = false;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   775
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   776
			}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   777
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   778
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   779
		else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   780
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   781
			// The target is some other node in the document.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   782
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   783
			bFocused = false;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   784
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   785
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   786
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   787
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   788
		if (focusClass) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   789
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   790
			if (oFocusedNode && (!oFocusedNode.compareTo(oTarget) || !bFocused)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   791
				this._removeFocusClass();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   792
			}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   793
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   794
			if (bInCollection && bFocused) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   795
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   796
				if (focusClass.fn) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   797
					oTarget = focusClass.fn(oTarget);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   798
					oTarget.addClass(focusClass.className);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   799
				}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   800
				else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   801
					oTarget.addClass(focusClass);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   802
				}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   803
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   804
				this._focusedNode = oTarget;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   805
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   806
			}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   807
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   808
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   809
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   810
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   811
		this._set(FOCUSED, bFocused);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   812
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   813
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   814
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   815
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   816
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   817
	* @method _focusNext
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   818
	* @description Keydown event handler that moves focus to the next
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   819
	* enabled descendant.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   820
	* @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   821
	* @param event {Object} Object representing the DOM event.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   822
	* @param activeDescendant {Number} Number representing the index of the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   823
	* next descendant to be focused
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   824
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   825
	_focusNext: function (event, activeDescendant) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   826
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   827
		var nActiveDescendant = activeDescendant || this.get(ACTIVE_DESCENDANT),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   828
			oNode;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   829
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   830
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   831
		if (this._isDescendant(event.target) &&
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   832
			(nActiveDescendant <= this._lastNodeIndex)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   833
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   834
			nActiveDescendant = nActiveDescendant + 1;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   835
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   836
			if (nActiveDescendant === (this._lastNodeIndex + 1) &&
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   837
				this.get(CIRCULAR)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   838
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   839
				nActiveDescendant = 0;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   840
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   841
			}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   842
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   843
			oNode = this._descendants.item(nActiveDescendant);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   844
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   845
            if (oNode) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   846
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   847
                if (oNode.get("disabled")) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   848
                    this._focusNext(event, nActiveDescendant);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   849
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   850
                else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   851
                    this.focus(nActiveDescendant);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   852
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   853
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   854
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   855
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   856
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   857
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   858
		this._preventScroll(event);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   859
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   860
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   861
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   862
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   863
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   864
	* @method _focusPrevious
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   865
	* @description Keydown event handler that moves focus to the previous
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   866
	* enabled descendant.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   867
	* @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   868
	* @param event {Object} Object representing the DOM event.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   869
	* @param activeDescendant {Number} Number representing the index of the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   870
	* next descendant to be focused.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   871
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   872
	_focusPrevious: function (event, activeDescendant) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   873
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   874
		var nActiveDescendant = activeDescendant || this.get(ACTIVE_DESCENDANT),
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   875
			oNode;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   876
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   877
		if (this._isDescendant(event.target) && nActiveDescendant >= 0) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   878
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   879
			nActiveDescendant = nActiveDescendant - 1;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   880
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   881
			if (nActiveDescendant === -1 && this.get(CIRCULAR)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   882
				nActiveDescendant = this._lastNodeIndex;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   883
			}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   884
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   885
            oNode = this._descendants.item(nActiveDescendant);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   886
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   887
            if (oNode) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   888
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   889
                if (oNode.get("disabled")) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   890
                    this._focusPrevious(event, nActiveDescendant);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   891
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   892
                else {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   893
                    this.focus(nActiveDescendant);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   894
                }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   895
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   896
            }
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   897
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   898
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   899
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   900
		this._preventScroll(event);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   901
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   902
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   903
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   904
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   905
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   906
	* @method _afterActiveDescendantChange
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   907
	* @description afterChange event handler for the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   908
	* "activeDescendant" attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   909
	* @protected
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   910
	* @param event {Object} Object representing the change event.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   911
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   912
	_afterActiveDescendantChange: function (event) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   913
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   914
		var oNode = this._descendants.item(event.prevVal);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   915
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   916
		if (oNode) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   917
			oNode.set(TAB_INDEX, -1);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   918
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   919
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   920
		oNode = this._descendants.item(event.newVal);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   921
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   922
		if (oNode) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   923
			oNode.set(TAB_INDEX, 0);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   924
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   925
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   926
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   927
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   928
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   929
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   930
	//	Public methods
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   931
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   932
    initializer: function (config) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   933
    	Y.log("WARNING: node-focusmanager is a deprecated module as of YUI 3.9.0. This module will be removed from a later version of the library.", "warn");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   934
		this.start();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   935
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   936
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   937
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   938
	destructor: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   939
		
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   940
		this.stop();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   941
		this.get(HOST).focusManager = null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   942
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   943
    },
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   944
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   945
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   946
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   947
	* @method focus
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   948
	* @description Focuses the active descendant and sets the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   949
	* <code>focused</code> attribute to true.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   950
	* @param index {Number} Optional. Number representing the index of the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   951
	* descendant to be set as the active descendant.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   952
	* @param index {Node} Optional. Node instance representing the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   953
	* descendant to be set as the active descendant.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   954
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   955
	focus: function (index) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   956
		
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   957
		if (Lang.isUndefined(index)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   958
			index = this.get(ACTIVE_DESCENDANT);
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   959
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   960
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   961
		this.set(ACTIVE_DESCENDANT, index, { src: UI });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   962
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   963
		var oNode = this._descendants.item(this.get(ACTIVE_DESCENDANT));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   964
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   965
		if (oNode) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   966
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   967
			oNode.focus();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   968
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   969
			//	In Opera focusing a <BUTTON> element programmatically
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   970
			//	will result in the document-level focus event handler
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   971
			//	"_onDocFocus" being called, resulting in the handler
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   972
			//	incorrectly setting the "focused" Attribute to false.  To fix
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   973
			//	this, set a flag ("_focusTarget") that the "_onDocFocus" method
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   974
			//	can look for to properly handle this edge case.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   975
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   976
			if (UA.opera && oNode.get("nodeName").toLowerCase() === "button") {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   977
				this._focusTarget = oNode;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   978
			}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   979
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   980
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   981
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   982
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   983
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   984
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   985
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   986
	* @method blur
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   987
	* @description Blurs the current active descendant and sets the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   988
	* <code>focused</code> attribute to false.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   989
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   990
	blur: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   991
		
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   992
		var oNode;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   993
		
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   994
		if (this.get(FOCUSED)) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   995
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   996
			oNode = this._descendants.item(this.get(ACTIVE_DESCENDANT));
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   997
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   998
			if (oNode) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
   999
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1000
				oNode.blur();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1001
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1002
				//	For Opera and Webkit:  Blurring an element in either browser
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1003
				//	doesn't result in another element (such as the document)
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1004
				//	being focused.  Therefore, the "_onDocFocus" method
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1005
				//	responsible for managing the application and removal of the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1006
				//	focus indicator class name is never called.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1007
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1008
				this._removeFocusClass();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1009
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1010
			}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1011
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1012
			this._set(FOCUSED, false, { src: UI });
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1013
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1014
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1015
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1016
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1017
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1018
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1019
	* @method start
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1020
	* @description Enables the Focus Manager.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1021
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1022
	start: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1023
		
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1024
		if (this._stopped) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1025
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1026
			this._initDescendants();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1027
			this._attachEventHandlers();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1028
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1029
			this._stopped = false;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1030
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1031
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1032
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1033
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1034
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1035
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1036
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1037
	* @method stop
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1038
	* @description Disables the Focus Manager by detaching all event handlers.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1039
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1040
	stop: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1041
		
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1042
		if (!this._stopped) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1043
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1044
			this._detachEventHandlers();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1045
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1046
			this._descendants = null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1047
			this._focusedNode = null;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1048
			this._lastNodeIndex = 0;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1049
			this._stopped = true;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1050
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1051
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1052
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1053
	},
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1054
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1055
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1056
	/**
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1057
	* @method refresh
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1058
	* @description Refreshes the Focus Manager's descendants by re-executing the
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1059
	* CSS selector query specified by the <code>descendants</code> attribute.
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1060
	*/
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1061
	refresh: function () {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1062
		
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1063
		this._initDescendants();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1064
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1065
		if (!this._eventHandlers) {
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1066
			this._attachEventHandlers();
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1067
		}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1068
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1069
	}
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1070
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1071
});
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1072
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1073
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1074
NodeFocusManager.NAME = "nodeFocusManager";
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1075
NodeFocusManager.NS = "focusManager";
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1076
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1077
Y.namespace("Plugin");
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1078
Y.Plugin.NodeFocusManager = NodeFocusManager;
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1079
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1080
89ef5ed3c48b Upgrades to yui 3.10.3
gibus
parents:
diff changeset
  1081
}, '3.10.3', {"requires": ["attribute", "node", "plugin", "node-event-simulate", "event-key", "event-focus"]});