var RefreshingAlready = false;
var alreadyScanned = false;
var MainLoop = function (index) {
setInterval(function () {
// Setup again
endDate = new Date(index.getAttribute("data-end")).getTime();
now = new Date().getTime();
distance = endDate - now;
if (!alreadyScanned) {
alreadyScanned = true;
var sanitizedCode = encodeURIComponent(index.getAttribute("data-event"));
$.post( "https:" + mw.config.get( "wgServer" ) +
"/w/api.php?action=parse&format=json&title=" + mw.config.get('wgPageName') + "&text=" + sanitizedCode
+ "&pst=1",
function ( res ) {
if ( !res || !res.parse || !res.parse.text ) return console.log( "Preview failed" );
var StrippedText = res.parse.text['*'];
//Trim off div/p tags
var endTrim = StrippedText.search(/<\/p>/g)-1;
StrippedText = StrippedText.substring(33,endTrim);
index.setAttribute("data-event",StrippedText);
}
);
}
if (isNaN(distance)) {
// Something went terribly wrong with parsing the dates.
// Display error
index.innerHTML = '<strong class="error">[LiveCountdown] Parsing date from "'+ index.getAttribute("data-end") +'" returned NaN, check parameters "month/day/year/customdate"</strong>';
} else {
// Time calculations for days, hours, minutes and seconds (copied from W3Schools)
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
var hours = Math.floor(
(distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)
);
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((distance % (1000 * 60)) / 1000);
// Display the result
index.innerHTML =
"There are <b>" +
days +
"</b> days, <b>" +
hours +
"</b> hours, <b>" +
minutes +
"</b> minutes, and <b>" +
seconds +
"</b> seconds until " +
index.getAttribute("data-event") +
".";
}
// If the count down is finished, refresh
if (distance < 0) {
index.innerHTML = "Countdown expired, refreshing...";
if (!RefreshingAlready) {
document.location.reload();
RefreshingAlready = true;
}
}
}, 1000);
};
var counts = document.getElementsByClassName("toxicountdown");
if (counts.length > 0) {
for (var i = 0; i < counts.length; i++) {
counts[i].innerHTML = "Loading countdown...";
var endDate = new Date(counts[i].getAttribute("data-end")).getTime();
var now = new Date().getTime();
var distance = endDate - now;
if (distance < 0) {
counts[i].innerHTML = "The countdown finished.";
} else {
if (counts[i].getAttribute("data-event").search(/<(\/|)script>/g) != -1) {
//script tag, do not run
counts[i].innerHTML = '<strong class="error">[LiveCountdown] Possible XSS detected in event parameter. As a safety precaution, this countdown is cancelled. Please revert the recent edits immediately.</strong>';
} else {
MainLoop(counts[i]);
}
}
}
} else {
console.log("[LiveCountdown] No countdown widgets detected.");
}