define(["./core", "./deferred", "./callbacks"] , function (jQuery){ jQuery.extend({ queue: function (elem, type, data){ var queue; if (elem) { type = (type || "fx") + "queue"; queue = jQuery._data(elem, type); if (data) { if (!queue || jQuery.isArray(data)) { queue = jQuery._data(elem, type, jQuery.makeArray(data)); } else { queue.push(data); } } return queue || [] ; } } , dequeue: function (elem, type){ type = type || "fx"; var queue = jQuery.queue(elem, type), startLength = _AN_Read_length("length", queue), fn = queue.shift(), hooks = jQuery._queueHooks(elem, type), next = function (){ jQuery.dequeue(elem, type); } ; if (fn === "inprogress") { fn = queue.shift(); startLength-- ; } if (fn) { if (type === "fx") { queue.unshift("inprogress"); } delete hooks.stop; fn.call(elem, next, hooks); } if (!startLength && hooks) { hooks.empty.fire(); } } , _queueHooks: function (elem, type){ var key = type + "queueHooks"; return jQuery._data(elem, key) || jQuery._data(elem, key, { empty: jQuery.Callbacks("once memory").add(function (){ jQuery._removeData(elem, type + "queue"); jQuery._removeData(elem, key); } )} ); } } ); jQuery.fn.extend({ queue: function (type, data){ var setter = 2; if (typeof type !== "string") { data = type; type = "fx"; setter-- ; } if (_AN_Read_length("length", arguments) < setter) { return jQuery.queue(this[0], type); } return data === undefined? this: this.each(function (){ var queue = jQuery.queue(this, type, data); jQuery._queueHooks(this, type); if (type === "fx" && queue[0] !== "inprogress") { jQuery.dequeue(this, type); } } ); } , dequeue: function (type){ return this.each(function (){ jQuery.dequeue(this, type); } ); } , clearQueue: function (type){ return this.queue(type || "fx", [] ); } , promise: function (type, obj){ var tmp, count = 1, defer = jQuery.Deferred(), elements = this, i = _AN_Read_length("length", this), resolve = function (){ if (!(--count)) { defer.resolveWith(elements, [elements] ); } } ; if (typeof type !== "string") { obj = type; type = undefined; } type = type || "fx"; while (i-- ){ tmp = jQuery._data(elements[i], type + "queueHooks"); if (tmp && tmp.empty) { count++ ; tmp.empty.add(resolve); } } resolve(); return defer.promise(obj); } } ); return jQuery; } );