Jump to content

User:Renamed user 1118e35231e79f4dfb50928b1223c248/LiveCountdown.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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.");
}