~bcsaller/juju-gui/exportXY

« back to all changes in this revision

Viewing changes to app/assets/javascripts/gallery-timer-debug.js

  • Committer: Gary Poster
  • Date: 2012-12-20 21:59:21 UTC
  • mto: This revision was merged to the branch mainline in revision 293.
  • Revision ID: gary.poster@canonical.com-20121220215921-qw5hqm7a8uymvwfr
Correct release docs; improve review docs; make all files served locally, so https can work; update makefile to have better names for build artifacts and more correctly designate phony targets; reduce unnecessary duplication of file creation in repeated Makefile runs.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
YUI.add('gallery-timer', function(Y) {
 
2
 
 
3
/**
 
4
* Losely modeled after AS3's Timer class. Provides a simple interface start,
 
5
*   pause, resume, and stop a defined timer set with a custom callback method.
 
6
* @module timer
 
7
* @author Anthony Pipkin
 
8
* @version 1.2.0
 
9
*/
 
10
/**
 
11
* Losely modeled after AS3's Timer class. Provides a simple interface start,
 
12
*   pause, resume, and stop a defined timer set with a custom callback method.
 
13
* @class Y.Timer
 
14
* @extends Y.Base
 
15
*/
 
16
 
 
17
// Local constants
 
18
var STATUS_RUNNING = 'running',
 
19
    STATUS_PAUSED  = 'paused',
 
20
    STATUS_STOPPED = 'stopped',
 
21
 
 
22
    EVENT_START  = 'start',
 
23
    EVENT_STOP   = 'stop',
 
24
    EVENT_PAUSE  = 'pause',
 
25
    EVENT_RESUME = 'resume',
 
26
    EVENT_TIMER  = 'timer';
 
27
 
 
28
 
 
29
Y.Timer = Y.Base.create('timer', Y.Base, [] , {
 
30
 
 
31
    /**
 
32
    * @event start
 
33
    * @description The timer has started
 
34
    * @param {Event.Facade} event An Event Facade object
 
35
    * @type {Event.Custom}
 
36
    */
 
37
 
 
38
    /**
 
39
    * @event stop
 
40
    * @description The timer has stopped
 
41
    * @param {Event.Facade} event An Event Facade object
 
42
    * @type {Event.Custom}
 
43
    */
 
44
 
 
45
    /**
 
46
    * @event pause
 
47
    * @description The timer has paused
 
48
    * @param {Event.Facade} event An Event Facade object
 
49
    * @type {Event.Custom}
 
50
    */
 
51
 
 
52
    /**
 
53
    * @event resume
 
54
    * @description The timer has resumed
 
55
    * @param {Event.Facade} event An Event Facade object
 
56
    * @type {Event.Custom}
 
57
    */
 
58
 
 
59
    /**
 
60
    * Fires at every interval of Y.Timer
 
61
    * @event timer
 
62
    * @description The timer has reached a reached zero
 
63
    * @param {Event.Facade} event An Event Facade object
 
64
    * @type {Event.Custom}
 
65
    */
 
66
 
 
67
    //////   P U B L I C   //////
 
68
 
 
69
    /**
 
70
    * Initializer lifecycle implementation for the Timer class.
 
71
    * Publishes events and subscribes
 
72
    * to update after the status is changed.
 
73
    *
 
74
    * @method initializer
 
75
    * @protected
 
76
    * @param config {Object} Configuration object literal for
 
77
    *     the Timer
 
78
    * @since 1.0.0
 
79
    */
 
80
    initializer : function(config){
 
81
        this.after('statusChange',this._afterStatusChange,this);
 
82
        this.publish(EVENT_START ,  { defaultFn : this._defStartFn });
 
83
        this.publish(EVENT_STOP ,   { defaultFn : this._defStopFn });
 
84
        this.publish(EVENT_PAUSE ,  { defaultFn : this._defPauseFn });
 
85
        this.publish(EVENT_RESUME , { defaultFn : this._defResumeFn });
 
86
    },
 
87
 
 
88
    /**
 
89
    * Interface method to start the Timer. Fires timer:start
 
90
    *
 
91
    * @method start
 
92
    * @public
 
93
    * @since 1.0.0
 
94
    */
 
95
    start : function() {
 
96
        Y.log('Timer::start','info');
 
97
        if(this.get('status') !== STATUS_RUNNING) {
 
98
            this.fire(EVENT_START);
 
99
        }
 
100
 
 
101
        return this;
 
102
    },
 
103
 
 
104
    /**
 
105
    * Interface method to stop the Timer. Fires timer:stop
 
106
    *
 
107
    * @method stop
 
108
    * @public
 
109
    * @since 1.0.0
 
110
    */
 
111
    stop : function() {
 
112
        Y.log('Timer::stop','info');
 
113
        if(this.get('status') === STATUS_RUNNING) {
 
114
            this.fire(EVENT_STOP);
 
115
        }
 
116
 
 
117
        return this;
 
118
    },
 
119
 
 
120
    /**
 
121
    * Interface method to pause the Timer. Fires timer:pause
 
122
    *
 
123
    * @method pause
 
124
    * @public
 
125
    * @since 1.0.0
 
126
    */
 
127
    pause : function() {
 
128
        Y.log('Timer::pause','info');
 
129
        if(this.get('status') === STATUS_RUNNING) {
 
130
            this.fire(EVENT_PAUSE);
 
131
        }
 
132
 
 
133
        return this;
 
134
    },
 
135
 
 
136
    /**
 
137
    * Interface method to resume the Timer. Fires timer:resume
 
138
    *
 
139
    * @method resume
 
140
    * @public
 
141
    * @since 1.0.0
 
142
    */
 
143
    resume : function() {
 
144
        Y.log('Timer::resume','info');
 
145
        if(this.get('status') === STATUS_PAUSED) {
 
146
            this.fire(EVENT_RESUME);
 
147
        }
 
148
 
 
149
        return this;
 
150
    },
 
151
 
 
152
 
 
153
    //////   P R O T E C T E D   //////
 
154
 
 
155
    /**
 
156
    * Internal timer
 
157
    * 
 
158
    * @property {Y.later} _timerObj
 
159
    * @protected
 
160
    * @since 1.0.0
 
161
    */
 
162
    _timerObj : null,
 
163
 
 
164
    /**
 
165
    * Resume length
 
166
    *
 
167
    * @property _remainingLength
 
168
    * @protected
 
169
    * @since 1.2.0
 
170
    */
 
171
    _remainingLength: null,
 
172
 
 
173
    /**
 
174
    * Checks to see if a new Timer is to be created. If so, calls
 
175
    * _timer() after a the schedule number of milliseconds. Sets
 
176
    * Timer pointer to the new Timer id. Sets start to the current
 
177
    * timestamp.
 
178
    *
 
179
    * @method _makeTimer
 
180
    * @protected
 
181
    * @since 1.0.0
 
182
    */
 
183
    _makeTimer : function() {
 
184
        Y.log('Timer::_makeTimer','info');
 
185
        var timerObj = this._timerObj,
 
186
        repeat = this.get('repeatCount');
 
187
 
 
188
        if (timerObj) {
 
189
            timerObj.cancel();
 
190
            timerObj = null;
 
191
            this._timerObj = null;
 
192
        }
 
193
 
 
194
        if(repeat === 0 || repeat > this.get('step')) {
 
195
            timerObj = Y.later(this._remainingLength, this, this._timer);
 
196
        }
 
197
 
 
198
        this._timerObj = timerObj;
 
199
        this.set('timer', timerObj);
 
200
        this.set('start', (new Date()).getTime());
 
201
        this.set('stop', this.get('start'));
 
202
    },
 
203
 
 
204
    /**
 
205
    * Resets the Timer.
 
206
    *
 
207
    * @method _destroyTimer
 
208
    * @protected
 
209
    * @since 1.0.0
 
210
    */
 
211
    _destroyTimer : function() {
 
212
        Y.log('Timer::_destroyTimer','info');
 
213
        var timerObj = this._timerObj;
 
214
 
 
215
        if (timerObj) {
 
216
            timerObj.cancel();
 
217
            timerObj = null;
 
218
            this._timerObj = null;
 
219
        }
 
220
 
 
221
        this.set('timer', null);
 
222
        this.set('stop', (new Date()).getTime());
 
223
        this.set('step', 0);
 
224
 
 
225
        this._remainingLength = this._remainingLength - (this.get('stop') - this.get('start'));
 
226
 
 
227
    },
 
228
 
 
229
    /**
 
230
    * Increments the step and either stops or starts a new Timer
 
231
    * interval. Fires the timer callback method.
 
232
    *
 
233
    * @method _timer
 
234
    * @protected
 
235
    * @since 1.0.0
 
236
    */
 
237
    _timer : function() {
 
238
        Y.log('Timer::_timer','info');
 
239
        this.fire(EVENT_TIMER);
 
240
 
 
241
        var step = this.get('step'),
 
242
        repeat = this.get('repeatCount');
 
243
 
 
244
        this.set('step', ++step);
 
245
 
 
246
        if(repeat > 0 && repeat <= step) { // repeat at 0 is infinite loop
 
247
            this._remainingLength = 0;
 
248
            this.stop();
 
249
        }else{
 
250
            this._remainingLength = this.get('length');
 
251
            this._makeTimer();
 
252
        }
 
253
 
 
254
        this._executeCallback();
 
255
    },
 
256
 
 
257
    /**
 
258
    * Internal status change event callback. Allows status changes
 
259
    * to fire start(), pause(), resume(), and stop() automatically.
 
260
    *
 
261
    * @method _statusChanged
 
262
    * @protcted
 
263
    * @since 1.0.0
 
264
    */
 
265
    _afterStatusChange : function(e){
 
266
        Y.log('Timer::_afterStatusChange','info');
 
267
        switch(e.newVal) {
 
268
            case STATUS_RUNNING:
 
269
                this._makeTimer();
 
270
                break;
 
271
            case STATUS_STOPPED: // overflow intentional
 
272
            case STATUS_PAUSED:
 
273
                this._destroyTimer();
 
274
                break;
 
275
        }
 
276
    },
 
277
 
 
278
    /**
 
279
    * Default function for start event.
 
280
    *
 
281
    * @method _defStartFn
 
282
    * @protected
 
283
    * @since 1.0.0
 
284
    */
 
285
    _defStartFn : function(e) {
 
286
        Y.log('Timer::_defStartFn','info');
 
287
        var delay = this.get('startDelay');
 
288
 
 
289
        this._remainingLength = this.get('length');
 
290
 
 
291
        if(delay > 0) {
 
292
            Y.later(delay, this, function(){
 
293
                this.set('status', STATUS_RUNNING);
 
294
            });
 
295
        }else{
 
296
            this.set('status', STATUS_RUNNING);
 
297
        }
 
298
    },
 
299
 
 
300
    /**
 
301
    * Default function for stop event.
 
302
    *
 
303
    * @method _defStopFn
 
304
    * @protected
 
305
    * @since 1.0.0
 
306
    */
 
307
    _defStopFn : function(e) {
 
308
        Y.log('Timer::_defStopFn','info');
 
309
 
 
310
        this._remainingLength = 0;
 
311
        this.set('status', STATUS_STOPPED);
 
312
    },
 
313
 
 
314
    /**
 
315
    * Default function for pause event.
 
316
    *
 
317
    * @method _defPauseFn
 
318
    * @protected
 
319
    * @since 1.0.0
 
320
    */
 
321
    _defPauseFn : function(e) {
 
322
        Y.log('Timer::_defPauseFn','info');
 
323
        this.set('status', STATUS_PAUSED);
 
324
    },
 
325
 
 
326
    /**
 
327
    * Default function for resume event. Starts timer with
 
328
    * remaining time left after Timer was paused.
 
329
    *
 
330
    * @method _defResumeFn
 
331
    * @protected
 
332
    * @since 1.0.0
 
333
    */
 
334
    _defResumeFn : function(e) {
 
335
        Y.log('Timer::_defResumeFn','info');
 
336
        this.set('status',STATUS_RUNNING);
 
337
    },
 
338
 
 
339
    /**
 
340
    * Abstracted the repeatCount validator into the prototype to
 
341
    * encourage class extension.
 
342
    *
 
343
    * @method _repeatCountValidator
 
344
    * @protected
 
345
    * @since 1.1.0
 
346
    */
 
347
    _repeatCountValidator : function(val) {
 
348
        Y.log('Timer::_repeatCountValidator','info');
 
349
        return (this.get('status') === STATUS_STOPPED);
 
350
    },
 
351
 
 
352
    /**
 
353
    * Used to fire the internal callback
 
354
    *
 
355
    * @method _executeCallback
 
356
    * @protected
 
357
    * @since 1.1.0
 
358
    */
 
359
    _executeCallback : function() {
 
360
        Y.log('Timer::_executeCallback','info');
 
361
        var callback = this.get('callback');
 
362
        if (Y.Lang.isFunction(callback)) {
 
363
            (this.get('callback'))();
 
364
        }
 
365
    },
 
366
 
 
367
    /**
 
368
    * Returns the time from `now` if the timer is running and returns remaining
 
369
    *   time from `stop` if the timer has stopped.
 
370
    * @method _remainingGetter
 
371
    * @protected
 
372
    * @since 1.2.0
 
373
    */
 
374
    _remainingGetter: function(){
 
375
        Y.log('Timer::_remainingGetter', 'info');
 
376
        var status = this.get('status'),
 
377
            length = this._remainingLength,
 
378
            maxTime = (new Date()).getTime();
 
379
 
 
380
        if (status === STATUS_STOPPED) {
 
381
            return 0;
 
382
        } else if (status === STATUS_PAUSED) {
 
383
            return length;
 
384
        } else {
 
385
            return length - ( maxTime - this.get('start') );
 
386
        }
 
387
    }
 
388
 
 
389
},{
 
390
    /**
 
391
    * Static property used to define the default attribute
 
392
    * configuration for the Timer.
 
393
    *
 
394
    * @property ATTRS
 
395
    * @type Object
 
396
    * @static
 
397
    */
 
398
    ATTRS : {
 
399
 
 
400
        /**
 
401
        * @description The callback method that fires when the
 
402
        * timer interval is reached.
 
403
        *
 
404
        * @attribute callback
 
405
        * @type function
 
406
        * @since 1.0.0
 
407
        */
 
408
        callback : {
 
409
            value : null,
 
410
            validator : Y.Lang.isFunction
 
411
        },
 
412
 
 
413
        /**
 
414
        * Time in milliseconds between intervals
 
415
        *
 
416
        * @attribute length
 
417
        * @type Number
 
418
        * @since 1.0.0
 
419
        */
 
420
        length : {
 
421
            value : 3000,
 
422
            setter : function(val) {
 
423
                return parseInt(val,10);
 
424
            }
 
425
        },
 
426
 
 
427
        /**
 
428
        * Get remaining milliseconds
 
429
        *
 
430
        * @attribute remaining
 
431
        * @type Number
 
432
        * @since 1.2.0
 
433
        */
 
434
        remaining: {
 
435
            readonly: true,
 
436
            getter: '_remainingGetter'
 
437
        },
 
438
 
 
439
        /**
 
440
        * Number of times the Timer should fire before it stops
 
441
        *  - 1.1.0 - added lazyAdd false to prevent starting from
 
442
        *            overriding the validator
 
443
        * @attribute repeatCount
 
444
        * @type Number
 
445
        * @since 1.1.0
 
446
        */
 
447
        repeatCount : {
 
448
            validator : 'repeatCountValidator',
 
449
            setter : function(val) {
 
450
                return parseInt(val,10);
 
451
            },
 
452
            value : 0,
 
453
            lazyAdd : false
 
454
        },
 
455
 
 
456
        /**
 
457
        * Timestamp Timer was started
 
458
        *
 
459
        * @attribute start
 
460
        * @type Boolean
 
461
        * @since 1.0.0
 
462
        */
 
463
        start : {
 
464
            readonly : true
 
465
        },
 
466
 
 
467
        /**
 
468
        * Time in ms to wait until starting after start() has been called
 
469
        * @attribute startDelay
 
470
        * @type Number
 
471
        * @since 1.1.0
 
472
        */
 
473
        startDelay : {
 
474
            value : 0
 
475
        },
 
476
 
 
477
        /**
 
478
        * Timer status
 
479
        *  - 1.1.0 - Changed from state to status. state was left
 
480
        *            from legacy code
 
481
        * @attribute status
 
482
        * @default STATUS_STOPPED
 
483
        * @type String
 
484
        * @since 1.1.0
 
485
        */
 
486
        status : {
 
487
            value : STATUS_STOPPED,
 
488
            readonly : true
 
489
        },
 
490
 
 
491
        /**
 
492
        * Number of times the Timer has looped
 
493
        *
 
494
        * @attribute step
 
495
        * @type Boolean
 
496
        * @since 1.0.0
 
497
        */
 
498
        step : { // number of intervals passed
 
499
            value : 0,
 
500
            readonly : true
 
501
        },
 
502
 
 
503
        /**
 
504
        * Timestamp Timer was stoped or paused
 
505
        *
 
506
        * @attribute stop
 
507
        * @type Boolean
 
508
        * @since 1.0.0
 
509
        */
 
510
        stop : {
 
511
            readonly : true
 
512
        },
 
513
 
 
514
        /**
 
515
        * Timer id to used during stop()
 
516
        *
 
517
        * @attribute timer
 
518
        * @type Number
 
519
        * @since 1.0.0
 
520
        */
 
521
        timer : {
 
522
            readonly : true
 
523
        }
 
524
    },
 
525
 
 
526
    /**
 
527
    * Static property provides public access to registered timer
 
528
    * status strings
 
529
    *
 
530
    * @property Timer.STATUS
 
531
    * @type Object
 
532
    * @static
 
533
    */
 
534
    STATUS : {
 
535
        RUNNING : STATUS_RUNNING,
 
536
        PAUSED  : STATUS_PAUSED,
 
537
        STOPPED : STATUS_STOPPED
 
538
    },
 
539
 
 
540
    /**
 
541
    * Static property provides public access to registered timer
 
542
    * event strings
 
543
    *
 
544
    * @property Timer.EVENTS
 
545
    * @type Object
 
546
    * @static
 
547
    */
 
548
    EVENTS : {
 
549
        START  : EVENT_START,
 
550
        STOP   : EVENT_STOP,
 
551
        PAUSE  : EVENT_PAUSE,
 
552
        RESUME : EVENT_RESUME,
 
553
        TIMER  : EVENT_TIMER
 
554
    }
 
555
});
 
556
 
 
557
 
 
558
 
 
559
}, 'gallery-2012.07.25-21-36' ,{requires:['base-build','event-custom']});