User:Michael Schönitzer (WMDE)/timezoneconverter.js

From Meta, a Wikimedia project coordination 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.
function numberToSigndString(num) {
	if (num <= -10) {
		return String(num);
	} else if (num < 0) {
		return "-0" + String(-num);
	} else if (num < 10) {
		return "+0" + String(num);
	} else {
		return "+" + String(num);
	}
}

mw.hook("wikipage.content").add(function ($content) {
	/* Check if TZC is used by the page */
	var page = $content[0];
    var activator = page.querySelector('#tzc-timezoneconverter');
    if (activator === null) { return; }
    
    /* get timezone and locale */
	var timezonename = Intl.DateTimeFormat().resolvedOptions().timeZone;
	var timezoneoffset = numberToSigndString(-new Date().getTimezoneOffset()/60);
	var locale = Intl.DateTimeFormat().resolvedOptions().locale;
	
	/* Display timezone and locale */
    if (activator.querySelector('#tzc-enabled') !== null) {
	    activator.querySelector('#tzc-enabled').style.display = "";
    }
    if (activator.querySelector('#tzc-disabled') !== null) {
    	activator.querySelector('#tzc-disabled').style.display = "none";
    }
    
    /* Show timezone and local, both in activator-element as well as outside */
    page.querySelectorAll('.tzc-timezonename').forEach(function(element) {
    	element.innerText = timezonename;
    });
    page.querySelectorAll('.tzc-timezoneoffset').forEach(function(element) {
    	element.innerText = timezoneoffset;
    });
    page.querySelectorAll('.tzc-locale').forEach(function(element) {
    	element.innerText = locale;
    });
    
    var converter = function(event) {
    	var timestamp;
    	if (event.dataset.datetime !== undefined ) {
    		timestamp = event.dataset.datetime;
    	}
    	else if (event.dateTime !== undefined ) {
    		timestamp = event.dateTime;
    	}
    	else { return; }
		var date = new Date(Date.parse(timestamp));
		var localdate;
		if (event.classList.contains("tzc-timeonly")) {
			localdate = date.toLocaleTimeString();
		} else if (event.classList.contains("tzc-dateonly")) {
			localdate = date.toLocaleDateString();
		} else if (event.classList.contains("tzc-fulldate")) {
			localdate = date.toLocaleDateString([], {dateStyle: "full", weekday: "long"});
		} else if (event.classList.contains("tzc-daytime")) {
			localdate = date.toLocaleTimeString([], {weekday: "long"});
		} else if (event.classList.contains("tzc-dtime")) {
			localdate = date.toLocaleTimeString([], {weekday: "short"});
		} else if (event.classList.contains("tzc-houronly")) {
			localdate = date.toLocaleTimeString([], {hour: "numeric"});
		} else {
			localdate = date.toLocaleString();
		}
		/* remove seconds if zero */
		if (localdate.slice(-3) === ":00") {
			localdate = localdate.slice(0, -3);
		}
		event.innerText = localdate;
		event.title = date.toLocaleString([], {"timeZoneName": 'short'});
    };
    
    /* Search and convert dates */
    page.querySelectorAll('.tzc-event').forEach(converter);
    page.querySelectorAll('time').forEach(converter);
});