|  | define( [ | 
|  | "./core", | 
|  | "./core/toType", | 
|  | "./var/isFunction", | 
|  | "./var/rnothtmlwhite" | 
|  | ], function( jQuery, toType, isFunction, rnothtmlwhite ) { | 
|  |  | 
|  | "use strict"; | 
|  |  | 
|  | // Convert String-formatted options into Object-formatted ones | 
|  | function createOptions( options ) { | 
|  | var object = {}; | 
|  | jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { | 
|  | object[ flag ] = true; | 
|  | } ); | 
|  | return object; | 
|  | } | 
|  |  | 
|  | /* | 
|  | * Create a callback list using the following parameters: | 
|  | * | 
|  | *	options: an optional list of space-separated options that will change how | 
|  | *			the callback list behaves or a more traditional option object | 
|  | * | 
|  | * By default a callback list will act like an event callback list and can be | 
|  | * "fired" multiple times. | 
|  | * | 
|  | * Possible options: | 
|  | * | 
|  | *	once:			will ensure the callback list can only be fired once (like a Deferred) | 
|  | * | 
|  | *	memory:			will keep track of previous values and will call any callback added | 
|  | *					after the list has been fired right away with the latest "memorized" | 
|  | *					values (like a Deferred) | 
|  | * | 
|  | *	unique:			will ensure a callback can only be added once (no duplicate in the list) | 
|  | * | 
|  | *	stopOnFalse:	interrupt callings when a callback returns false | 
|  | * | 
|  | */ | 
|  | jQuery.Callbacks = function( options ) { | 
|  |  | 
|  | // Convert options from String-formatted to Object-formatted if needed | 
|  | // (we check in cache first) | 
|  | options = typeof options === "string" ? | 
|  | createOptions( options ) : | 
|  | jQuery.extend( {}, options ); | 
|  |  | 
|  | var // Flag to know if list is currently firing | 
|  | firing, | 
|  |  | 
|  | // Last fire value for non-forgettable lists | 
|  | memory, | 
|  |  | 
|  | // Flag to know if list was already fired | 
|  | fired, | 
|  |  | 
|  | // Flag to prevent firing | 
|  | locked, | 
|  |  | 
|  | // Actual callback list | 
|  | list = [], | 
|  |  | 
|  | // Queue of execution data for repeatable lists | 
|  | queue = [], | 
|  |  | 
|  | // Index of currently firing callback (modified by add/remove as needed) | 
|  | firingIndex = -1, | 
|  |  | 
|  | // Fire callbacks | 
|  | fire = function() { | 
|  |  | 
|  | // Enforce single-firing | 
|  | locked = locked || options.once; | 
|  |  | 
|  | // Execute callbacks for all pending executions, | 
|  | // respecting firingIndex overrides and runtime changes | 
|  | fired = firing = true; | 
|  | for ( ; queue.length; firingIndex = -1 ) { | 
|  | memory = queue.shift(); | 
|  | while ( ++firingIndex < list.length ) { | 
|  |  | 
|  | // Run callback and check for early termination | 
|  | if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && | 
|  | options.stopOnFalse ) { | 
|  |  | 
|  | // Jump to end and forget the data so .add doesn't re-fire | 
|  | firingIndex = list.length; | 
|  | memory = false; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | // Forget the data if we're done with it | 
|  | if ( !options.memory ) { | 
|  | memory = false; | 
|  | } | 
|  |  | 
|  | firing = false; | 
|  |  | 
|  | // Clean up if we're done firing for good | 
|  | if ( locked ) { | 
|  |  | 
|  | // Keep an empty list if we have data for future add calls | 
|  | if ( memory ) { | 
|  | list = []; | 
|  |  | 
|  | // Otherwise, this object is spent | 
|  | } else { | 
|  | list = ""; | 
|  | } | 
|  | } | 
|  | }, | 
|  |  | 
|  | // Actual Callbacks object | 
|  | self = { | 
|  |  | 
|  | // Add a callback or a collection of callbacks to the list | 
|  | add: function() { | 
|  | if ( list ) { | 
|  |  | 
|  | // If we have memory from a past run, we should fire after adding | 
|  | if ( memory && !firing ) { | 
|  | firingIndex = list.length - 1; | 
|  | queue.push( memory ); | 
|  | } | 
|  |  | 
|  | ( function add( args ) { | 
|  | jQuery.each( args, function( _, arg ) { | 
|  | if ( isFunction( arg ) ) { | 
|  | if ( !options.unique || !self.has( arg ) ) { | 
|  | list.push( arg ); | 
|  | } | 
|  | } else if ( arg && arg.length && toType( arg ) !== "string" ) { | 
|  |  | 
|  | // Inspect recursively | 
|  | add( arg ); | 
|  | } | 
|  | } ); | 
|  | } )( arguments ); | 
|  |  | 
|  | if ( memory && !firing ) { | 
|  | fire(); | 
|  | } | 
|  | } | 
|  | return this; | 
|  | }, | 
|  |  | 
|  | // Remove a callback from the list | 
|  | remove: function() { | 
|  | jQuery.each( arguments, function( _, arg ) { | 
|  | var index; | 
|  | while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { | 
|  | list.splice( index, 1 ); | 
|  |  | 
|  | // Handle firing indexes | 
|  | if ( index <= firingIndex ) { | 
|  | firingIndex--; | 
|  | } | 
|  | } | 
|  | } ); | 
|  | return this; | 
|  | }, | 
|  |  | 
|  | // Check if a given callback is in the list. | 
|  | // If no argument is given, return whether or not list has callbacks attached. | 
|  | has: function( fn ) { | 
|  | return fn ? | 
|  | jQuery.inArray( fn, list ) > -1 : | 
|  | list.length > 0; | 
|  | }, | 
|  |  | 
|  | // Remove all callbacks from the list | 
|  | empty: function() { | 
|  | if ( list ) { | 
|  | list = []; | 
|  | } | 
|  | return this; | 
|  | }, | 
|  |  | 
|  | // Disable .fire and .add | 
|  | // Abort any current/pending executions | 
|  | // Clear all callbacks and values | 
|  | disable: function() { | 
|  | locked = queue = []; | 
|  | list = memory = ""; | 
|  | return this; | 
|  | }, | 
|  | disabled: function() { | 
|  | return !list; | 
|  | }, | 
|  |  | 
|  | // Disable .fire | 
|  | // Also disable .add unless we have memory (since it would have no effect) | 
|  | // Abort any pending executions | 
|  | lock: function() { | 
|  | locked = queue = []; | 
|  | if ( !memory && !firing ) { | 
|  | list = memory = ""; | 
|  | } | 
|  | return this; | 
|  | }, | 
|  | locked: function() { | 
|  | return !!locked; | 
|  | }, | 
|  |  | 
|  | // Call all callbacks with the given context and arguments | 
|  | fireWith: function( context, args ) { | 
|  | if ( !locked ) { | 
|  | args = args || []; | 
|  | args = [ context, args.slice ? args.slice() : args ]; | 
|  | queue.push( args ); | 
|  | if ( !firing ) { | 
|  | fire(); | 
|  | } | 
|  | } | 
|  | return this; | 
|  | }, | 
|  |  | 
|  | // Call all the callbacks with the given arguments | 
|  | fire: function() { | 
|  | self.fireWith( this, arguments ); | 
|  | return this; | 
|  | }, | 
|  |  | 
|  | // To know if the callbacks have already been called at least once | 
|  | fired: function() { | 
|  | return !!fired; | 
|  | } | 
|  | }; | 
|  |  | 
|  | return self; | 
|  | }; | 
|  |  | 
|  | return jQuery; | 
|  | } ); |