src/cm/media/js/lib/yui/yui3-3.15.0/build/event-valuechange/event-valuechange-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('event-valuechange', 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
Adds a synthetic `valuechange` event that fires when the `value` property of an
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
`<input>`, `<textarea>`, `<select>`, or `[contenteditable="true"]` node changes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
as a result of a keystroke, mouse operation, or input method editor (IME)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
input event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
Usage:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
    YUI().use('event-valuechange', function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
        Y.one('#my-input').on('valuechange', function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
            Y.log('previous value: ' + e.prevVal);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
            Y.log('new value: ' + e.newVal);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
        });
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
@module event-valuechange
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
Provides the implementation for the synthetic `valuechange` event. This class
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
isn't meant to be used directly, but is public to make monkeypatching possible.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
Usage:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
    YUI().use('event-valuechange', function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
        Y.one('#my-input').on('valuechange', function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
            Y.log('previous value: ' + e.prevVal);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
            Y.log('new value: ' + e.newVal);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
@class ValueChange
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
@static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
*/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
var DATA_KEY = '_valuechange',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
    VALUE    = 'value',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
    NODE_NAME = 'nodeName',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
    config, // defined at the end of this file
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
// Just a simple namespace to make methods overridable.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
VC = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
    // -- Static Constants -----------------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
    Interval (in milliseconds) at which to poll for changes to the value of an
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
    element with one or more `valuechange` subscribers when the user is likely
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
    to be interacting with it.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
    @property POLL_INTERVAL
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
    @type Number
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
    @default 50
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
    POLL_INTERVAL: 50,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
    Timeout (in milliseconds) after which to stop polling when there hasn't been
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
    any new activity (keypresses, mouse clicks, etc.) on an element.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
    @property TIMEOUT
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
    @type Number
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
    @default 10000
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
    TIMEOUT: 10000,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
    // -- Protected Static Methods ---------------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
    Called at an interval to poll for changes to the value of the specified
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
    node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
    @method _poll
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
    @param {Node} node Node to poll.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
    @param {Object} options Options object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
        @param {EventFacade} [options.e] Event facade of the event that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
            initiated the polling.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
    _poll: function (node, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
        var domNode  = node._node, // performance cheat; getValue() is a big hit when polling
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
            event    = options.e,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
            vcData   = node._data && node._data[DATA_KEY], // another perf cheat
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
            stopped  = 0,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
            facade, prevVal, newVal, nodeName, selectedOption, stopElement;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
        if (!(domNode && vcData)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
            Y.log('_poll: node #' + node.get('id') + ' disappeared; stopping polling and removing all notifiers.', 'warn', 'event-valuechange');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
            VC._stopPolling(node);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
        prevVal = vcData.prevVal;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
        nodeName  = vcData.nodeName;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
        if (vcData.isEditable) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
            // Use innerHTML for performance
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
            newVal = domNode.innerHTML;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
        } else if (nodeName === 'input' || nodeName === 'textarea') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
            // Use value property for performance
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
            newVal = domNode.value;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
        } else if (nodeName === 'select') {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
            // Back-compatibility with IE6 <select> element values.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
            // Huge performance cheat to get past node.get('value').
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
            selectedOption = domNode.options[domNode.selectedIndex];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
            newVal = selectedOption.value || selectedOption.text;
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
        if (newVal !== prevVal) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
            vcData.prevVal = newVal;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
            facade = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
                _event       : event,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
                currentTarget: (event && event.currentTarget) || node,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
                newVal       : newVal,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
                prevVal      : prevVal,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
                target       : (event && event.target) || node
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
            };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
            Y.Object.some(vcData.notifiers, function (notifier) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
                var evt = notifier.handle.evt,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
                    newStopped;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
                // support e.stopPropagation()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
                if (stopped !== 1) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
                    notifier.fire(facade);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
                } else if (evt.el === stopElement) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
                    notifier.fire(facade);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   136
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   137
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   138
                newStopped = evt && evt._facade ? evt._facade.stopped : 0;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
                // need to consider the condition in which there are two
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
                // listeners on the same element:
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
                // listener 1 calls e.stopPropagation()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
                // listener 2 calls e.stopImmediatePropagation()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
                if (newStopped > stopped) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
                    stopped = newStopped;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   147
                    if (stopped === 1) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
                        stopElement = evt.el;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
                // support e.stopImmediatePropagation()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
                if (stopped === 2) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
                    return true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   157
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   158
            VC._refreshTimeout(node);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   159
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   163
    Restarts the inactivity timeout for the specified node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   164
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   165
    @method _refreshTimeout
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   166
    @param {Node} node Node to refresh.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   167
    @param {SyntheticEvent.Notifier} notifier
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   168
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   169
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   170
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   171
    _refreshTimeout: function (node, notifier) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   172
        // The node may have been destroyed, so check that it still exists
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   173
        // before trying to get its data. Otherwise an error will occur.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   174
        if (!node._node) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   175
            Y.log('_stopPolling: node disappeared', 'warn', 'event-valuechange');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   176
            return;
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
        var vcData = node.getData(DATA_KEY);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   180
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   181
        VC._stopTimeout(node); // avoid dupes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   182
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   183
        // If we don't see any changes within the timeout period (10 seconds by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   184
        // default), stop polling.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   185
        vcData.timeout = setTimeout(function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   186
            Y.log('timeout: #' + node.get('id'), 'info', 'event-valuechange');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   187
            VC._stopPolling(node, notifier);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   188
        }, VC.TIMEOUT);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   189
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   190
        Y.log('_refreshTimeout: #' + node.get('id'), 'info', 'event-valuechange');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   191
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   192
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   193
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   194
    Begins polling for changes to the `value` property of the specified node. If
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   195
    polling is already underway for the specified node, it will not be restarted
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   196
    unless the `force` option is `true`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   197
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   198
    @method _startPolling
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   199
    @param {Node} node Node to watch.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   200
    @param {SyntheticEvent.Notifier} notifier
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   201
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   202
    @param {Object} options Options object.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   203
        @param {EventFacade} [options.e] Event facade of the event that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   204
            initiated the polling.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   205
        @param {Boolean} [options.force=false] If `true`, polling will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   206
            restarted even if we're already polling this node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   207
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   208
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   209
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   210
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   211
    _startPolling: function (node, notifier, options) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   212
        var vcData, isEditable;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   213
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   214
        if (!node.test('input,textarea,select') && !(isEditable = VC._isEditable(node))) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   215
            Y.log('_startPolling: aborting poll on #' + node.get('id') + ' -- not a detectable node', 'warn', 'event-valuechange');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   216
            return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   217
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   218
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   219
        vcData = node.getData(DATA_KEY);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   220
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   221
        if (!vcData) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   222
            vcData = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   223
                nodeName   : node.get(NODE_NAME).toLowerCase(),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   224
                isEditable : isEditable,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   225
                prevVal    : isEditable ? node.getDOMNode().innerHTML : node.get(VALUE)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   226
            };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   227
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   228
            node.setData(DATA_KEY, vcData);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   229
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   230
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   231
        vcData.notifiers || (vcData.notifiers = {});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   232
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   233
        // Don't bother continuing if we're already polling this node, unless
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   234
        // `options.force` is true.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   235
        if (vcData.interval) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   236
            if (options.force) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   237
                VC._stopPolling(node, notifier); // restart polling, but avoid dupe polls
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   238
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   239
                vcData.notifiers[Y.stamp(notifier)] = notifier;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   240
                return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   241
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   242
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   243
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   244
        // Poll for changes to the node's value. We can't rely on keyboard
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   245
        // events for this, since the value may change due to a mouse-initiated
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   246
        // paste event, an IME input event, or for some other reason that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   247
        // doesn't trigger a key event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   248
        vcData.notifiers[Y.stamp(notifier)] = notifier;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   249
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   250
        vcData.interval = setInterval(function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   251
            VC._poll(node, options);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   252
        }, VC.POLL_INTERVAL);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   253
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   254
        Y.log('_startPolling: #' + node.get('id'), 'info', 'event-valuechange');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   255
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   256
        VC._refreshTimeout(node, notifier);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   257
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   258
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   259
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   260
    Stops polling for changes to the specified node's `value` attribute.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   261
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   262
    @method _stopPolling
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   263
    @param {Node} node Node to stop polling on.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   264
    @param {SyntheticEvent.Notifier} [notifier] Notifier to remove from the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   265
        node. If not specified, all notifiers will be removed.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   266
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   267
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   268
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   269
    _stopPolling: function (node, notifier) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   270
        // The node may have been destroyed, so check that it still exists
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   271
        // before trying to get its data. Otherwise an error will occur.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   272
        if (!node._node) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   273
            Y.log('_stopPolling: node disappeared', 'info', 'event-valuechange');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   274
            return;
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
        var vcData = node.getData(DATA_KEY) || {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   278
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   279
        clearInterval(vcData.interval);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   280
        delete vcData.interval;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   281
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   282
        VC._stopTimeout(node);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   283
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   284
        if (notifier) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   285
            vcData.notifiers && delete vcData.notifiers[Y.stamp(notifier)];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   286
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   287
            vcData.notifiers = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   288
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   289
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   290
        Y.log('_stopPolling: #' + node.get('id'), 'info', 'event-valuechange');
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   291
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   292
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   293
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   294
    Clears the inactivity timeout for the specified node, if any.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   295
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   296
    @method _stopTimeout
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   297
    @param {Node} node
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   298
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   299
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   300
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   301
    _stopTimeout: function (node) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   302
        var vcData = node.getData(DATA_KEY) || {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   303
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   304
        clearTimeout(vcData.timeout);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   305
        delete vcData.timeout;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   306
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   307
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   308
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   309
    Check to see if a node has editable content or not.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   310
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   311
    TODO: Add additional checks to get it to work for child nodes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   312
    that inherit "contenteditable" from parent nodes. This may be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   313
    too computationally intensive to be placed inside of the `_poll`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   314
    loop, however.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   315
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   316
    @method _isEditable
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   317
    @param {Node} node
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   318
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   319
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   320
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   321
    _isEditable: function (node) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   322
        // Performance cheat because this is used inside `_poll`
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   323
        var domNode = node._node;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   324
        return domNode.contentEditable === 'true' ||
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   325
               domNode.contentEditable === '';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   326
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   327
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   328
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   329
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   330
    // -- Protected Static Event Handlers --------------------------------------
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   331
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   332
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   333
    Stops polling when a node's blur event fires.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   334
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   335
    @method _onBlur
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   336
    @param {EventFacade} e
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   337
    @param {SyntheticEvent.Notifier} notifier
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   338
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   339
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   340
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   341
    _onBlur: function (e, notifier) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   342
        VC._stopPolling(e.currentTarget, notifier);
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
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   346
    Resets a node's history and starts polling when a focus event occurs.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   347
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   348
    @method _onFocus
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   349
    @param {EventFacade} e
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   350
    @param {SyntheticEvent.Notifier} notifier
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   351
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   352
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   353
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   354
    _onFocus: function (e, notifier) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   355
        var node       = e.currentTarget,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   356
            vcData     = node.getData(DATA_KEY);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   357
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   358
        if (!vcData) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   359
            vcData = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   360
                isEditable : VC._isEditable(node),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   361
                nodeName   : node.get(NODE_NAME).toLowerCase()
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   362
            };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   363
            node.setData(DATA_KEY, vcData);
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
        vcData.prevVal = vcData.isEditable ? node.getDOMNode().innerHTML : node.get(VALUE);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   367
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   368
        VC._startPolling(node, notifier, {e: e});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   369
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   370
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   371
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   372
    Starts polling when a node receives a keyDown event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   373
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   374
    @method _onKeyDown
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   375
    @param {EventFacade} e
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   376
    @param {SyntheticEvent.Notifier} notifier
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   377
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   378
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   379
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   380
    _onKeyDown: function (e, notifier) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   381
        VC._startPolling(e.currentTarget, notifier, {e: e});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   382
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   383
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   384
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   385
    Starts polling when an IME-related keyUp event occurs on a node.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   386
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   387
    @method _onKeyUp
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   388
    @param {EventFacade} e
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   389
    @param {SyntheticEvent.Notifier} notifier
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   390
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   391
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   392
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   393
    _onKeyUp: function (e, notifier) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   394
        // These charCodes indicate that an IME has started. We'll restart
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   395
        // polling and give the IME up to 10 seconds (by default) to finish.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   396
        if (e.charCode === 229 || e.charCode === 197) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   397
            VC._startPolling(e.currentTarget, notifier, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   398
                e    : e,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   399
                force: true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   400
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   401
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   402
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   403
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   404
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   405
    Starts polling when a node receives a mouseDown event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   406
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   407
    @method _onMouseDown
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   408
    @param {EventFacade} e
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   409
    @param {SyntheticEvent.Notifier} notifier
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   410
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   411
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   412
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   413
    _onMouseDown: function (e, notifier) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   414
        VC._startPolling(e.currentTarget, notifier, {e: e});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   415
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   416
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   417
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   418
    Called when the `valuechange` event receives a new subscriber.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   419
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   420
    Child nodes that aren't initially available when this subscription is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   421
    called will still fire the `valuechange` event after their data is
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   422
    collected when the delegated `focus` event is captured. This includes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   423
    elements that haven't been inserted into the DOM yet, as well as
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   424
    elements that aren't initially `contenteditable`.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   425
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   426
    @method _onSubscribe
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   427
    @param {Node} node
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   428
    @param {Subscription} sub
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   429
    @param {SyntheticEvent.Notifier} notifier
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   430
    @param {Function|String} [filter] Filter function or selector string. Only
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   431
        provided for delegate subscriptions.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   432
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   433
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   434
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   435
    _onSubscribe: function (node, sub, notifier, filter) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   436
        var _valuechange, callbacks, isEditable, inputNodes, editableNodes;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   437
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   438
        callbacks = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   439
            blur     : VC._onBlur,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   440
            focus    : VC._onFocus,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   441
            keydown  : VC._onKeyDown,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   442
            keyup    : VC._onKeyUp,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   443
            mousedown: VC._onMouseDown
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   444
        };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   445
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   446
        // Store a utility object on the notifier to hold stuff that needs to be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   447
        // passed around to trigger event handlers, polling handlers, etc.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   448
        _valuechange = notifier._valuechange = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   449
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   450
        if (filter) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   451
            // If a filter is provided, then this is a delegated subscription.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   452
            _valuechange.delegated = true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   453
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   454
            // Add a function to the notifier that we can use to find all
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   455
            // nodes that pass the delegate filter.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   456
            _valuechange.getNodes = function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   457
                inputNodes    = node.all('input,textarea,select').filter(filter);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   458
                editableNodes = node.all('[contenteditable="true"],[contenteditable=""]').filter(filter);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   459
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   460
                return inputNodes.concat(editableNodes);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   461
            };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   462
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   463
            // Store the initial values for each descendant of the container
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   464
            // node that passes the delegate filter.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   465
            _valuechange.getNodes().each(function (child) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   466
                if (!child.getData(DATA_KEY)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   467
                    child.setData(DATA_KEY, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   468
                        nodeName   : child.get(NODE_NAME).toLowerCase(),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   469
                        isEditable : VC._isEditable(child),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   470
                        prevVal    : isEditable ? child.getDOMNode().innerHTML : child.get(VALUE)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   471
                    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   472
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   473
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   474
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   475
            notifier._handles = Y.delegate(callbacks, node, filter, null,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   476
                notifier);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   477
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   478
            isEditable = VC._isEditable(node);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   479
            // This is a normal (non-delegated) event subscription.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   480
            if (!node.test('input,textarea,select') && !isEditable) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   481
                return;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   482
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   483
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   484
            if (!node.getData(DATA_KEY)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   485
                node.setData(DATA_KEY, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   486
                    nodeName   : node.get(NODE_NAME).toLowerCase(),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   487
                    isEditable : isEditable,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   488
                    prevVal    : isEditable ? node.getDOMNode().innerHTML : node.get(VALUE)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   489
                });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   490
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   491
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   492
            notifier._handles = node.on(callbacks, null, null, notifier);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   493
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   494
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   495
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   496
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   497
    Called when the `valuechange` event loses a subscriber.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   498
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   499
    @method _onUnsubscribe
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   500
    @param {Node} node
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   501
    @param {Subscription} subscription
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   502
    @param {SyntheticEvent.Notifier} notifier
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   503
    @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   504
    @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   505
    **/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   506
    _onUnsubscribe: function (node, subscription, notifier) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   507
        var _valuechange = notifier._valuechange;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   508
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   509
        notifier._handles && notifier._handles.detach();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   510
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   511
        if (_valuechange.delegated) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   512
            _valuechange.getNodes().each(function (child) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   513
                VC._stopPolling(child, notifier);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   514
            });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   515
        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   516
            VC._stopPolling(node, notifier);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   517
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   518
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   519
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   520
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   521
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   522
Synthetic event that fires when the `value` property of an `<input>`,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   523
`<textarea>`, `<select>`, or `[contenteditable="true"]` node changes as a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   524
result of a user-initiated keystroke, mouse operation, or input method
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   525
editor (IME) input event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   526
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   527
Unlike the `onchange` event, this event fires when the value actually changes
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   528
and not when the element loses focus. This event also reports IME and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   529
multi-stroke input more reliably than `oninput` or the various key events across
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   530
browsers.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   531
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   532
For performance reasons, only focused nodes are monitored for changes, so
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   533
programmatic value changes on nodes that don't have focus won't be detected.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   534
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   535
@example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   536
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   537
    YUI().use('event-valuechange', function (Y) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   538
        Y.one('#my-input').on('valuechange', function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   539
            Y.log('previous value: ' + e.prevVal);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   540
            Y.log('new value: ' + e.newVal);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   541
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   542
    });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   543
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   544
@event valuechange
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   545
@param {String} prevVal Previous value prior to the latest change.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   546
@param {String} newVal New value after the latest change.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   547
@for YUI
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   548
**/
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   549
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   550
config = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   551
    detach: VC._onUnsubscribe,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   552
    on    : VC._onSubscribe,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   553
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   554
    delegate      : VC._onSubscribe,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   555
    detachDelegate: VC._onUnsubscribe,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   556
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   557
    publishConfig: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   558
        emitFacade: true
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   559
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   560
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   561
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   562
Y.Event.define('valuechange', config);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   563
Y.Event.define('valueChange', config); // deprecated, but supported for backcompat
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   564
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   565
Y.ValueChange = VC;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   566
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   567
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   568
}, '@VERSION@', {"requires": ["event-focus", "event-synthetic"]});