1
0
Fork 0
fgdata/webgui/widgets/Stopwatch.js

101 lines
2.7 KiB
JavaScript
Raw Normal View History

2015-02-18 11:31:00 +00:00
define([
'jquery', 'knockout', 'text!./Stopwatch.html', 'kojqui/button'
], function(jquery, ko, htmlString) {
function ViewModel(params) {
var self = this;
self.MODE = {
STOPPED : 0,
PAUSED : 1,
RUNNING : 2,
};
self.mode = ko.observable(self.MODE.STOPPED);
self.elapsedTime = ko.observable(0);
self.elapsedTimeSeconds = ko.pureComputed(function() {
return (self.elapsedTime() / 1000).toFixed(0);
});
self.startLabel = ko.pureComputed(function() {
return self.mode() == self.MODE.RUNNING ? "Pause" : "Start";
});
self.startIcons = ko.pureComputed(function() {
return self.mode() == self.MODE.RUNNING ? {
primary : 'ui-icon-pause'
} : {
primary : 'ui-icon-play'
};
});
function twoDigits(n) {
if (n >= 10)
return n.toString();
else
return '0' + n.toString();
}
self.hoursDisplay = ko.pureComputed(function() {
return twoDigits(Math.floor(self.elapsedTimeSeconds() / 3600));
});
self.minutesDisplay = ko.pureComputed(function() {
return twoDigits(Math.floor(self.elapsedTimeSeconds() / 60) % 60);
});
self.secondsDisplay = ko.pureComputed(function() {
return twoDigits(self.elapsedTimeSeconds() % 60);
});
self.startTime = 0;
self.runTime = 0;
self.cumulatedTime = 50;
self.startStopPause = function() {
switch (self.mode()) {
case self.MODE.STOPPED:
case self.MODE.PAUSED:
self.mode(self.MODE.RUNNING);
break;
case self.MODE.RUNNING:
self.mode(self.MODE.PAUSED);
self.cumulatedTime = self.elapsedTime();
break;
}
if (self.mode() == self.MODE.RUNNING) {
self.startTime = new Date();
self.update();
}
}
self.update = function() {
if (self.mode() != self.MODE.RUNNING)
return;
var now = new Date();
self.elapsedTime(self.cumulatedTime + (now - self.startTime));
setTimeout(function() {
self.update();
}, 100);
}
self.clear = function() {
self.cumulatedTime = 0;
self.startTime = new Date();
self.elapsedTime(0);
}
}
ViewModel.prototype.dispose = function() {
}
// Return component definition
return {
viewModel : ViewModel,
template : htmlString
};
});