Widget:LocalTimeHelper
Jump to navigation
Jump to search
This has been moved to Mediawiki:Common.js.
<script type="application/javascript">
// Widget:LocalTimeHelper
;(function() {
'use strict';
var verifyTime = function(value) {
var time = parseInt(value, 10);
if (isNaN(time)) time = 0;
return time*1000;
}
var verifyText = function(text, defaultText, hasTime) {
if (text === undefined)
return defaultText;
if (hasTime && !text.includes('%s'))
text = text + ' %s.';
return text
};
var formatTime = function(days, hours, minutes, seconds) {
var result = '';
result += (days) ? ' '+days.toString()+'d' : '';
result += (hours) ? ' '+hours.toString()+'h' : '';
result += (minutes) ? ' '+minutes.toString()+'m' : '';
result += (seconds) ? ' '+Math.max(seconds-1, 0).toString()+'s' : '';
return result;
}
var updateCountdownText = function(el) {
var now = new Date();
var startDate = new Date(parseInt(el.dataset.startTime, 10));
var endDate = new Date(parseInt(el.dataset.endTime, 10));
var startDiff = startDate.getTime() - now.getTime();
var endDiff = endDate.getTime() - now.getTime();
var text = el.dataset.textEnd;
var diff = startDiff;
if (startDiff > 1000) {
if (startDate < endDate)
text = el.dataset.textStart;
} else if (endDiff > 1000) {
diff = endDiff;
} else {
text = el.dataset.textAfter;
}
if (diff < 1000) {
el.innerHTML = text;// + ' (start: ' + startDate.toUTCString() + ', end: ' + endDate.toUTCString() + ')';
return;
}
diff = diff / 1000;
var days = Math.floor(diff / 86400);
var hours = Math.floor(diff % 86400 / 3600);
var minutes = Math.floor(diff % 3600 / 60);
var seconds = (diff % 3600 % 60).toFixed(0);
if (days === 1) { hours += 24; days = 0; }
if (hours > 1 || days > 0) seconds = 0;
if (days > 0) minutes = 0;
var result = formatTime(days, hours, minutes, seconds);
var interval = 1000;
if (days > 0) {
interval = 60*60*1000;
} else if (hours > 1) {
interval = 60*1000;
}
el.innerHTML = text.replace('%s', result);// + ' (start: ' + startDate.toUTCString() + ', end: ' + endDate.toUTCString() + ', diff: ' + diff +', interval: ' + interval + ')';
window.setTimeout(function() {
updateCountdownText(el);
}, interval);
}
const nth = function(d) {
if (d > 3 && d < 21) return 'th';
switch (d % 10) {
case 1: return "st";
case 2: return "nd";
case 3: return "rd";
default: return "th";
}
}
var updateTimeText = function(el, time) {
var months = ["January","February","March","April","May","June","July","August","September","October","November","December"];
var date = new Date(time);
var output = '';
if ((el.dataset.format == 'hm') || (el.dataset.format == 'H:i')) {
output = ("000"+date.getHours()).slice(-2) + ":" +
("000"+date.getMinutes()).slice(-2);
} else if (el.dataset.format == 'md') {
output = months[date.getMonth()] + " " +
date.getDate() + nth(date.getDate());
} else if (el.dataset.format == 'mdy') {
output = months[date.getMonth()] + " " +
date.getDate() + nth(date.getDate()) + ", " +
date.getFullYear();
} else {
output = ("000"+date.getHours()).slice(-2) + ":" +
("000"+date.getMinutes()).slice(-2) + ", " +
months[date.getMonth()] + " " +
date.getDate() + nth(date.getDate()) + ", " +
date.getFullYear();
}
el.innerHTML = output;
}
var ready = function() {
var elements = document.querySelectorAll('.localtime');
Array.from(elements).forEach(function(el) {
var startTime = verifyTime(el.dataset.start);
var endTime = verifyTime(el.dataset.end);
var time = verifyTime(el.dataset.time);
el.dataset.textStart = verifyText(el.dataset.textStart, 'Starts in %s.', true);
el.dataset.textEnd = verifyText(el.dataset.textEnd, 'Ends in %s.', true);
el.dataset.textAfter = verifyText(el.dataset.textAfter, 'Event has ended.', false);
if ((startTime + endTime) > 0) {
el.dataset.startTime = startTime;
el.dataset.endTime = endTime;
updateCountdownText(el);
} else if (time > 0){
updateTimeText(el, time);
}
});
}
if (document.readyState == 'loading') {
document.addEventListener('DOMContentLoaded', ready);
} else {
ready();
}
})();
</script>