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