MediaWiki:Common.js
From NOISZ Wiki
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
/* Any JavaScript here will be loaded for all users on every page load. */
/* This is for the countdown timers */
(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();
}
})();