|  | define( [ | 
|  | "./core", | 
|  | "./data/var/dataPriv", | 
|  | "./deferred", | 
|  | "./callbacks" | 
|  | ], function( jQuery, dataPriv ) { | 
|  |  | 
|  | "use strict"; | 
|  |  | 
|  | jQuery.extend( { | 
|  | queue: function( elem, type, data ) { | 
|  | var queue; | 
|  |  | 
|  | if ( elem ) { | 
|  | type = ( type || "fx" ) + "queue"; | 
|  | queue = dataPriv.get( elem, type ); | 
|  |  | 
|  | // Speed up dequeue by getting out quickly if this is just a lookup | 
|  | if ( data ) { | 
|  | if ( !queue || Array.isArray( data ) ) { | 
|  | queue = dataPriv.access( 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 = queue.length, | 
|  | fn = queue.shift(), | 
|  | hooks = jQuery._queueHooks( elem, type ), | 
|  | next = function() { | 
|  | jQuery.dequeue( elem, type ); | 
|  | }; | 
|  |  | 
|  | // If the fx queue is dequeued, always remove the progress sentinel | 
|  | if ( fn === "inprogress" ) { | 
|  | fn = queue.shift(); | 
|  | startLength--; | 
|  | } | 
|  |  | 
|  | if ( fn ) { | 
|  |  | 
|  | // Add a progress sentinel to prevent the fx queue from being | 
|  | // automatically dequeued | 
|  | if ( type === "fx" ) { | 
|  | queue.unshift( "inprogress" ); | 
|  | } | 
|  |  | 
|  | // Clear up the last queue stop function | 
|  | delete hooks.stop; | 
|  | fn.call( elem, next, hooks ); | 
|  | } | 
|  |  | 
|  | if ( !startLength && hooks ) { | 
|  | hooks.empty.fire(); | 
|  | } | 
|  | }, | 
|  |  | 
|  | // Not public - generate a queueHooks object, or return the current one | 
|  | _queueHooks: function( elem, type ) { | 
|  | var key = type + "queueHooks"; | 
|  | return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { | 
|  | empty: jQuery.Callbacks( "once memory" ).add( function() { | 
|  | dataPriv.remove( elem, [ type + "queue", key ] ); | 
|  | } ) | 
|  | } ); | 
|  | } | 
|  | } ); | 
|  |  | 
|  | jQuery.fn.extend( { | 
|  | queue: function( type, data ) { | 
|  | var setter = 2; | 
|  |  | 
|  | if ( typeof type !== "string" ) { | 
|  | data = type; | 
|  | type = "fx"; | 
|  | setter--; | 
|  | } | 
|  |  | 
|  | if ( arguments.length < setter ) { | 
|  | return jQuery.queue( this[ 0 ], type ); | 
|  | } | 
|  |  | 
|  | return data === undefined ? | 
|  | this : | 
|  | this.each( function() { | 
|  | var queue = jQuery.queue( this, type, data ); | 
|  |  | 
|  | // Ensure a hooks for this queue | 
|  | 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", [] ); | 
|  | }, | 
|  |  | 
|  | // Get a promise resolved when queues of a certain type | 
|  | // are emptied (fx is the type by default) | 
|  | promise: function( type, obj ) { | 
|  | var tmp, | 
|  | count = 1, | 
|  | defer = jQuery.Deferred(), | 
|  | elements = this, | 
|  | i = this.length, | 
|  | resolve = function() { | 
|  | if ( !( --count ) ) { | 
|  | defer.resolveWith( elements, [ elements ] ); | 
|  | } | 
|  | }; | 
|  |  | 
|  | if ( typeof type !== "string" ) { | 
|  | obj = type; | 
|  | type = undefined; | 
|  | } | 
|  | type = type || "fx"; | 
|  |  | 
|  | while ( i-- ) { | 
|  | tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); | 
|  | if ( tmp && tmp.empty ) { | 
|  | count++; | 
|  | tmp.empty.add( resolve ); | 
|  | } | 
|  | } | 
|  | resolve(); | 
|  | return defer.promise( obj ); | 
|  | } | 
|  | } ); | 
|  |  | 
|  | return jQuery; | 
|  | } ); |