|
1 | 1 | class Runner
|
2 |
| - constructor: (items, options, start) -> |
3 |
| - return new Runner(items, options, start) if !(@ instanceof Runner) |
4 |
| - |
5 |
| - @items = items |
6 |
| - id = @id = uid() |
7 |
| - @settings = $.extend({}, @settings, options) |
8 |
| - |
9 |
| - runners[id] = @ |
10 |
| - items.each (index, element) -> |
11 |
| - $(element).data 'runner', id |
12 |
| - return |
13 |
| - |
14 |
| - @value @settings.startAt |
15 |
| - |
16 |
| - @start() if start or @settings.autostart |
17 |
| - |
18 |
| - running: false |
19 |
| - updating: false |
20 |
| - finished: false |
21 |
| - interval: null |
22 |
| - total: 0 |
23 |
| - lastTime: 0 |
24 |
| - startTime: 0 |
25 |
| - lastLap: 0 |
26 |
| - lapTime: 0 |
27 |
| - |
28 |
| - settings: |
29 |
| - autostart: false |
30 |
| - interval: 20 |
31 |
| - countdown: false |
32 |
| - stopAt: null |
33 |
| - startAt: 0 |
34 |
| - milliseconds: true |
35 |
| - format: null |
36 |
| - |
37 |
| - value: (value) -> |
38 |
| - @items.each (item, element) => |
39 |
| - item = $(element) |
40 |
| - action = if item.is('input') then 'val' else 'text' |
41 |
| - item[action](@format(value)) |
42 |
| - return |
| 2 | + constructor: (items, options, start) -> |
| 3 | + return new Runner(items, options, start) unless (@ instanceof Runner) |
| 4 | + |
| 5 | + @items = items |
| 6 | + id = @id = uid() |
| 7 | + @settings = $.extend({}, @settings, options) |
| 8 | + |
| 9 | + runners[id] = @ |
| 10 | + items.each (index, element) -> |
| 11 | + $(element).data 'runner', id |
| 12 | + return |
| 13 | + |
| 14 | + @value @settings.startAt |
| 15 | + @start() if start or @settings.autostart |
| 16 | + |
| 17 | + running: false |
| 18 | + updating: false |
| 19 | + finished: false |
| 20 | + interval: null |
| 21 | + total: 0 |
| 22 | + lastTime: 0 |
| 23 | + startTime: 0 |
| 24 | + lastLap: 0 |
| 25 | + lapTime: 0 |
| 26 | + |
| 27 | + settings: |
| 28 | + autostart: false |
| 29 | + interval: 20 |
| 30 | + countdown: false |
| 31 | + stopAt: null |
| 32 | + startAt: 0 |
| 33 | + milliseconds: true |
| 34 | + format: null |
| 35 | + |
| 36 | + value: (value) -> |
| 37 | + @items.each (item, element) => |
| 38 | + item = $(element) |
| 39 | + action = if item.is('input') then 'val' else 'text' |
| 40 | + item[action](@format(value)) |
| 41 | + return |
| 42 | + return |
| 43 | + |
| 44 | + format: (value) -> |
| 45 | + format = @settings.format |
| 46 | + format = if $.isFunction(format) then format else formatTime |
| 47 | + format(value, @settings) |
| 48 | + |
| 49 | + update: -> |
| 50 | + unless @updating |
| 51 | + @updating = true |
| 52 | + settings = @settings |
| 53 | + time = $.now() |
| 54 | + stopAt = settings.stopAt |
| 55 | + countdown = settings.countdown |
| 56 | + delta = time - @lastTime |
| 57 | + @lastTime = time |
| 58 | + if countdown then @total -= delta else @total += delta |
| 59 | + if stopAt isnt null and ((countdown and @total <= stopAt) or (not countdown and @total >= stopAt)) |
| 60 | + @total = stopAt |
| 61 | + @finished = true |
| 62 | + @stop() |
| 63 | + @fire 'runnerFinish' |
| 64 | + |
| 65 | + @value @total |
| 66 | + @updating = false |
| 67 | + return |
| 68 | + |
| 69 | + fire: (event) -> |
| 70 | + @items.trigger event, @info() |
| 71 | + return |
| 72 | + |
| 73 | + start: -> |
| 74 | + unless @running |
| 75 | + @running = true |
| 76 | + @reset() if not @startTime or @finished |
| 77 | + @lastTime = $.now() |
| 78 | + @interval = setInterval(=> |
| 79 | + @update() |
43 | 80 | return
|
44 |
| - |
45 |
| - format: (value) -> |
46 |
| - format = @settings.format |
47 |
| - format = if $.isFunction(format) then format else formatTime |
48 |
| - format(value, @settings) |
49 |
| - |
50 |
| - update: -> |
51 |
| - unless @updating |
52 |
| - @updating = true |
53 |
| - settings = @settings |
54 |
| - time = $.now() |
55 |
| - stopAt = settings.stopAt |
56 |
| - countdown = settings.countdown |
57 |
| - delta = time - @lastTime |
58 |
| - @lastTime = time |
59 |
| - if countdown then @total -= delta else @total += delta |
60 |
| - if stopAt isnt null and ((countdown and @total <= stopAt) or (not countdown and @total >= stopAt)) |
61 |
| - @total = stopAt |
62 |
| - @finished = true |
63 |
| - @stop() |
64 |
| - @fire 'runnerFinish' |
65 |
| - |
66 |
| - @value @total |
67 |
| - @updating = false |
68 |
| - return |
69 |
| - |
70 |
| - fire: (event) -> |
71 |
| - @items.trigger event, @info() |
72 |
| - return |
73 |
| - |
74 |
| - start: -> |
75 |
| - unless @running |
76 |
| - @running = true |
77 |
| - @reset() if not @startTime or @finished |
78 |
| - @lastTime = $.now() |
79 |
| - @interval = setInterval(=> |
80 |
| - @update() |
81 |
| - return |
82 |
| - , @settings.interval) |
83 |
| - |
84 |
| - @fire 'runnerStart' |
85 |
| - return |
86 |
| - |
87 |
| - stop: -> |
88 |
| - if @running |
89 |
| - @running = false |
90 |
| - clearInterval @interval |
91 |
| - @update() |
92 |
| - @fire 'runnerStop' |
93 |
| - return |
94 |
| - |
95 |
| - toggle: -> |
96 |
| - if @running then @stop() else @start() |
97 |
| - return |
98 |
| - |
99 |
| - lap: -> |
100 |
| - last = @lastTime |
101 |
| - lap = last - @lapTime |
102 |
| - if @running or lap |
103 |
| - @lastLap = lap |
104 |
| - @lapTime = last |
105 |
| - last = @format @lastLap |
106 |
| - @fire 'runnerLap' |
107 |
| - return last |
108 |
| - |
109 |
| - reset: (stop) -> |
110 |
| - @stop() if stop |
111 |
| - @startTime = @lapTime = @lastTime = $.now() |
112 |
| - @total = @settings.startAt |
113 |
| - @value @total |
114 |
| - @finished = false |
115 |
| - @fire 'runnerReset' |
116 |
| - return |
117 |
| - |
118 |
| - info: -> |
119 |
| - lap = @lastLap or 0 |
120 |
| - { |
121 |
| - running: @running |
122 |
| - finished: @finished |
123 |
| - time: @total |
124 |
| - formattedTime: @format(@total) |
125 |
| - startTime: @startTime |
126 |
| - lapTime: lap |
127 |
| - formattedLapTime: @format(lap) |
128 |
| - settings: @settings |
129 |
| - } |
| 81 | + , @settings.interval) |
| 82 | + |
| 83 | + @fire 'runnerStart' |
| 84 | + return |
| 85 | + |
| 86 | + stop: -> |
| 87 | + if @running |
| 88 | + @running = false |
| 89 | + clearInterval @interval |
| 90 | + @update() |
| 91 | + @fire 'runnerStop' |
| 92 | + return |
| 93 | + |
| 94 | + toggle: -> |
| 95 | + if @running then @stop() else @start() |
| 96 | + return |
| 97 | + |
| 98 | + lap: -> |
| 99 | + last = @lastTime |
| 100 | + lap = last - @lapTime |
| 101 | + |
| 102 | + if @settings.countdown |
| 103 | + lap = -lap |
| 104 | + |
| 105 | + if @running or lap |
| 106 | + @lastLap = lap |
| 107 | + @lapTime = last |
| 108 | + |
| 109 | + last = @format @lastLap |
| 110 | + @fire 'runnerLap' |
| 111 | + |
| 112 | + return last |
| 113 | + |
| 114 | + reset: (stop) -> |
| 115 | + @stop() if stop |
| 116 | + |
| 117 | + nowTime = $.now() |
| 118 | + if typeof @settings.startAt is 'number' and not @settings.countdown |
| 119 | + nowTime -= @settings.startAt |
| 120 | + |
| 121 | + @startTime = @lapTime = @lastTime = nowTime |
| 122 | + @total = @settings.startAt |
| 123 | + @value @total |
| 124 | + @finished = false |
| 125 | + @fire 'runnerReset' |
| 126 | + return |
| 127 | + |
| 128 | + info: -> |
| 129 | + lap = @lastLap or 0 |
| 130 | + { |
| 131 | + running: @running |
| 132 | + finished: @finished |
| 133 | + time: @total |
| 134 | + formattedTime: @format(@total) |
| 135 | + startTime: @startTime |
| 136 | + lapTime: lap |
| 137 | + formattedLapTime: @format(lap) |
| 138 | + settings: @settings |
| 139 | + } |
0 commit comments