Widget:LocalTimeHelper

From Granblue Fantasy Wiki
Jump to navigation Jump to search

This has been moved to Mediawiki:Common.js.

<script type="application/javascript">
// Widget:LocalTimeHelper
;(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();
	}
})();
</script>