src/cm/media/js/lib/yui/yui3-3.15.0/build/event-synthetic/event-synthetic-debug.js
author ymh <ymh.work@gmail.com>
Fri, 14 Mar 2014 13:16:10 +0100
changeset 611 fa66f4bb1563
parent 602 e16a97fb364a
permissions -rw-r--r--
add some more custom config and put every thing in comment in the custom.yaml template
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     1
YUI.add('event-synthetic', 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
 * Define new DOM events that can be subscribed to from Nodes.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     5
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     6
 * @module event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     7
 * @submodule event-synthetic
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     8
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
     9
var CustomEvent = Y.CustomEvent,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    10
    DOMMap   = Y.Env.evt.dom_map,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    11
    toArray  = Y.Array,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    12
    YLang    = Y.Lang,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    13
    isObject = YLang.isObject,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    14
    isString = YLang.isString,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    15
    isArray  = YLang.isArray,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    16
    query    = Y.Selector.query,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    17
    noop     = function () {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    18
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    19
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    20
 * <p>The triggering mechanism used by SyntheticEvents.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    21
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    22
 * <p>Implementers should not instantiate these directly.  Use the Notifier
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    23
 * provided to the event's implemented <code>on(node, sub, notifier)</code> or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    24
 * <code>delegate(node, sub, notifier, filter)</code> methods.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    25
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    26
 * @class SyntheticEvent.Notifier
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    27
 * @constructor
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    28
 * @param handle {EventHandle} the detach handle for the subscription to an
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    29
 *              internal custom event used to execute the callback passed to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    30
 *              on(..) or delegate(..)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    31
 * @param emitFacade {Boolean} take steps to ensure the first arg received by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    32
 *              the subscription callback is an event facade
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    33
 * @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    34
 * @since 3.2.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    35
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    36
function Notifier(handle, emitFacade) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    37
    this.handle     = handle;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    38
    this.emitFacade = emitFacade;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    39
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    40
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    41
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    42
 * <p>Executes the subscription callback, passing the firing arguments as the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    43
 * first parameters to that callback. For events that are configured with
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    44
 * emitFacade=true, it is common practice to pass the triggering DOMEventFacade
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    45
 * as the first parameter.  Barring a proper DOMEventFacade or EventFacade
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    46
 * (from a CustomEvent), a new EventFacade will be generated.  In that case, if
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    47
 * fire() is called with a simple object, it will be mixed into the facade.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    48
 * Otherwise, the facade will be prepended to the callback parameters.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    49
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    50
 * <p>For notifiers provided to delegate logic, the first argument should be an
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    51
 * object with a &quot;currentTarget&quot; property to identify what object to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    52
 * default as 'this' in the callback.  Typically this is gleaned from the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    53
 * DOMEventFacade or EventFacade, but if configured with emitFacade=false, an
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    54
 * object must be provided.  In that case, the object will be removed from the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    55
 * callback parameters.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    56
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    57
 * <p>Additional arguments passed during event subscription will be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    58
 * automatically added after those passed to fire().</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    59
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    60
 * @method fire
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    61
 * @param {EventFacade|DOMEventFacade|any} e (see description)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    62
 * @param {any[]} [arg*] additional arguments received by all subscriptions
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    63
 * @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    64
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    65
Notifier.prototype.fire = function (e) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    66
    // first arg to delegate notifier should be an object with currentTarget
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    67
    var args     = toArray(arguments, 0, true),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    68
        handle   = this.handle,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    69
        ce       = handle.evt,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    70
        sub      = handle.sub,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    71
        thisObj  = sub.context,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    72
        delegate = sub.filter,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    73
        event    = e || {},
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    74
        ret;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    75
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    76
    if (this.emitFacade) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    77
        if (!e || !e.preventDefault) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    78
            event = ce._getFacade();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    79
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    80
            if (isObject(e) && !e.preventDefault) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    81
                Y.mix(event, e, true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    82
                args[0] = event;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    83
            } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    84
                args.unshift(event);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    85
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    86
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    87
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    88
        event.type    = ce.type;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    89
        event.details = args.slice();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    90
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    91
        if (delegate) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    92
            event.container = ce.host;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    93
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    94
    } else if (delegate && isObject(e) && e.currentTarget) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    95
        args.shift();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    96
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    97
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    98
    sub.context = thisObj || event.currentTarget || ce.host;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
    99
    ret = ce.fire.apply(ce, args);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   100
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   101
    // have to handle preventedFn and stoppedFn manually because
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   102
    // Notifier CustomEvents are forced to emitFacade=false
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   103
    if (e.prevented && ce.preventedFn) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   104
        ce.preventedFn.apply(ce, args);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   105
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   106
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   107
    if (e.stopped && ce.stoppedFn) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   108
        ce.stoppedFn.apply(ce, args);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   109
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   110
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   111
    sub.context = thisObj; // reset for future firing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   112
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   113
    // to capture callbacks that return false to stopPropagation.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   114
    // Useful for delegate implementations
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   115
    return ret;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   116
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   117
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   118
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   119
 * Manager object for synthetic event subscriptions to aggregate multiple synths on the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   120
 * same node without colliding with actual DOM subscription entries in the global map of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   121
 * DOM subscriptions.  Also facilitates proper cleanup on page unload.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   122
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   123
 * @class SynthRegistry
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   124
 * @constructor
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   125
 * @param el {HTMLElement} the DOM element
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   126
 * @param yuid {String} the yuid stamp for the element
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   127
 * @param key {String} the generated id token used to identify an event type +
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   128
 *                     element in the global DOM subscription map.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   129
 * @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   130
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   131
function SynthRegistry(el, yuid, key) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   132
    this.handles = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   133
    this.el      = el;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   134
    this.key     = key;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   135
    this.domkey  = yuid;
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
SynthRegistry.prototype = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   139
    constructor: SynthRegistry,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   140
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   141
    // A few object properties to fake the CustomEvent interface for page
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   142
    // unload cleanup.  DON'T TOUCH!
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   143
    type      : '_synth',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   144
    fn        : noop,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   145
    capture   : false,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   146
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   147
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   148
     * Adds a subscription from the Notifier registry.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   149
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   150
     * @method register
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   151
     * @param handle {EventHandle} the subscription
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   152
     * @since 3.4.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   153
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   154
    register: function (handle) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   155
        handle.evt.registry = this;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   156
        this.handles.push(handle);
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
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   160
     * Removes the subscription from the Notifier registry.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   161
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   162
     * @method _unregisterSub
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   163
     * @param sub {Subscription} the subscription
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   164
     * @since 3.4.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   165
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   166
    unregister: function (sub) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   167
        var handles = this.handles,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   168
            events = DOMMap[this.domkey],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   169
            i;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   170
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   171
        for (i = handles.length - 1; i >= 0; --i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   172
            if (handles[i].sub === sub) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   173
                handles.splice(i, 1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   174
                break;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   175
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   176
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   177
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   178
        // Clean up left over objects when there are no more subscribers.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   179
        if (!handles.length) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   180
            delete events[this.key];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   181
            if (!Y.Object.size(events)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   182
                delete DOMMap[this.domkey];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   183
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   184
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   185
    },
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
     * Used by the event system's unload cleanup process.  When navigating
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   189
     * away from the page, the event system iterates the global map of element
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   190
     * subscriptions and detaches everything using detachAll().  Normally,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   191
     * the map is populated with custom events, so this object needs to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   192
     * at least support the detachAll method to duck type its way to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   193
     * cleanliness.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   194
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   195
     * @method detachAll
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   196
     * @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   197
     * @since 3.4.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   198
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   199
    detachAll : function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   200
        var handles = this.handles,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   201
            i = handles.length;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   202
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   203
        while (--i >= 0) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   204
            handles[i].detach();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   205
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   206
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   207
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   208
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   209
/**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   210
 * <p>Wrapper class for the integration of new events into the YUI event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   211
 * infrastructure.  Don't instantiate this object directly, use
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   212
 * <code>Y.Event.define(type, config)</code>.  See that method for details.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   213
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   214
 * <p>Properties that MAY or SHOULD be specified in the configuration are noted
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   215
 * below and in the description of <code>Y.Event.define</code>.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   216
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   217
 * @class SyntheticEvent
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   218
 * @constructor
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   219
 * @param cfg {Object} Implementation pieces and configuration
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   220
 * @since 3.1.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   221
 * @in event-synthetic
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   222
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   223
function SyntheticEvent() {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   224
    this._init.apply(this, arguments);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   225
}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   226
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   227
Y.mix(SyntheticEvent, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   228
    Notifier: Notifier,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   229
    SynthRegistry: SynthRegistry,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   230
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   231
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   232
     * Returns the array of subscription handles for a node for the given event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   233
     * type.  Passing true as the third argument will create a registry entry
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   234
     * in the event system's DOM map to host the array if one doesn't yet exist.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   235
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   236
     * @method getRegistry
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   237
     * @param node {Node} the node
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   238
     * @param type {String} the event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   239
     * @param create {Boolean} create a registration entry to host a new array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   240
     *                  if one doesn't exist.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   241
     * @return {Array}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   242
     * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   243
     * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   244
     * @since 3.2.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   245
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   246
    getRegistry: function (node, type, create) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   247
        var el     = node._node,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   248
            yuid   = Y.stamp(el),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   249
            key    = 'event:' + yuid + type + '_synth',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   250
            events = DOMMap[yuid];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   251
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   252
        if (create) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   253
            if (!events) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   254
                events = DOMMap[yuid] = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   255
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   256
            if (!events[key]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   257
                events[key] = new SynthRegistry(el, yuid, key);
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
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   261
        return (events && events[key]) || null;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   262
    },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   263
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   264
    /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   265
     * Alternate <code>_delete()</code> method for the CustomEvent object
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   266
     * created to manage SyntheticEvent subscriptions.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   267
     *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   268
     * @method _deleteSub
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   269
     * @param sub {Subscription} the subscription to clean up
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   270
     * @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   271
     * @since 3.2.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   272
     */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   273
    _deleteSub: function (sub) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   274
        if (sub && sub.fn) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   275
            var synth = this.eventDef,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   276
                method = (sub.filter) ? 'detachDelegate' : 'detach';
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   277
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   278
            this._subscribers = [];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   279
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   280
            if (CustomEvent.keepDeprecatedSubs) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   281
                this.subscribers = {};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   282
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   283
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   284
            synth[method](sub.node, sub, this.notifier, sub.filter);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   285
            this.registry.unregister(sub);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   286
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   287
            delete sub.fn;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   288
            delete sub.node;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   289
            delete sub.context;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   290
        }
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
    prototype: {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   294
        constructor: SyntheticEvent,
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
         * Construction logic for the event.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   298
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   299
         * @method _init
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   300
         * @protected
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   301
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   302
        _init: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   303
            var config = this.publishConfig || (this.publishConfig = {});
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   304
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   305
            // The notification mechanism handles facade creation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   306
            this.emitFacade = ('emitFacade' in config) ?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   307
                                config.emitFacade :
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   308
                                true;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   309
            config.emitFacade  = false;
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
         * <p>Implementers MAY provide this method definition.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   314
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   315
         * <p>Implement this function if the event supports a different
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   316
         * subscription signature.  This function is used by both
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   317
         * <code>on()</code> and <code>delegate()</code>.  The second parameter
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   318
         * indicates that the event is being subscribed via
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   319
         * <code>delegate()</code>.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   320
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   321
         * <p>Implementations must remove extra arguments from the args list
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   322
         * before returning.  The required args for <code>on()</code>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   323
         * subscriptions are</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   324
         * <pre><code>[type, callback, target, context, argN...]</code></pre>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   325
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   326
         * <p>The required args for <code>delegate()</code>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   327
         * subscriptions are</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   328
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   329
         * <pre><code>[type, callback, target, filter, context, argN...]</code></pre>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   330
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   331
         * <p>The return value from this function will be stored on the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   332
         * subscription in the '_extra' property for reference elsewhere.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   333
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   334
         * @method processArgs
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   335
         * @param args {Array} parmeters passed to Y.on(..) or Y.delegate(..)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   336
         * @param delegate {Boolean} true if the subscription is from Y.delegate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   337
         * @return {any}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   338
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   339
        processArgs: noop,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   340
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   341
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   342
         * <p>Implementers MAY override this property.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   343
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   344
         * <p>Whether to prevent multiple subscriptions to this event that are
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   345
         * classified as being the same.  By default, this means the subscribed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   346
         * callback is the same function.  See the <code>subMatch</code>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   347
         * method.  Setting this to true will impact performance for high volume
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   348
         * events.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   349
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   350
         * @property preventDups
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   351
         * @type {Boolean}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   352
         * @default false
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   353
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   354
        //preventDups  : false,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   355
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   356
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   357
         * <p>Implementers SHOULD provide this method definition.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   358
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   359
         * Implementation logic for subscriptions done via <code>node.on(type,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   360
         * fn)</code> or <code>Y.on(type, fn, target)</code>.  This
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   361
         * function should set up the monitor(s) that will eventually fire the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   362
         * event.  Typically this involves subscribing to at least one DOM
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   363
         * event.  It is recommended to store detach handles from any DOM
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   364
         * subscriptions to make for easy cleanup in the <code>detach</code>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   365
         * method.  Typically these handles are added to the <code>sub</code>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   366
         * object.  Also for SyntheticEvents that leverage a single DOM
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   367
         * subscription under the hood, it is recommended to pass the DOM event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   368
         * object to <code>notifier.fire(e)</code>.  (The event name on the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   369
         * object will be updated).
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   370
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   371
         * @method on
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   372
         * @param node {Node} the node the subscription is being applied to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   373
         * @param sub {Subscription} the object to track this subscription
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   374
         * @param notifier {SyntheticEvent.Notifier} call notifier.fire(..) to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   375
         *              trigger the execution of the subscribers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   376
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   377
        on: noop,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   378
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   379
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   380
         * <p>Implementers SHOULD provide this method definition.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   381
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   382
         * <p>Implementation logic for detaching subscriptions done via
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   383
         * <code>node.on(type, fn)</code>.  This function should clean up any
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   384
         * subscriptions made in the <code>on()</code> phase.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   385
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   386
         * @method detach
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   387
         * @param node {Node} the node the subscription was applied to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   388
         * @param sub {Subscription} the object tracking this subscription
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   389
         * @param notifier {SyntheticEvent.Notifier} the Notifier used to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   390
         *              trigger the execution of the subscribers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   391
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   392
        detach: noop,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   393
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   394
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   395
         * <p>Implementers SHOULD provide this method definition.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   396
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   397
         * <p>Implementation logic for subscriptions done via
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   398
         * <code>node.delegate(type, fn, filter)</code> or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   399
         * <code>Y.delegate(type, fn, container, filter)</code>.  Like with
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   400
         * <code>on()</code> above, this function should monitor the environment
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   401
         * for the event being fired, and trigger subscription execution by
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   402
         * calling <code>notifier.fire(e)</code>.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   403
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   404
         * <p>This function receives a fourth argument, which is the filter
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   405
         * used to identify which Node's are of interest to the subscription.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   406
         * The filter will be either a boolean function that accepts a target
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   407
         * Node for each hierarchy level as the event bubbles, or a selector
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   408
         * string.  To translate selector strings into filter functions, use
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   409
         * <code>Y.delegate.compileFilter(filter)</code>.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   410
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   411
         * @method delegate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   412
         * @param node {Node} the node the subscription is being applied to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   413
         * @param sub {Subscription} the object to track this subscription
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   414
         * @param notifier {SyntheticEvent.Notifier} call notifier.fire(..) to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   415
         *              trigger the execution of the subscribers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   416
         * @param filter {String|Function} Selector string or function that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   417
         *              accepts an event object and returns null, a Node, or an
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   418
         *              array of Nodes matching the criteria for processing.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   419
         * @since 3.2.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   420
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   421
        delegate       : noop,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   422
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   423
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   424
         * <p>Implementers SHOULD provide this method definition.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   425
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   426
         * <p>Implementation logic for detaching subscriptions done via
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   427
         * <code>node.delegate(type, fn, filter)</code> or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   428
         * <code>Y.delegate(type, fn, container, filter)</code>.  This function
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   429
         * should clean up any subscriptions made in the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   430
         * <code>delegate()</code> phase.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   431
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   432
         * @method detachDelegate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   433
         * @param node {Node} the node the subscription was applied to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   434
         * @param sub {Subscription} the object tracking this subscription
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   435
         * @param notifier {SyntheticEvent.Notifier} the Notifier used to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   436
         *              trigger the execution of the subscribers
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   437
         * @param filter {String|Function} Selector string or function that
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   438
         *              accepts an event object and returns null, a Node, or an
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   439
         *              array of Nodes matching the criteria for processing.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   440
         * @since 3.2.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   441
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   442
        detachDelegate : noop,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   443
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   444
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   445
         * Sets up the boilerplate for detaching the event and facilitating the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   446
         * execution of subscriber callbacks.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   447
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   448
         * @method _on
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   449
         * @param args {Array} array of arguments passed to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   450
         *              <code>Y.on(...)</code> or <code>Y.delegate(...)</code>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   451
         * @param delegate {Boolean} true if called from
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   452
         * <code>Y.delegate(...)</code>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   453
         * @return {EventHandle} the detach handle for this subscription
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   454
         * @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   455
         * since 3.2.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   456
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   457
        _on: function (args, delegate) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   458
            var handles  = [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   459
                originalArgs = args.slice(),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   460
                extra    = this.processArgs(args, delegate),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   461
                selector = args[2],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   462
                method   = delegate ? 'delegate' : 'on',
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   463
                nodes, handle;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   464
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   465
            // Can't just use Y.all because it doesn't support window (yet?)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   466
            nodes = (isString(selector)) ?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   467
                query(selector) :
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   468
                toArray(selector || Y.one(Y.config.win));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   469
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   470
            if (!nodes.length && isString(selector)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   471
                handle = Y.on('available', function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   472
                    Y.mix(handle, Y[method].apply(Y, originalArgs), true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   473
                }, selector);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   474
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   475
                return handle;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   476
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   477
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   478
            Y.Array.each(nodes, function (node) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   479
                var subArgs = args.slice(),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   480
                    filter;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   481
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   482
                node = Y.one(node);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   483
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   484
                if (node) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   485
                    if (delegate) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   486
                        filter = subArgs.splice(3, 1)[0];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   487
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   488
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   489
                    // (type, fn, el, thisObj, ...) => (fn, thisObj, ...)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   490
                    subArgs.splice(0, 4, subArgs[1], subArgs[3]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   491
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   492
                    if (!this.preventDups ||
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   493
                        !this.getSubs(node, args, null, true))
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   494
                    {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   495
                        handles.push(this._subscribe(node, method, subArgs, extra, filter));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   496
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   497
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   498
            }, this);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   499
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   500
            return (handles.length === 1) ?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   501
                handles[0] :
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   502
                new Y.EventHandle(handles);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   503
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   504
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   505
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   506
         * Creates a new Notifier object for use by this event's
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   507
         * <code>on(...)</code> or <code>delegate(...)</code> implementation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   508
         * and register the custom event proxy in the DOM system for cleanup.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   509
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   510
         * @method _subscribe
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   511
         * @param node {Node} the Node hosting the event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   512
         * @param method {String} "on" or "delegate"
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   513
         * @param args {Array} the subscription arguments passed to either
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   514
         *              <code>Y.on(...)</code> or <code>Y.delegate(...)</code>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   515
         *              after running through <code>processArgs(args)</code> to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   516
         *              normalize the argument signature
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   517
         * @param extra {any} Extra data parsed from
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   518
         *              <code>processArgs(args)</code>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   519
         * @param filter {String|Function} the selector string or function
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   520
         *              filter passed to <code>Y.delegate(...)</code> (not
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   521
         *              present when called from <code>Y.on(...)</code>)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   522
         * @return {EventHandle}
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   523
         * @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   524
         * @since 3.2.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   525
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   526
        _subscribe: function (node, method, args, extra, filter) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   527
            var dispatcher = new Y.CustomEvent(this.type, this.publishConfig),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   528
                handle     = dispatcher.on.apply(dispatcher, args),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   529
                notifier   = new Notifier(handle, this.emitFacade),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   530
                registry   = SyntheticEvent.getRegistry(node, this.type, true),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   531
                sub        = handle.sub;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   532
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   533
            sub.node   = node;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   534
            sub.filter = filter;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   535
            if (extra) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   536
                this.applyArgExtras(extra, sub);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   537
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   538
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   539
            Y.mix(dispatcher, {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   540
                eventDef     : this,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   541
                notifier     : notifier,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   542
                host         : node,       // I forget what this is for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   543
                currentTarget: node,       // for generating facades
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   544
                target       : node,       // for generating facades
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   545
                el           : node._node, // For category detach
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   546
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   547
                _delete      : SyntheticEvent._deleteSub
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   548
            }, true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   549
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   550
            handle.notifier = notifier;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   551
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   552
            registry.register(handle);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   553
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   554
            // Call the implementation's "on" or "delegate" method
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   555
            this[method](node, sub, notifier, filter);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   556
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   557
            return handle;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   558
        },
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
         * <p>Implementers MAY provide this method definition.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   562
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   563
         * <p>Implement this function if you want extra data extracted during
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   564
         * processArgs to be propagated to subscriptions on a per-node basis.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   565
         * That is to say, if you call <code>Y.on('xyz', fn, xtra, 'div')</code>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   566
         * the data returned from processArgs will be shared
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   567
         * across the subscription objects for all the divs.  If you want each
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   568
         * subscription to receive unique information, do that processing
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   569
         * here.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   570
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   571
         * <p>The default implementation adds the data extracted by processArgs
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   572
         * to the subscription object as <code>sub._extra</code>.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   573
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   574
         * @method applyArgExtras
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   575
         * @param extra {any} Any extra data extracted from processArgs
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   576
         * @param sub {Subscription} the individual subscription
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   577
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   578
        applyArgExtras: function (extra, sub) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   579
            sub._extra = extra;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   580
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   581
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   582
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   583
         * Removes the subscription(s) from the internal subscription dispatch
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   584
         * mechanism.  See <code>SyntheticEvent._deleteSub</code>.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   585
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   586
         * @method _detach
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   587
         * @param args {Array} The arguments passed to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   588
         *                  <code>node.detach(...)</code>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   589
         * @private
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   590
         * @since 3.2.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   591
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   592
        _detach: function (args) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   593
            // Can't use Y.all because it doesn't support window (yet?)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   594
            // TODO: Does Y.all support window now?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   595
            var target = args[2],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   596
                els    = (isString(target)) ?
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   597
                            query(target) : toArray(target),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   598
                node, i, len, handles, j;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   599
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   600
            // (type, fn, el, context, filter?) => (type, fn, context, filter?)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   601
            args.splice(2, 1);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   602
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   603
            for (i = 0, len = els.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   604
                node = Y.one(els[i]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   605
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   606
                if (node) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   607
                    handles = this.getSubs(node, args);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   608
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   609
                    if (handles) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   610
                        for (j = handles.length - 1; j >= 0; --j) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   611
                            handles[j].detach();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   612
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   613
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   614
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   615
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   616
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   617
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   618
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   619
         * Returns the detach handles of subscriptions on a node that satisfy a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   620
         * search/filter function.  By default, the filter used is the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   621
         * <code>subMatch</code> method.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   622
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   623
         * @method getSubs
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   624
         * @param node {Node} the node hosting the event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   625
         * @param args {Array} the array of original subscription args passed
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   626
         *              to <code>Y.on(...)</code> (before
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   627
         *              <code>processArgs</code>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   628
         * @param filter {Function} function used to identify a subscription
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   629
         *              for inclusion in the returned array
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   630
         * @param first {Boolean} stop after the first match (used to check for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   631
         *              duplicate subscriptions)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   632
         * @return {EventHandle[]} detach handles for the matching subscriptions
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   633
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   634
        getSubs: function (node, args, filter, first) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   635
            var registry = SyntheticEvent.getRegistry(node, this.type),
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   636
                handles  = [],
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   637
                allHandles, i, len, handle;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   638
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   639
            if (registry) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   640
                allHandles = registry.handles;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   641
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   642
                if (!filter) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   643
                    filter = this.subMatch;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   644
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   645
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   646
                for (i = 0, len = allHandles.length; i < len; ++i) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   647
                    handle = allHandles[i];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   648
                    if (filter.call(this, handle.sub, args)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   649
                        if (first) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   650
                            return handle;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   651
                        } else {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   652
                            handles.push(allHandles[i]);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   653
                        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   654
                    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   655
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   656
            }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   657
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   658
            return handles.length && handles;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   659
        },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   660
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   661
        /**
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   662
         * <p>Implementers MAY override this to define what constitutes a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   663
         * &quot;same&quot; subscription.  Override implementations should
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   664
         * consider the lack of a comparator as a match, so calling
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   665
         * <code>getSubs()</code> with no arguments will return all subs.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   666
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   667
         * <p>Compares a set of subscription arguments against a Subscription
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   668
         * object to determine if they match.  The default implementation
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   669
         * compares the callback function against the second argument passed to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   670
         * <code>Y.on(...)</code> or <code>node.detach(...)</code> etc.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   671
         *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   672
         * @method subMatch
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   673
         * @param sub {Subscription} the existing subscription
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   674
         * @param args {Array} the calling arguments passed to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   675
         *                  <code>Y.on(...)</code> etc.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   676
         * @return {Boolean} true if the sub can be described by the args
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   677
         *                  present
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   678
         * @since 3.2.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   679
         */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   680
        subMatch: function (sub, args) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   681
            // Default detach cares only about the callback matching
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   682
            return !args[1] || sub.fn === args[1];
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   683
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   684
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   685
}, true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   686
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   687
Y.SyntheticEvent = SyntheticEvent;
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
 * <p>Defines a new event in the DOM event system.  Implementers are
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   691
 * responsible for monitoring for a scenario whereby the event is fired.  A
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   692
 * notifier object is provided to the functions identified below.  When the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   693
 * criteria defining the event are met, call notifier.fire( [args] ); to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   694
 * execute event subscribers.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   695
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   696
 * <p>The first parameter is the name of the event.  The second parameter is a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   697
 * configuration object which define the behavior of the event system when the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   698
 * new event is subscribed to or detached from.  The methods that should be
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   699
 * defined in this configuration object are <code>on</code>,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   700
 * <code>detach</code>, <code>delegate</code>, and <code>detachDelegate</code>.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   701
 * You are free to define any other methods or properties needed to define your
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   702
 * event.  Be aware, however, that since the object is used to subclass
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   703
 * SyntheticEvent, you should avoid method names used by SyntheticEvent unless
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   704
 * your intention is to override the default behavior.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   705
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   706
 * <p>This is a list of properties and methods that you can or should specify
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   707
 * in the configuration object:</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   708
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   709
 * <dl>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   710
 *   <dt><code>on</code></dt>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   711
 *       <dd><code>function (node, subscription, notifier)</code> The
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   712
 *       implementation logic for subscription.  Any special setup you need to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   713
 *       do to create the environment for the event being fired--E.g. native
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   714
 *       DOM event subscriptions.  Store subscription related objects and
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   715
 *       state on the <code>subscription</code> object.  When the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   716
 *       criteria have been met to fire the synthetic event, call
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   717
 *       <code>notifier.fire(e)</code>.  See Notifier's <code>fire()</code>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   718
 *       method for details about what to pass as parameters.</dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   719
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   720
 *   <dt><code>detach</code></dt>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   721
 *       <dd><code>function (node, subscription, notifier)</code> The
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   722
 *       implementation logic for cleaning up a detached subscription. E.g.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   723
 *       detach any DOM subscriptions added in <code>on</code>.</dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   724
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   725
 *   <dt><code>delegate</code></dt>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   726
 *       <dd><code>function (node, subscription, notifier, filter)</code> The
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   727
 *       implementation logic for subscription via <code>Y.delegate</code> or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   728
 *       <code>node.delegate</code>.  The filter is typically either a selector
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   729
 *       string or a function.  You can use
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   730
 *       <code>Y.delegate.compileFilter(selectorString)</code> to create a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   731
 *       filter function from a selector string if needed.  The filter function
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   732
 *       expects an event object as input and should output either null, a
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   733
 *       matching Node, or an array of matching Nodes.  Otherwise, this acts
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   734
 *       like <code>on</code> DOM event subscriptions.  Store subscription
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   735
 *       related objects and information on the <code>subscription</code>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   736
 *       object.  When the criteria have been met to fire the synthetic event,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   737
 *       call <code>notifier.fire(e)</code> as noted above.</dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   738
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   739
 *   <dt><code>detachDelegate</code></dt>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   740
 *       <dd><code>function (node, subscription, notifier)</code> The
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   741
 *       implementation logic for cleaning up a detached delegate subscription.
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   742
 *       E.g. detach any DOM delegate subscriptions added in
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   743
 *       <code>delegate</code>.</dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   744
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   745
 *   <dt><code>publishConfig</code></dt>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   746
 *       <dd>(Object) The configuration object that will be used to instantiate
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   747
 *       the underlying CustomEvent. See Notifier's <code>fire</code> method
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   748
 *       for details.</dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   749
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   750
 *   <dt><code>processArgs</code></dt
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   751
 *       <dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   752
 *          <p><code>function (argArray, fromDelegate)</code> Optional method
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   753
 *          to extract any additional arguments from the subscription
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   754
 *          signature.  Using this allows <code>on</code> or
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   755
 *          <code>delegate</code> signatures like
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   756
 *          <code>node.on(&quot;hover&quot;, overCallback,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   757
 *          outCallback)</code>.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   758
 *          <p>When processing an atypical argument signature, make sure the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   759
 *          args array is returned to the normal signature before returning
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   760
 *          from the function.  For example, in the &quot;hover&quot; example
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   761
 *          above, the <code>outCallback</code> needs to be <code>splice</code>d
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   762
 *          out of the array.  The expected signature of the args array for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   763
 *          <code>on()</code> subscriptions is:</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   764
 *          <pre>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   765
 *              <code>[type, callback, target, contextOverride, argN...]</code>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   766
 *          </pre>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   767
 *          <p>And for <code>delegate()</code>:</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   768
 *          <pre>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   769
 *              <code>[type, callback, target, filter, contextOverride, argN...]</code>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   770
 *          </pre>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   771
 *          <p>where <code>target</code> is the node the event is being
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   772
 *          subscribed for.  You can see these signatures documented for
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   773
 *          <code>Y.on()</code> and <code>Y.delegate()</code> respectively.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   774
 *          <p>Whatever gets returned from the function will be stored on the
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   775
 *          <code>subscription</code> object under
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   776
 *          <code>subscription._extra</code>.</p></dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   777
 *   <dt><code>subMatch</code></dt>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   778
 *       <dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   779
 *           <p><code>function (sub, args)</code>  Compares a set of
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   780
 *           subscription arguments against a Subscription object to determine
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   781
 *           if they match.  The default implementation compares the callback
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   782
 *           function against the second argument passed to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   783
 *           <code>Y.on(...)</code> or <code>node.detach(...)</code> etc.</p>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   784
 *       </dd>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   785
 * </dl>
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   786
 *
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   787
 * @method define
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   788
 * @param type {String} the name of the event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   789
 * @param config {Object} the prototype definition for the new event (see above)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   790
 * @param force {Boolean} override an existing event (use with caution)
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   791
 * @return {SyntheticEvent} the subclass implementation instance created to
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   792
 *              handle event subscriptions of this type
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   793
 * @static
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   794
 * @for Event
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   795
 * @since 3.1.0
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   796
 * @in event-synthetic
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   797
 */
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   798
Y.Event.define = function (type, config, force) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   799
    var eventDef, Impl, synth;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   800
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   801
    if (type && type.type) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   802
        eventDef = type;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   803
        force = config;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   804
    } else if (config) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   805
        eventDef = Y.merge({ type: type }, config);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   806
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   807
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   808
    if (eventDef) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   809
        if (force || !Y.Node.DOM_EVENTS[eventDef.type]) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   810
            Impl = function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   811
                SyntheticEvent.apply(this, arguments);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   812
            };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   813
            Y.extend(Impl, SyntheticEvent, eventDef);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   814
            synth = new Impl();
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   815
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   816
            type = synth.type;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   817
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   818
            Y.Node.DOM_EVENTS[type] = Y.Env.evt.plugins[type] = {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   819
                eventDef: synth,
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   820
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   821
                on: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   822
                    return synth._on(toArray(arguments));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   823
                },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   824
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   825
                delegate: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   826
                    return synth._on(toArray(arguments), true);
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   827
                },
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   828
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   829
                detach: function () {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   830
                    return synth._detach(toArray(arguments));
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   831
                }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   832
            };
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   833
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   834
        }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   835
    } else if (isString(type) || isArray(type)) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   836
        Y.Array.each(toArray(type), function (t) {
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   837
            Y.Node.DOM_EVENTS[t] = 1;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   838
        });
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   839
    }
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   840
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   841
    return synth;
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   842
};
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   843
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   844
e16a97fb364a Use YUI 3.15
gibus
parents:
diff changeset
   845
}, '@VERSION@', {"requires": ["node-base", "event-custom-complex"]});