Phi: add a scale to map
[fg:fgdata.git] / webgui / widgets / Stopwatch.js
1 define([
2         'jquery', 'knockout', 'text!./Stopwatch.html', 'kojqui/button'
3 ], function(jquery, ko, htmlString) {
4
5     function ViewModel(params) {
6         var self = this;
7
8         self.MODE = {
9             STOPPED : 0,
10             PAUSED : 1,
11             RUNNING : 2,
12         };
13
14         self.mode = ko.observable(self.MODE.STOPPED);
15         self.elapsedTime = ko.observable(0);
16         self.elapsedTimeSeconds = ko.pureComputed(function() {
17             return (self.elapsedTime() / 1000).toFixed(0);
18         });
19
20         self.startLabel = ko.pureComputed(function() {
21             return self.mode() == self.MODE.RUNNING ? "Pause" : "Start";
22         });
23
24         self.startIcons = ko.pureComputed(function() {
25             return self.mode() == self.MODE.RUNNING ? {
26                 primary : 'ui-icon-pause'
27             } : {
28                 primary : 'ui-icon-play'
29             };
30         });
31
32         function twoDigits(n) {
33             if (n >= 10)
34                 return n.toString();
35             else
36                 return '0' + n.toString();
37         }
38
39         self.hoursDisplay = ko.pureComputed(function() {
40             return twoDigits(Math.floor(self.elapsedTimeSeconds() / 3600));
41         });
42
43         self.minutesDisplay = ko.pureComputed(function() {
44             return twoDigits(Math.floor(self.elapsedTimeSeconds() / 60) % 60);
45         });
46
47         self.secondsDisplay = ko.pureComputed(function() {
48             return twoDigits(self.elapsedTimeSeconds() % 60);
49         });
50
51         self.startTime = 0;
52         self.runTime = 0;
53         self.cumulatedTime = 50;
54
55         self.startStopPause = function() {
56             switch (self.mode()) {
57             case self.MODE.STOPPED:
58             case self.MODE.PAUSED:
59                 self.mode(self.MODE.RUNNING);
60                 break;
61             case self.MODE.RUNNING:
62                 self.mode(self.MODE.PAUSED);
63                 self.cumulatedTime = self.elapsedTime();
64                 break;
65
66             }
67
68             if (self.mode() == self.MODE.RUNNING) {
69                 self.startTime = new Date();
70                 self.update();
71             }
72         }
73
74         self.update = function() {
75             if (self.mode() != self.MODE.RUNNING)
76                 return;
77
78             var now = new Date();
79             self.elapsedTime(self.cumulatedTime + (now - self.startTime));
80             setTimeout(function() {
81                 self.update();
82             }, 100);
83         }
84
85         self.clear = function() {
86             self.cumulatedTime = 0;
87             self.startTime = new Date();
88             self.elapsedTime(0);
89         }
90     }
91
92     ViewModel.prototype.dispose = function() {
93     }
94
95     // Return component definition
96     return {
97         viewModel : ViewModel,
98         template : htmlString
99     };
100 });