Show:
                            /**
                             * The DelayedTask Utility - Executes the supplied function in the context of
                             * the supplied object 'when' milliseconds later
                             *
                             * @module aui-delayed-task
                             */
                            
                            /**
                             * A base class for DelayedTask, providing:
                             * <ul>
                             *    <li>Executes the supplied function in the context of the supplied object 'when' milliseconds later</li>
                             * </ul>
                             *
                             * Quick Example:<br/>
                             *
                             * <pre><code>var delayed = new A.DelayedTask({
                             *	 function() {
                             *     // This callback will be executed when the <code>DelayedTask</code> be invoked
                             *	 },
                             *	 scope
                             *  });
                             *
                             * 	// executes after 1000ms the callback
                             *  delayed.delay(1000);
                             * </code></pre>
                             *
                             * Check the list of <a href="DelayedTask.html#configattributes">Configuration Attributes</a> available for
                             * DelayedTask.
                             *
                             * @param config {Object} Object literal specifying widget configuration properties.
                             *
                             * @class DelayedTask
                             * @param {function} fn Callback
                             * @param {Object} scope Context object. Optional.
                             * @param args 0..n additional arguments that should be provided to the listener.
                             * @constructor
                             */
                            var DelayedTask = function(fn, scope, args) {
                                var instance = this;
                            
                                /**
                                 * Stores the passed <code>args</code> attribute.
                                 *
                                 * @property _args
                                 * @type Object
                                 * @protected
                                 */
                                instance._args = args;
                            
                                /**
                                 * Stores the passed <code>delay</code> attribute.
                                 *
                                 * @property _delay
                                 * @default 0
                                 * @type Number
                                 * @protected
                                 */
                                instance._delay = 0;
                            
                                /**
                                 * Stores the passed <code>fn</code> attribute.
                                 *
                                 * @property _fn
                                 * @type function
                                 * @protected
                                 */
                                instance._fn = fn;
                            
                                /**
                                 * Stores the timer <code>id</code> given from the <code>setInterval</code>.
                                 *
                                 * @property _id
                                 * @default null
                                 * @type Number
                                 * @protected
                                 */
                                instance._id = null;
                            
                                /**
                                 * Stores the passed <code>scope</code> attribute.
                                 *
                                 * @property _scope
                                 * @default instance
                                 * @type Object
                                 * @protected
                                 */
                                instance._scope = scope || instance;
                            
                                /**
                                 * Stores the current timestamp given from
                                 * <a href="DelayedTask.html#method__getTime">_getTime</a>.
                                 *
                                 * @property _time
                                 * @default 0
                                 * @type Number
                                 * @protected
                                 */
                                instance._time = 0;
                            
                                instance._base = function() {
                                    var now = instance._getTime();
                            
                                    if (now - instance._time >= instance._delay) {
                                        clearInterval(instance._id);
                            
                                        instance._id = null;
                            
                                        instance._fn.apply(instance._scope, instance._args || []);
                                    }
                                };
                            };
                            
                            DelayedTask.prototype = {
                                /**
                                 * <p>This function is responsible to execute the user callback, passed in
                                 * the <code>constructor</code> after <code>delay</code> milliseconds.</p>
                                 *
                                 * Example:
                                 *
                                 * <pre><code>// executes after 1000ms the callback
                                 * delayed.delay(1000);</code></pre>
                                 *
                                 * @method delay
                                 * @param {Number} delay Delay in milliseconds.
                                 * @param {function} newFn Callback.
                                 * @param {Object} newScope Context object. Optional.
                                 * @param newArgs 0..n additional arguments that should be provided to the listener.
                                 */
                                delay: function(delay, newFn, newScope, newArgs) {
                                    var instance = this;
                            
                                    if (instance._id && instance._delay != delay) {
                                        instance.cancel();
                                    }
                            
                                    instance._delay = delay || instance._delay;
                                    instance._time = instance._getTime();
                            
                                    instance._fn = newFn || instance._fn;
                                    instance._scope = newScope || instance._scope;
                                    instance._args = newArgs || instance._args;
                            
                                    if (!A.Lang.isArray(instance._args)) {
                                        instance._args = [instance._args];
                                    }
                            
                                    if (!instance._id) {
                                        if (instance._delay > 0) {
                                            instance._id = setInterval(instance._base, instance._delay);
                                        }
                                        else {
                                            instance._base();
                                        }
                                    }
                                },
                            
                                /**
                                 * Cancel the delayed task in case it's running (i.e., clearInterval from
                                 * the current running <a href="DelayedTask.html#property__id">_id</a>).
                                 *
                                 * @method cancel
                                 */
                                cancel: function() {
                                    var instance = this;
                            
                                    if (instance._id) {
                                        clearInterval(instance._id);
                            
                                        instance._id = null;
                                    }
                                },
                            
                                /**
                                 * Get the current timestamp (i.e., now).
                                 *
                                 * @method _getTime
                                 * @protected
                                 * @return {Number} Current timestamp
                                 */
                                _getTime: function() {
                                    var instance = this;
                            
                                    return (+new Date());
                                }
                            };
                            
                            A.DelayedTask = DelayedTask;