src/cm/media/js/lib/yui/yui3-3.15.0/build/datatable-keynav/datatable-keynav-debug.js
author Yves-Marie Haussonne <ymh.work+github@gmail.com>
Fri, 09 May 2014 18:35:26 +0200
changeset 656 a84519031134
parent 602 e16a97fb364a
permissions -rw-r--r--
add link to "privacy policy" in the header test
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     1
YUI.add('datatable-keynav', function (Y, NAME) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     2
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     3
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     4
 Provides keyboard navigation of DataTable cells and support for adding other
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
 keyboard actions.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
 @module datatable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
 @submodule datatable-keynav
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
var arrEach = Y.Array.each,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
 A DataTable class extension that provides navigation via keyboard, based on
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
 WAI-ARIA recommendation for the [Grid widget](http://www.w3.org/WAI/PF/aria-practices/#grid)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
 and extensible to support other actions.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
 @class DataTable.KeyNav
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
 @for DataTable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
    DtKeyNav = function (){};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
Mapping of key codes to friendly key names that can be used in the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
[keyActions](#property_keyActions) property and [ARIA_ACTIONS](#property_ARIA_ACTIONS)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
property.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
It contains aliases for the following keys:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
    <ul>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
    <li>backspace</li>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
    <li>tab</li>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
    <li>enter</li>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
    <li>esc</li>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
    <li>space</li>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
    <li>pgup</li>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
    <li>pgdown</li>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
    <li>end</li>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
    <li>home</li>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
    <li>left</li>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
    <li>up</li>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
    <li>right</li>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
    <li>down</li>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
    <li>f1 .. f12</li>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
    </ul>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
@property KEY_NAMES
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
@type {Object}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
DtKeyNav.KEY_NAMES = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
     8: 'backspace',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
     9: 'tab',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
    13: 'enter',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
    27: 'esc',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
    32: 'space',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
    33: 'pgup',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
    34: 'pgdown',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
    35: 'end',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
    36: 'home',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
    37: 'left',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
    38: 'up',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
    39: 'right',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
    40: 'down',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
    112:'f1',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
    113:'f2',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
    114:'f3',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
    115:'f4',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
    116:'f5',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
    117:'f6',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
    118:'f7',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
    119:'f8',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
    120:'f9',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
    121:'f10',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
    122:'f11',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
    123:'f12'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
Mapping of key codes to actions according to the WAI-ARIA suggestion for the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
[Grid Widget](http://www.w3.org/WAI/PF/aria-practices/#grid).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
The key for each entry is a key-code or [keyName](#property_KEY_NAMES) while the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
value can be a function that performs the action or a string.  If a string,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
it can either correspond to the name of a method in this module (or  any
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
method in a DataTable instance) or the name of an event to fire.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
@property ARIA_ACTIONS
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
@type Object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
DtKeyNav.ARIA_ACTIONS = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
    left:   '_keyMoveLeft',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
    right:  '_keyMoveRight',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
    up:     '_keyMoveUp',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
    down:   '_keyMoveDown',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
    home:   '_keyMoveRowStart',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
    end:    '_keyMoveRowEnd',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
    pgup:   '_keyMoveColTop',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
    pgdown: '_keyMoveColBottom'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
DtKeyNav.ATTRS = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
    Cell that's currently either focused or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
    focusable when the DataTable gets the focus.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
    @attribute focusedCell
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
    @type Node
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
    @default first cell in the table.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
    focusedCell: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
        setter: '_focusedCellSetter'
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
    Determines whether it is possible to navigate into the header area.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
    The examples referenced in the document show both behaviors so it seems
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
    it is optional.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
    @attribute keyIntoHeaders
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
    @type Boolean
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
    @default true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
    keyIntoHeaders: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
        value: true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
Y.mix( DtKeyNav.prototype, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
    Table of actions to be performed for each key.  It is loaded with a clone
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
    of [ARIA_ACTIONS](#property_ARIA_ACTIONS) by default.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   136
    The key for each entry is either a key-code or an alias from the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   137
    [KEY_NAMES](#property_KEY_NAMES) table. They can be prefixed with any combination
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   138
    of the modifier keys `alt`, `ctrl`, `meta` or `shift` each followed by a hyphen,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
    such as `"ctrl-shift-up"` (modifiers, if more than one, should appear in alphabetical order).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
    The value for each entry should be a function or the name of a method in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
    the DataTable instance.  The method will receive the original keyboard
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
    EventFacade as its only argument.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
    If the value is a string and it cannot be resolved into a method,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
    it will be assumed to be the name of an event to fire. The listener for that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   147
    event will receive an EventFacade containing references to the cell that has the focus,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
    the row, column and, unless it is a header row, the record it corresponds to.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
    The second argument will be the original EventFacade for the keyboard event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
     @property keyActions
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
     @type {Object}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
     @default Y.DataTable.keyNav.ARIA_ACTIONS
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
    keyActions: null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   157
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   158
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   159
    Array containing the event handles to any event that might need to be detached
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
    on destruction.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
    @property _keyNavSubscr
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
    @type Array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   163
    @default null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   164
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   165
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   166
    _keyNavSubscr: null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   167
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   168
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   169
    Reference to the THead section that holds the headers for the datatable.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   170
    For a Scrolling DataTable, it is the one visible to the user.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   171
    @property _keyNavTHead
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   172
    @type Node
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   173
    @default: null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   174
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   175
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   176
    _keyNavTHead: null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   177
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   178
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   179
    Indicates if the headers of the table are nested or not.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   180
    Nested headers makes navigation in the headers much harder.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   181
    @property _keyNavNestedHeaders
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   182
    @default false
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   183
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   184
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   185
    _keyNavNestedHeaders: false,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   186
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   187
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   188
    CSS class name prefix for columns, used to search for a cell by key.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   189
    @property _keyNavColPrefix
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   190
    @type String
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   191
    @default null (initialized via getClassname() )
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   192
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   193
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   194
    _keyNavColPrefix:null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   195
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   196
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   197
    Regular expression to extract the column key from a cell via its CSS class name.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   198
    @property _keyNavColRegExp
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   199
    @type RegExp
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   200
    @default null (initialized based on _keyNavColPrefix)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   201
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   202
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   203
    _keyNavColRegExp:null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   204
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   205
    initializer: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   206
        this.onceAfter('render', this._afterKeyNavRender);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   207
        this._keyNavSubscr = [
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   208
            this.after('focusedCellChange', this._afterKeyNavFocusedCellChange),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   209
            this.after('focusedChange', this._afterKeyNavFocusedChange)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   210
        ];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   211
        this._keyNavColPrefix = this.getClassName('col', '');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   212
        this._keyNavColRegExp = new RegExp(this._keyNavColPrefix + '(.+?)(\\s|$)');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   213
        this.keyActions = Y.clone(DtKeyNav.ARIA_ACTIONS);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   214
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   215
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   216
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   217
    destructor: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   218
        arrEach(this._keyNavSubscr, function (evHandle) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   219
            if (evHandle && evHandle.detach) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   220
                evHandle.detach();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   221
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   222
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   223
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   224
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   225
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   226
    Sets the tabIndex on the focused cell and, if the DataTable has the focus,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   227
    sets the focus on it.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   228
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   229
    @method _afterFocusedCellChange
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   230
    @param e {EventFacade}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   231
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   232
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   233
    _afterKeyNavFocusedCellChange: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   234
        var newVal  = e.newVal,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   235
            prevVal = e.prevVal;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   236
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   237
        if (prevVal) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   238
            prevVal.set('tabIndex', -1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   239
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   240
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   241
        if (newVal) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   242
            newVal.set('tabIndex', 0);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   243
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   244
            if (this.get('focused')) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   245
                newVal.scrollIntoView();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   246
                newVal.focus();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   247
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   248
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   249
            this.set('focused', null);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   250
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   251
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   252
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   253
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   254
    When the DataTable gets the focus, it ensures the correct cell regains
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   255
    the focus.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   256
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   257
    @method _afterKeyNavFocusedChange
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   258
    @param e {EventFacade}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   259
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   260
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   261
    _afterKeyNavFocusedChange: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   262
        var cell = this.get('focusedCell');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   263
        if (e.newVal) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   264
            if (cell) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   265
                cell.scrollIntoView();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   266
                cell.focus();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   267
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   268
                this._keyMoveFirst();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   269
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   270
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   271
            if (cell) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   272
                cell.blur();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   273
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   274
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   275
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   276
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   277
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   278
    Subscribes to the events on the DataTable elements once they have been rendered,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   279
    finds out the header section and makes the top-left element focusable.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   280
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   281
    @method _afterKeyNavRender
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   282
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   283
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   284
    _afterKeyNavRender: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   285
        var cbx = this.get('contentBox');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   286
        this._keyNavSubscr.push(
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   287
            cbx.on('keydown', this._onKeyNavKeyDown, this),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   288
            cbx.on('click', this._onKeyNavClick, this)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   289
        );
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   290
        this._keyNavTHead = (this._yScrollHeader || this._tableNode).one('thead');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   291
        this._keyMoveFirst();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   292
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   293
        // determine if we have nested headers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   294
        this._keyNavNestedHeaders = (this.get('columns').length !== this.head.theadNode.all('th').size());
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   295
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   296
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   297
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   298
    In response to a click event, it sets the focus on the clicked cell
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   299
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   300
    @method _onKeyNavClick
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   301
    @param e {EventFacade}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   302
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   303
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   304
    _onKeyNavClick: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   305
        var cell = e.target.ancestor((this.get('keyIntoHeaders') ? 'td, th': 'td'), true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   306
        if (cell) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   307
            this.focus();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   308
            this.set('focusedCell', cell);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   309
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   310
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   311
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   312
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   313
    Responds to a key down event by executing the action set in the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   314
    [keyActions](#property_keyActions) table.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   315
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   316
    @method _onKeyNavKeyDown
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   317
    @param e {EventFacade}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   318
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   319
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   320
    _onKeyNavKeyDown: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   321
        var keyCode = e.keyCode,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   322
            keyName = DtKeyNav.KEY_NAMES[keyCode] || keyCode,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   323
            action;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   324
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   325
        arrEach(['alt', 'ctrl', 'meta', 'shift'], function (modifier) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   326
            if (e[modifier + 'Key']) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   327
                keyCode = modifier + '-' + keyCode;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   328
                keyName = modifier + '-' + keyName;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   329
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   330
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   331
        action = this.keyActions[keyCode] || this.keyActions[keyName];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   332
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   333
        if (typeof action === 'string') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   334
            if (this[action]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   335
                this[action].call(this, e);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   336
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   337
                this._keyNavFireEvent(action, e);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   338
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   339
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   340
            action.call(this, e);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   341
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   342
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   343
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   344
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   345
    If the action associated to a key combination is a string and no method
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   346
    by that name was found in this instance, this method will
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   347
    fire an event using that string and provides extra information
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   348
    to the listener.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   349
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   350
    @method _keyNavFireEvent
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   351
    @param action {String} Name of the event to fire
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   352
    @param e {EventFacade} Original facade from the keydown event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   353
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   354
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   355
    _keyNavFireEvent: function (action, e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   356
        var cell = e.target.ancestor('td, th', true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   357
        if (cell) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   358
            this.fire(action, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   359
                cell: cell,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   360
                row: cell.ancestor('tr'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   361
                record: this.getRecord(cell),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   362
                column: this.getColumn(cell.get('cellIndex'))
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   363
            }, e);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   364
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   365
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   366
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   367
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   368
    Sets the focus on the very first cell in the header of the table.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   369
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   370
    @method _keyMoveFirst
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   371
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   372
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   373
    _keyMoveFirst: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   374
        this.set('focusedCell' , (this.get('keyIntoHeaders') ? this._keyNavTHead.one('th') : this._tbodyNode.one('td')), {src:'keyNav'});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   375
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   376
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   377
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   378
    Sets the focus on the cell to the left of the currently focused one.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   379
    Does not wrap, following the WAI-ARIA recommendation.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   380
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   381
    @method _keyMoveLeft
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   382
    @param e {EventFacade} Event Facade for the keydown event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   383
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   384
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   385
    _keyMoveLeft: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   386
        var cell = this.get('focusedCell'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   387
            index = cell.get('cellIndex'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   388
            row = cell.ancestor();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   389
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   390
        e.preventDefault();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   391
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   392
        if (index === 0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   393
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   394
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   395
        cell = row.get('cells').item(index - 1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   396
        this.set('focusedCell', cell , {src:'keyNav'});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   397
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   398
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   399
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   400
    Sets the focus on the cell to the right of the currently focused one.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   401
    Does not wrap, following the WAI-ARIA recommendation.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   402
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   403
    @method _keyMoveRight
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   404
    @param e {EventFacade} Event Facade for the keydown event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   405
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   406
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   407
    _keyMoveRight: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   408
        var cell = this.get('focusedCell'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   409
            row = cell.ancestor('tr'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   410
            section = row.ancestor(),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   411
            inHead = section === this._keyNavTHead,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   412
            nextCell,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   413
            parent;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   414
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   415
        e.preventDefault();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   416
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   417
        // a little special with nested headers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   418
        /*
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   419
            +-------------+-------+
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   420
            | ABC         | DE    |
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   421
            +-------+-----+---+---+
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   422
            | AB    |     |   |   |
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   423
            +---+---+     |   |   |
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   424
            | A | B |  C  | D | E |
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   425
            +---+---+-----+---+---+
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   426
        */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   427
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   428
        nextCell = cell.next();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   429
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   430
        if (row.get('rowIndex') !== 0 && inHead && this._keyNavNestedHeaders) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   431
            if (nextCell) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   432
                cell = nextCell;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   433
            } else { //-- B -> C
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   434
                parent = this._getTHParent(cell);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   435
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   436
                if (parent && parent.next()) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   437
                    cell = parent.next();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   438
                } else { //-- E -> ...
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   439
                    return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   440
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   441
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   442
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   443
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   444
            if (!nextCell) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   445
                return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   446
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   447
                cell = nextCell;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   448
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   449
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   450
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   451
        this.set('focusedCell', cell, { src:'keyNav' });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   452
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   453
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   454
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   455
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   456
    Sets the focus on the cell above the currently focused one.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   457
    It will move into the headers when the top of the data rows is reached.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   458
    Does not wrap, following the WAI-ARIA recommendation.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   459
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   460
    @method _keyMoveUp
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   461
    @param e {EventFacade} Event Facade for the keydown event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   462
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   463
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   464
    _keyMoveUp: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   465
        var cell = this.get('focusedCell'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   466
            cellIndex = cell.get('cellIndex'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   467
            row = cell.ancestor('tr'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   468
            rowIndex = row.get('rowIndex'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   469
            section = row.ancestor(),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   470
            sectionRows = section.get('rows'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   471
            inHead = section === this._keyNavTHead,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   472
            parent;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   473
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   474
        e.preventDefault();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   475
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   476
        if (!inHead) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   477
            rowIndex -= section.get('firstChild').get('rowIndex');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   478
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   479
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   480
        if (rowIndex === 0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   481
            if (inHead || !this.get('keyIntoHeaders')) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   482
                return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   483
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   484
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   485
            section = this._keyNavTHead;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   486
            sectionRows = section.get('rows');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   487
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   488
            if (this._keyNavNestedHeaders) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   489
                key = this._getCellColumnName(cell);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   490
                cell = section.one('.' + this._keyNavColPrefix + key);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   491
                cellIndex = cell.get('cellIndex');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   492
                row = cell.ancestor('tr');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   493
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   494
                row = section.get('firstChild');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   495
                cell = row.get('cells').item(cellIndex);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   496
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   497
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   498
            if (inHead && this._keyNavNestedHeaders) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   499
                key = this._getCellColumnName(cell);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   500
                parent = this._columnMap[key]._parent;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   501
                if (parent) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   502
                    cell = section.one('#' + parent.id);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   503
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   504
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   505
                row = sectionRows.item(rowIndex -1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   506
                cell = row.get('cells').item(cellIndex);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   507
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   508
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   509
        this.set('focusedCell', cell);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   510
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   511
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   512
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   513
    Sets the focus on the cell below the currently focused one.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   514
    It will move into the data rows when the bottom of the header rows is reached.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   515
    Does not wrap, following the WAI-ARIA recommendation.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   516
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   517
    @method _keyMoveDown
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   518
    @param e {EventFacade} Event Facade for the keydown event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   519
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   520
    */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   521
    _keyMoveDown: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   522
        var cell = this.get('focusedCell'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   523
            cellIndex = cell.get('cellIndex'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   524
            row = cell.ancestor('tr'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   525
            rowIndex = row.get('rowIndex') + 1,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   526
            section = row.ancestor(),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   527
            inHead = section === this._keyNavTHead,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   528
            tbody = (this.body && this.body.tbodyNode),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   529
            sectionRows = section.get('rows'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   530
            key,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   531
            children;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   532
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   533
        e.preventDefault();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   534
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   535
        if (inHead) { // focused cell is in the header
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   536
            if (this._keyNavNestedHeaders) { // the header is nested
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   537
                key = this._getCellColumnName(cell);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   538
                children = this._columnMap[key].children;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   539
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   540
                rowIndex += (cell.getAttribute('rowspan') || 1) - 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   541
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   542
                if (children) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   543
                    // stay in thead
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   544
                    cell = section.one('#' + children[0].id);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   545
                } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   546
                    // moving into tbody
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   547
                    cell = tbody.one('.' + this._keyNavColPrefix + key);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   548
                    section = tbody;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   549
                    sectionRows = section.get('rows');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   550
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   551
                cellIndex = cell.get('cellIndex');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   552
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   553
            } else { // the header is not nested
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   554
                row = tbody.one('tr');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   555
                cell = row.get('cells').item(cellIndex);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   556
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   557
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   558
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   559
        // offset row index to tbody
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   560
        rowIndex -= sectionRows.item(0).get('rowIndex');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   561
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   562
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   563
        if (rowIndex >= sectionRows.size()) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   564
            if (!inHead) { // last row in tbody
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   565
                return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   566
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   567
            section = tbody;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   568
            row = section.one('tr');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   569
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   570
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   571
            row = sectionRows.item(rowIndex);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   572
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   573
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   574
        this.set('focusedCell', row.get('cells').item(cellIndex));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   575
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   576
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   577
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   578
    Sets the focus on the left-most cell of the row containing the currently focused cell.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   579
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   580
    @method _keyMoveRowStart
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   581
    @param e {EventFacade} Event Facade for the keydown event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   582
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   583
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   584
    _keyMoveRowStart: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   585
        var row = this.get('focusedCell').ancestor();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   586
        this.set('focusedCell', row.get('firstChild'), {src:'keyNav'});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   587
        e.preventDefault();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   588
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   589
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   590
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   591
    Sets the focus on the right-most cell of the row containing the currently focused cell.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   592
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   593
    @method _keyMoveRowEnd
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   594
    @param e {EventFacade} Event Facade for the keydown event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   595
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   596
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   597
    _keyMoveRowEnd: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   598
        var row = this.get('focusedCell').ancestor();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   599
        this.set('focusedCell', row.get('lastChild'), {src:'keyNav'});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   600
        e.preventDefault();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   601
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   603
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   604
    Sets the focus on the top-most cell of the column containing the currently focused cell.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   605
    It would normally be a header cell.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   606
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   607
    @method _keyMoveColTop
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   608
    @param e {EventFacade} Event Facade for the keydown event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   609
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   610
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   611
    _keyMoveColTop: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   612
        var cell = this.get('focusedCell'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   613
            cellIndex = cell.get('cellIndex'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   614
            key, header;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   615
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   616
        e.preventDefault();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   617
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   618
        if (this._keyNavNestedHeaders && this.get('keyIntoHeaders')) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   619
            key = this._getCellColumnName(cell);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   620
            header = this._columnMap[key];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   621
            while (header._parent) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   622
                header = header._parent;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   623
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   624
            cell = this._keyNavTHead.one('#' + header.id);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   625
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   626
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   627
            cell = (this.get('keyIntoHeaders') ? this._keyNavTHead: this._tbodyNode).get('firstChild').get('cells').item(cellIndex);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   628
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   629
        this.set('focusedCell', cell , {src:'keyNav'});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   630
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   631
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   632
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   633
    Sets the focus on the last cell of the column containing the currently focused cell.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   634
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   635
    @method _keyMoveColBottom
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   636
    @param e {EventFacade} Event Facade for the keydown event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   637
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   638
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   639
    _keyMoveColBottom: function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   640
        var cell = this.get('focusedCell'),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   641
            cellIndex = cell.get('cellIndex');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   642
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   643
        this.set('focusedCell', this._tbodyNode.get('lastChild').get('cells').item(cellIndex), {src:'keyNav'});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   644
        e.preventDefault();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   645
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   646
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   647
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   648
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   649
    Setter method for the [focusedCell](#attr_focusedCell) attribute.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   650
    Checks that the passed value is a Node, either a TD or TH and is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   651
    contained within the DataTable contentBox.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   652
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   653
    @method _focusedCellSetter
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   654
    @param cell {Node} DataTable cell to receive the focus
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   655
    @return cell or Y.Attribute.INVALID_VALUE
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   656
    @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   657
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   658
    _focusedCellSetter: function (cell) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   659
        if (cell instanceof Y.Node) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   660
            var tag = cell.get('tagName').toUpperCase();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   661
            if ((tag === 'TD' || tag === 'TH') && this.get('contentBox').contains(cell) ) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   662
                return cell;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   663
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   664
        } else if (cell === null) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   665
            return cell;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   666
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   667
        return Y.Attribute.INVALID_VALUE;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   668
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   669
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   670
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   671
     Retrieves the parent cell of the given TH cell. If there is no parent for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   672
     the provided cell, null is returned.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   673
     @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   674
     @method _getTHParent
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   675
     @param {Node} thCell Cell to find parent of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   676
     @return {Node} Parent of the cell provided or null
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   677
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   678
    _getTHParent: function (thCell) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   679
        var key = this._getCellColumnName(thCell),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   680
            parent = this._columnMap[key] && this._columnMap[key]._parent;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   681
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   682
        if (parent) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   683
            return thCell.ancestor().ancestor().one('.' + this._keyNavColPrefix + parent.key);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   684
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   685
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   686
        return null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   687
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   688
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   689
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   690
     Retrieves the column name based from the data attribute on the cell if
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   691
     available. Other wise, extracts the column name from the classname
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   692
     @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   693
     @method _getCellColumnName
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   694
     @param {Node} cell Cell to get column name from
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   695
     @return String Column name of the provided cell
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   696
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   697
    _getCellColumnName: function (cell) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   698
        return cell.getData('yui3-col-id') || this._keyNavColRegExp.exec(cell.get('className'))[1];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   699
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   700
});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   701
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   702
Y.DataTable.KeyNav = DtKeyNav;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   703
Y.Base.mix(Y.DataTable, [DtKeyNav]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   704
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   705
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   706
}, '@VERSION@', {"requires": ["datatable-base"]});