engelsystem/resources/assets/js/countdown.js

81 lines
2.0 KiB
JavaScript
Raw Normal View History

const lang = document.documentElement.getAttribute('lang');
const templateFuture = 'in %value %unit';
const templatePast = lang === "en"
? '%value %unit ago'
: 'vor %value %unit';
const yearUnits = lang === "en"
? ["year", "years"]
: ["Jahr", "Jahren"];
const monthUnits = lang === "en"
? ["month", "months"]
: ["Monat", "Monaten"];
const dayUnits = lang === "en"
? ["day", "days"]
: ["Tag", "Tagen"];
const hourUnits = lang === "en"
? ["hour", "hours"]
: ["Stunde", "Stunden"];
const minuteUnits = lang === "en"
? ["minute", "minutes"]
: ["Minute", "Minuten"];
const secondUnits = lang === "en"
? ["second", "seconds"]
: ["Sekunde", "Sekunden"];
const nowString = lang === "en" ? "now" : "jetzt";
const secondsHour = 60 * 60;
const timeFrames = [
[365 * 24 * 60 * 60, yearUnits],
[30 * 24 * 60 * 60, monthUnits],
[24 * 60 * 60, dayUnits],
[secondsHour, hourUnits],
[60, minuteUnits],
[1, secondUnits],
];
function formatFromNow(timestamp) {
const now = Date.now() / 1000;
const diff = Math.abs(timestamp - now);
const ago = now > timestamp;
for (const [duration, [singular, plural]] of timeFrames) {
const value = diff < secondsHour
? Math.floor(diff / duration)
: Math.round(diff / duration);
if (value) {
const template = ago ? templatePast : templateFuture;
const unit = value === 1 ? singular : plural;
return template
.replace("%value", value)
.replace("%unit", unit);
}
}
return nowString;
}
/**
* Initialises all countdown fields on the page.
*/
$(document).ready(function () {
$.each($('[data-countdown-ts]'), function (i, e) {
var span = $(e);
const timestamp = span.data("countdown-ts");
var text = span.html();
span.html(text.replace('%c', formatFromNow(timestamp)));
setInterval(function () {
span.html(text.replace('%c', formatFromNow(timestamp)));
}, 1000);
});
});