MediaWiki:Common.js: Difference between revisions

From NOISZ Wiki
(Created page with "→‎Any JavaScript here will be loaded for all users on every page load.: →‎This is for the countdown timers: (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; };...")
 
Tag: Replaced
 
Line 1: Line 1:
/* Any JavaScript here will be loaded for all users on every page load. */
/* Any JavaScript here will be loaded for all users on every page load. */
/* This is for the countdown timers */
(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();
  }
})();

Latest revision as of 17:10, 23 November 2025

/* Any JavaScript here will be loaded for all users on every page load. */