mybuddy/core/static_src/js/timer.js

102 lines
3.0 KiB
JavaScript

/* Baby Buddy Timer
*
* Uses a supplied ID to run a timer. The element using the ID must have
* three children with the following classes:
* * timer-seconds
* * timer-minutes
* * timer-hours
*/
BabyBuddy.Timer = (function ($) {
var runIntervalId = null;
var timerId = null;
var timerElement = null;
var lastUpdate = new Date();
var hidden = null;
var Timer = {
run: function (timer_id, element_id) {
timerId = timer_id;
timerElement = $("#" + element_id);
if (timerElement.length === 0) {
console.error("BBTimer: Timer element not found.");
return false;
}
if (
timerElement.find(".timer-seconds").length === 0 ||
timerElement.find(".timer-minutes").length === 0 ||
timerElement.find(".timer-hours").length === 0
) {
console.error("BBTimer: Element does not contain expected children.");
return false;
}
runIntervalId = setInterval(this.tick, 1000);
// If the page just came in to view, update the timer data with the
// current actual duration. This will (potentially) help mobile
// phones that lock with the timer page open.
if (typeof document.hidden !== "undefined") {
hidden = "hidden";
} else if (typeof document.msHidden !== "undefined") {
hidden = "msHidden";
} else if (typeof document.webkitHidden !== "undefined") {
hidden = "webkitHidden";
}
window.addEventListener("focus", Timer.handleVisibilityChange, false);
},
handleVisibilityChange: function () {
if (!document[hidden] && new Date() - lastUpdate > 1) {
Timer.update();
}
},
tick: function () {
var s = timerElement.find(".timer-seconds");
var seconds = Number(s.text());
if (seconds < 59) {
s.text(seconds + 1);
return;
} else {
s.text(0);
}
var m = timerElement.find(".timer-minutes");
var minutes = Number(m.text());
if (minutes < 59) {
m.text(minutes + 1);
return;
} else {
m.text(0);
}
var h = timerElement.find(".timer-hours");
var hours = Number(h.text());
h.text(hours + 1);
},
update: function () {
$.get("/api/timers/" + timerId + "/", function (data) {
if (data && "duration" in data) {
clearInterval(runIntervalId);
var duration = data.duration.split(/[\s:.]/);
if (duration.length === 5) {
duration[0] = parseInt(duration[0]) * 24 + parseInt(duration[1]);
duration[1] = duration[2];
duration[2] = duration[3];
}
timerElement.find(".timer-hours").text(parseInt(duration[0]));
timerElement.find(".timer-minutes").text(parseInt(duration[1]));
timerElement.find(".timer-seconds").text(parseInt(duration[2]));
lastUpdate = new Date();
runIntervalId = setInterval(Timer.tick, 1000);
}
});
},
};
return Timer;
})(jQuery);