Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
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.");
}