event-custom-complex-debug.js revision d6c79e40fdf7212ce31b58d0b4805875e3242778
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTrippYUI.add('event-custom-complex', function(Y) {
0fdefaa9ca017edfb76b736c825b34186f33045aTripp
0fdefaa9ca017edfb76b736c825b34186f33045aTripp
0fdefaa9ca017edfb76b736c825b34186f33045aTripp/**
0fdefaa9ca017edfb76b736c825b34186f33045aTripp * Adds event facades, preventable default behavior, and bubbling.
0fdefaa9ca017edfb76b736c825b34186f33045aTripp * events.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @module event-custom
a75ebc38c1de401b679953a9b87bd323f0f48d02Tripp * @submodule event-custom-complex
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTrippvar FACADE,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp FACADE_KEYS,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp EMPTY = {},
a89ad754cce3cfc8aee71760e10217b54020360dTripp CEProto = Y.CustomEvent.prototype,
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp ETProto = Y.EventTarget.prototype;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
a89ad754cce3cfc8aee71760e10217b54020360dTripp/**
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Wraps and protects a custom event for use when emitFacade is set to true.
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Requires the event-custom-complex module
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @class EventFacade
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @param e {Event} the custom event
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @param currentTarget {HTMLElement} the element the listener was attached to
c093c1aed867e18aa4778708592e1ceb45d18cffTripp */
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp
66ca16dd76367c074fe4df1dcf7b555489a9bf85TrippY.EventFacade = function(e, currentTarget) {
a89ad754cce3cfc8aee71760e10217b54020360dTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp e = e || EMPTY;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._event = e;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c093c1aed867e18aa4778708592e1ceb45d18cffTripp /**
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * The arguments passed to fire
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * @property details
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * @type Array
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp */
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this.details = e.details;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp /**
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * The event type, this can be overridden by the fire() payload
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * @property type
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * @type string
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp */
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this.type = e.type;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp /**
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * The real event type
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * @property type
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * @type string
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp */
a89ad754cce3cfc8aee71760e10217b54020360dTripp this._type = e.type;
a89ad754cce3cfc8aee71760e10217b54020360dTripp
a89ad754cce3cfc8aee71760e10217b54020360dTripp //////////////////////////////////////////////////////
a89ad754cce3cfc8aee71760e10217b54020360dTripp
c093c1aed867e18aa4778708592e1ceb45d18cffTripp /**
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Node reference for the targeted eventtarget
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @propery target
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @type Node
a89ad754cce3cfc8aee71760e10217b54020360dTripp */
a89ad754cce3cfc8aee71760e10217b54020360dTripp this.target = e.target;
a89ad754cce3cfc8aee71760e10217b54020360dTripp
a89ad754cce3cfc8aee71760e10217b54020360dTripp /**
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Node reference for the element that the listener was attached to.
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @propery currentTarget
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @type Node
a89ad754cce3cfc8aee71760e10217b54020360dTripp */
a89ad754cce3cfc8aee71760e10217b54020360dTripp this.currentTarget = currentTarget;
a89ad754cce3cfc8aee71760e10217b54020360dTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp /**
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Node reference to the relatedTarget
c093c1aed867e18aa4778708592e1ceb45d18cffTripp * @propery relatedTarget
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @type Node
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp */
a89ad754cce3cfc8aee71760e10217b54020360dTripp this.relatedTarget = e.relatedTarget;
7947db4b7d8682ea81598e3a4283e659a8103be6Tripp
a89ad754cce3cfc8aee71760e10217b54020360dTripp};
a89ad754cce3cfc8aee71760e10217b54020360dTripp
a89ad754cce3cfc8aee71760e10217b54020360dTrippY.extend(Y.EventFacade, Object, {
a89ad754cce3cfc8aee71760e10217b54020360dTripp
7947db4b7d8682ea81598e3a4283e659a8103be6Tripp /**
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Stops the propagation to the next bubble target
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @method stopPropagation
a89ad754cce3cfc8aee71760e10217b54020360dTripp */
a89ad754cce3cfc8aee71760e10217b54020360dTripp stopPropagation: function() {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._event.stopPropagation();
a89ad754cce3cfc8aee71760e10217b54020360dTripp this.stopped = 1;
c093c1aed867e18aa4778708592e1ceb45d18cffTripp },
a89ad754cce3cfc8aee71760e10217b54020360dTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp /**
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Stops the propagation to the next bubble target and
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * prevents any additional listeners from being exectued
a89ad754cce3cfc8aee71760e10217b54020360dTripp * on the current target.
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @method stopImmediatePropagation
a89ad754cce3cfc8aee71760e10217b54020360dTripp */
a89ad754cce3cfc8aee71760e10217b54020360dTripp stopImmediatePropagation: function() {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._event.stopImmediatePropagation();
a89ad754cce3cfc8aee71760e10217b54020360dTripp this.stopped = 2;
a89ad754cce3cfc8aee71760e10217b54020360dTripp },
a89ad754cce3cfc8aee71760e10217b54020360dTripp
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp /**
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * Prevents the event's default behavior
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @method preventDefault
c093c1aed867e18aa4778708592e1ceb45d18cffTripp */
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp preventDefault: function() {
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp this._event.preventDefault();
a89ad754cce3cfc8aee71760e10217b54020360dTripp this.prevented = 1;
a89ad754cce3cfc8aee71760e10217b54020360dTripp },
a89ad754cce3cfc8aee71760e10217b54020360dTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp /**
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Stops the event propagation and prevents the default
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * event behavior.
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @method halt
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @param immediate {boolean} if true additional listeners
a89ad754cce3cfc8aee71760e10217b54020360dTripp * on the current target will not be executed
a89ad754cce3cfc8aee71760e10217b54020360dTripp */
a89ad754cce3cfc8aee71760e10217b54020360dTripp halt: function(immediate) {
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp this._event.halt(immediate);
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp this.prevented = 1;
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp this.stopped = (immediate) ? 2 : 1;
c093c1aed867e18aa4778708592e1ceb45d18cffTripp }
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp});
a89ad754cce3cfc8aee71760e10217b54020360dTripp
a89ad754cce3cfc8aee71760e10217b54020360dTrippCEProto.fireComplex = function(args) {
a89ad754cce3cfc8aee71760e10217b54020360dTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp var es, ef, q, queue, ce, ret, events, subs, postponed,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp self = this, host = self.host || self, next, oldbubble;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp if (self.stack) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // queue this event if the current item in the queue bubbles
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp if (self.queuable && self.type != self.stack.next.type) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp self.log('queue ' + self.type);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp self.stack.queue.push([self, args]);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp return true;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp }
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp }
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c093c1aed867e18aa4778708592e1ceb45d18cffTripp es = self.stack || {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // id of the first event in the stack
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp id: self.id,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp next: self,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp silent: self.silent,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp stopped: 0,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp prevented: 0,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp bubbling: null,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp type: self.type,
bf801d6851ecf7ed14742ef3639a077daecb5cf8Tripp // defaultFnQueue: new Y.Queue(),
a4d2446149b07f9e5c32947091dcbcf4d2eee765Tripp afterQueue: new Y.Queue(),
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp defaultTargetOnly: self.defaultTargetOnly,
c093c1aed867e18aa4778708592e1ceb45d18cffTripp queue: []
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp };
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp subs = self.getSubs();
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp self.stopped = (self.type !== es.type) ? 0 : es.stopped;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp self.prevented = (self.type !== es.type) ? 0 : es.prevented;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp self.target = self.target || host;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp events = new Y.EventTarget({
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp fireOnce: true,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp context: host
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp });
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp self.events = events;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp if (self.preventedFn) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp events.on('prevented', self.preventedFn);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp }
c093c1aed867e18aa4778708592e1ceb45d18cffTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp if (self.stoppedFn) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp events.on('stopped', self.stoppedFn);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp }
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp self.currentTarget = host;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp self.details = args.slice(); // original arguments in the details
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // self.log("Firing " + self + ", " + "args: " + args);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp self.log("Firing " + self.type);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp self._facade = null; // kill facade to eliminate stale properties
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp ef = self._getFacade(args);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp if (Y.Lang.isObject(args[0])) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp args[0] = ef;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp } else {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp args.unshift(ef);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp }
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // if (subCount) {
c093c1aed867e18aa4778708592e1ceb45d18cffTripp if (subs[0]) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // self._procSubs(Y.merge(self.subscribers), args, ef);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp self._procSubs(subs[0], args, ef);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp }
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // bubble if this is hosted in an event target and propagation has not been stopped
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp if (self.bubbles && host.bubble && !self.stopped) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp oldbubble = es.bubbling;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // self.bubbling = true;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp es.bubbling = self.type;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
a89ad754cce3cfc8aee71760e10217b54020360dTripp // if (host !== ef.target || es.type != self.type) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp if (es.type != self.type) {
a89ad754cce3cfc8aee71760e10217b54020360dTripp es.stopped = 0;
a89ad754cce3cfc8aee71760e10217b54020360dTripp es.prevented = 0;
a89ad754cce3cfc8aee71760e10217b54020360dTripp }
7947db4b7d8682ea81598e3a4283e659a8103be6Tripp
7947db4b7d8682ea81598e3a4283e659a8103be6Tripp ret = host.bubble(self, args, null, es);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp self.stopped = Math.max(self.stopped, es.stopped);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp self.prevented = Math.max(self.prevented, es.prevented);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c093c1aed867e18aa4778708592e1ceb45d18cffTripp // self.bubbling = false;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp es.bubbling = oldbubble;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp }
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp if (self.defaultFn &&
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp !self.prevented &&
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp ((!self.defaultTargetOnly && !es.defaultTargetOnly) || host === ef.target)) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp self.defaultFn.apply(host, args);
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp }
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp
c093c1aed867e18aa4778708592e1ceb45d18cffTripp // broadcast listeners are fired as discreet events on the
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp // YUI instance and potentially the YUI global.
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp self._broadcast(args);
7947db4b7d8682ea81598e3a4283e659a8103be6Tripp
7947db4b7d8682ea81598e3a4283e659a8103be6Tripp // Queue the after
7947db4b7d8682ea81598e3a4283e659a8103be6Tripp if (subs[1] && !self.prevented && self.stopped < 2) {
7947db4b7d8682ea81598e3a4283e659a8103be6Tripp if (es.id === self.id || self.type != host._yuievt.bubbling) {
7947db4b7d8682ea81598e3a4283e659a8103be6Tripp self._procSubs(subs[1], args, ef);
7947db4b7d8682ea81598e3a4283e659a8103be6Tripp while ((next = es.afterQueue.last())) {
7947db4b7d8682ea81598e3a4283e659a8103be6Tripp next();
7947db4b7d8682ea81598e3a4283e659a8103be6Tripp }
a89ad754cce3cfc8aee71760e10217b54020360dTripp } else {
a89ad754cce3cfc8aee71760e10217b54020360dTripp postponed = subs[1];
a89ad754cce3cfc8aee71760e10217b54020360dTripp if (es.execDefaultCnt) {
a89ad754cce3cfc8aee71760e10217b54020360dTripp postponed = Y.merge(postponed);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp Y.each(postponed, function(s) {
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp s.postponed = true;
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp });
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp }
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp es.afterQueue.add(function() {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp self._procSubs(postponed, args, ef);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp });
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp }
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp }
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp self.target = null;
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp if (es.id === self.id) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp queue = es.queue;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp while (queue.length) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp q = queue.pop();
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp ce = q[0];
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // set up stack to allow the next item to be processed
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp es.next = ce;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp ce.fire.apply(ce, q[1]);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp self.stack = null;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
c790ee5b4dcc7d98b68c124495c76d7d515bdc8dTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp ret = !(self.stopped);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp if (self.type != host._yuievt.bubbling) {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp es.stopped = 0;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp es.prevented = 0;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp self.stopped = 0;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp self.prevented = 0;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp return ret;
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp};
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTrippCEProto._getFacade = function() {
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp var ef = this._facade, o, o2,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp args = this.details;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if (!ef) {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp ef = new Y.EventFacade(this, this.currentTarget);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp // if the first argument is an object literal, apply the
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp // properties to the event facade
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp o = args && args[0];
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
a89ad754cce3cfc8aee71760e10217b54020360dTripp if (Y.Lang.isObject(o, true)) {
a89ad754cce3cfc8aee71760e10217b54020360dTripp
a89ad754cce3cfc8aee71760e10217b54020360dTripp o2 = {};
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
a89ad754cce3cfc8aee71760e10217b54020360dTripp // protect the event facade properties
7947db4b7d8682ea81598e3a4283e659a8103be6Tripp Y.mix(o2, ef, true, FACADE_KEYS);
a89ad754cce3cfc8aee71760e10217b54020360dTripp
a89ad754cce3cfc8aee71760e10217b54020360dTripp // mix the data
a89ad754cce3cfc8aee71760e10217b54020360dTripp Y.mix(ef, o, true);
a89ad754cce3cfc8aee71760e10217b54020360dTripp
a89ad754cce3cfc8aee71760e10217b54020360dTripp // restore ef
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp Y.mix(ef, o2, true, FACADE_KEYS);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
a89ad754cce3cfc8aee71760e10217b54020360dTripp // Allow the event type to be faked
a89ad754cce3cfc8aee71760e10217b54020360dTripp // http://yuilibrary.com/projects/yui3/ticket/2528376
a89ad754cce3cfc8aee71760e10217b54020360dTripp ef.type = o.type || ef.type;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
a89ad754cce3cfc8aee71760e10217b54020360dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp // update the details field with the arguments
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp // ef.type = this.type;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp ef.details = this.details;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp // use the original target when the event bubbled to this target
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp ef.target = this.originalTarget || this.target;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp ef.currentTarget = this.currentTarget;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp ef.stopped = 0;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp ef.prevented = 0;
a89ad754cce3cfc8aee71760e10217b54020360dTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this._facade = ef;
a89ad754cce3cfc8aee71760e10217b54020360dTripp
a89ad754cce3cfc8aee71760e10217b54020360dTripp return this._facade;
a89ad754cce3cfc8aee71760e10217b54020360dTripp};
a89ad754cce3cfc8aee71760e10217b54020360dTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp/**
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * Stop propagation to bubble targets
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * @for CustomEvent
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * @method stopPropagation
a89ad754cce3cfc8aee71760e10217b54020360dTripp */
a89ad754cce3cfc8aee71760e10217b54020360dTrippCEProto.stopPropagation = function() {
a89ad754cce3cfc8aee71760e10217b54020360dTripp this.stopped = 1;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if (this.stack) {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this.stack.stopped = 1;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this.events.fire('stopped', this);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp};
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp/**
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * Stops propagation to bubble targets, and prevents any remaining
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * subscribers on the current target from executing.
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * @method stopImmediatePropagation
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp */
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTrippCEProto.stopImmediatePropagation = function() {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this.stopped = 2;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if (this.stack) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this.stack.stopped = 2;
a89ad754cce3cfc8aee71760e10217b54020360dTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this.events.fire('stopped', this);
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp};
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp/**
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp * Prevents the execution of this event's defaultFn
b57ff76ab2ce5f3017d61855f13ed04ab46a965cTripp * @method preventDefault
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp */
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTrippCEProto.preventDefault = function() {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if (this.preventable) {
b57ff76ab2ce5f3017d61855f13ed04ab46a965cTripp this.prevented = 1;
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp if (this.stack) {
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp this.stack.prevented = 1;
6c4ec9d420df654d019b936fd06bef6f769db4cbTripp }
6c4ec9d420df654d019b936fd06bef6f769db4cbTripp this.events.fire('prevented', this);
b57ff76ab2ce5f3017d61855f13ed04ab46a965cTripp }
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp};
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp/**
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * Stops the event propagation and prevents the default
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * event behavior.
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * @method halt
b57ff76ab2ce5f3017d61855f13ed04ab46a965cTripp * @param immediate {boolean} if true additional listeners
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * on the current target will not be executed
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp */
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTrippCEProto.halt = function(immediate) {
b57ff76ab2ce5f3017d61855f13ed04ab46a965cTripp if (immediate) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this.stopImmediatePropagation();
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp } else {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this.stopPropagation();
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp }
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp this.preventDefault();
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp};
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp/**
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * Registers another EventTarget as a bubble target. Bubble order
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * is determined by the order registered. Multiple targets can
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * be specified.
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp *
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * Events can only bubble if emitFacade is true.
a89ad754cce3cfc8aee71760e10217b54020360dTripp *
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Included in the event-custom-complex submodule.
a89ad754cce3cfc8aee71760e10217b54020360dTripp *
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @method addTarget
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp * @param o {EventTarget} the target to add
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @for EventTarget
a89ad754cce3cfc8aee71760e10217b54020360dTripp */
a89ad754cce3cfc8aee71760e10217b54020360dTrippETProto.addTarget = function(o) {
a89ad754cce3cfc8aee71760e10217b54020360dTripp this._yuievt.targets[Y.stamp(o)] = o;
a89ad754cce3cfc8aee71760e10217b54020360dTripp this._yuievt.hasTargets = true;
a89ad754cce3cfc8aee71760e10217b54020360dTripp};
a89ad754cce3cfc8aee71760e10217b54020360dTripp
a89ad754cce3cfc8aee71760e10217b54020360dTripp/**
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Returns an array of bubble targets for this object.
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @method getTargets
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @return EventTarget[]
a89ad754cce3cfc8aee71760e10217b54020360dTripp */
a89ad754cce3cfc8aee71760e10217b54020360dTrippETProto.getTargets = function() {
a89ad754cce3cfc8aee71760e10217b54020360dTripp return Y.Object.values(this._yuievt.targets);
a89ad754cce3cfc8aee71760e10217b54020360dTripp};
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
a89ad754cce3cfc8aee71760e10217b54020360dTripp/**
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp * Removes a bubble target
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @method removeTarget
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @param o {EventTarget} the target to remove
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @for EventTarget
a89ad754cce3cfc8aee71760e10217b54020360dTripp */
a89ad754cce3cfc8aee71760e10217b54020360dTrippETProto.removeTarget = function(o) {
a89ad754cce3cfc8aee71760e10217b54020360dTripp delete this._yuievt.targets[Y.stamp(o)];
a89ad754cce3cfc8aee71760e10217b54020360dTripp};
a89ad754cce3cfc8aee71760e10217b54020360dTripp
a89ad754cce3cfc8aee71760e10217b54020360dTripp/**
a89ad754cce3cfc8aee71760e10217b54020360dTripp * Propagate an event. Requires the event-custom-complex module.
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @method bubble
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @param evt {CustomEvent} the custom event to propagate
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @return {boolean} the aggregated return value from Event.Custom.fire
a89ad754cce3cfc8aee71760e10217b54020360dTripp * @for EventTarget
a89ad754cce3cfc8aee71760e10217b54020360dTripp */
a89ad754cce3cfc8aee71760e10217b54020360dTrippETProto.bubble = function(evt, args, target, es) {
a89ad754cce3cfc8aee71760e10217b54020360dTripp
a89ad754cce3cfc8aee71760e10217b54020360dTripp var targs = this._yuievt.targets, ret = true,
a89ad754cce3cfc8aee71760e10217b54020360dTripp t, type = evt && evt.type, ce, i, bc, ce2,
a89ad754cce3cfc8aee71760e10217b54020360dTripp originalTarget = target || (evt && evt.target) || this,
a89ad754cce3cfc8aee71760e10217b54020360dTripp oldbubble;
a89ad754cce3cfc8aee71760e10217b54020360dTripp
a89ad754cce3cfc8aee71760e10217b54020360dTripp if (!evt || ((!evt.stopped) && targs)) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // Y.log('Bubbling ' + evt.type);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp for (i in targs) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp if (targs.hasOwnProperty(i)) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp t = targs[i];
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp ce = t.getEvent(type, true);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp ce2 = t.getSibling(type, ce);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp if (ce2 && !ce) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp ce = t.publish(type);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp }
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp oldbubble = t._yuievt.bubbling;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp t._yuievt.bubbling = type;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // if this event was not published on the bubble target,
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // continue propagating the event.
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp if (!ce) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp if (t._yuievt.hasTargets) {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp t.bubble(evt, args, originalTarget, es);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp }
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp } else {
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp ce.sibling = ce2;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // set the original target to that the target payload on the
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // facade is correct.
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp ce.target = originalTarget;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp ce.originalTarget = originalTarget;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp ce.currentTarget = t;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp bc = ce.broadcast;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp ce.broadcast = false;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // default publish may not have emitFacade true -- that
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // shouldn't be what the implementer meant to do
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp ce.emitFacade = true;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp ce.stack = es;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp ret = ret && ce.fire.apply(ce, args || evt.details || []);
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp ce.broadcast = bc;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp ce.originalTarget = null;
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp // stopPropagation() was called
6c4ec9d420df654d019b936fd06bef6f769db4cbTripp if (ce.stopped) {
6c4ec9d420df654d019b936fd06bef6f769db4cbTripp break;
b57ff76ab2ce5f3017d61855f13ed04ab46a965cTripp }
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp }
cec703a844d9691646231634fe709f4ea41d278aTripp
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp t._yuievt.bubbling = oldbubble;
66ca16dd76367c074fe4df1dcf7b555489a9bf85Tripp }
6c4ec9d420df654d019b936fd06bef6f769db4cbTripp }
6c4ec9d420df654d019b936fd06bef6f769db4cbTripp }
6c4ec9d420df654d019b936fd06bef6f769db4cbTripp
6c4ec9d420df654d019b936fd06bef6f769db4cbTripp return ret;
6c4ec9d420df654d019b936fd06bef6f769db4cbTripp};
6c4ec9d420df654d019b936fd06bef6f769db4cbTripp
6c4ec9d420df654d019b936fd06bef6f769db4cbTrippFACADE = new Y.EventFacade();
6c4ec9d420df654d019b936fd06bef6f769db4cbTrippFACADE_KEYS = Y.Object.keys(FACADE);
6c4ec9d420df654d019b936fd06bef6f769db4cbTripp
6c4ec9d420df654d019b936fd06bef6f769db4cbTripp
6c4ec9d420df654d019b936fd06bef6f769db4cbTripp
c7ba96d16d58075a9ab8d5c1e46c6c83ce11cb4eTripp}, '@VERSION@' ,{requires:['event-custom-base']});
09688ec5ffb8b9cf9883a770e2f9ebd60b28888dTripp