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