MediaWiki:Common.js: Unterschied zwischen den Versionen

Keine Bearbeitungszusammenfassung
Markierung: Manuelle Zurücksetzung
Keine Bearbeitungszusammenfassung
Zeile 1.138: Zeile 1.138:
     var intervalId = window.setInterval(updateTimer, 1000);
     var intervalId = window.setInterval(updateTimer, 1000);
   });
   });
})();
/* =========================================================
  ADOS XMAS: Timer-Bar & Snow (nur im Dezember)
  ========================================================= */
(function () {
  'use strict';
  // Nur im Browser, nicht im Parsoid/Server-Zeug
  if (typeof window === 'undefined' || typeof document === 'undefined') return;
  var now = new Date();
  // Nur im Dezember aktiv (Monat 11 = Dezember)
  if (now.getMonth() !== 11) {
    return;
  }
  // Wenn der Nutzer reduzierte Animationen bevorzugt → Schneefall aus
  var prefersReducedMotion = false;
  try {
    prefersReducedMotion = window.matchMedia &&
      window.matchMedia('(prefers-reduced-motion: reduce)').matches;
  } catch (e) {}
  /* -----------------------------
    1) Timer-Bar DOM sicherstellen
    ----------------------------- */
  function ensureTimerBarDom() {
    var bar = document.getElementById('ados-timer-bar');
    if (!bar) {
      bar = document.createElement('div');
      bar.id = 'ados-timer-bar';
      bar.innerHTML =
        '<div id="ados-timer-inner">' +
          '<span id="ados-timer-message"></span>' +
          '<span id="ados-timer-countdown"></span>' +
          '<button id="ados-timer-close" type="button" aria-label="Leiste schließen">×</button>' +
        '</div>';
      document.body.prepend(bar);
    }
    return bar;
  }
  /* -----------------------------
    2) Weihnachts-Timer initialisieren
    ----------------------------- */
  function initXmasTimer() {
    var bar = ensureTimerBarDom();
    var msgEl = document.getElementById('ados-timer-message');
    var cdEl  = document.getElementById('ados-timer-countdown');
    var close = document.getElementById('ados-timer-close');
    if (!bar || !msgEl || !cdEl) return;
    // Weihnachts-Design aktivieren
    bar.classList.add('ados-xmas');
    bar.style.display = 'block';
    document.body.classList.add('has-ados-timer');
    // Text
    msgEl.textContent = 'Frohe Feiertage vom ADOS-Wiki – genieße die Adventszeit mit einem guten Dram!';
    // Countdown bis Heiligabend (24.12. dieses Jahres)
    var target = new Date(now.getFullYear(), 11, 24, 0, 0, 0, 0);
    function updateCountdown() {
      var now2 = new Date();
      var diff = target - now2;
      if (diff <= 0) {
        cdEl.textContent = 'Heiligabend ist da ✨';
        return;
      }
      var days  = Math.floor(diff / (1000 * 60 * 60 * 24));
      var hours = Math.floor((diff / (1000 * 60 * 60)) % 24);
      cdEl.textContent = 'Noch ' + days + ' Tag' + (days !== 1 ? 'e' : '') +
                        ' und ' + hours + ' Std.';
    }
    updateCountdown();
    setInterval(updateCountdown, 60 * 1000); // jede Minute
    // Schließen-Button
    if (close) {
      close.addEventListener('click', function () {
        bar.style.display = 'none';
        document.body.classList.remove('has-ados-timer');
      });
    }
  }
  /* -----------------------------
    3) Schneefall-Effekt
    ----------------------------- */
  function initSnow() {
    if (prefersReducedMotion) return;
    // Optional: auf sehr kleinen Geräten deaktivieren
    if (window.innerWidth < 600) return;
    // Container anlegen
    var container = document.createElement('div');
    container.id = 'ados-snow';
    document.body.appendChild(container);
    var flakeChars = ['❄', '✻', '✼', '✥', '✶'];
    var flakeCount = 60; // dezent halten
    for (var i = 0; i < flakeCount; i++) {
      var flake = document.createElement('span');
      flake.className = 'ados-snowflake';
      flake.textContent = flakeChars[Math.floor(Math.random() * flakeChars.length)];
      // Zufällige Start-Parameter
      var startX = Math.random() * 100;          // vw
      var drift  = (Math.random() * 40) - 20;    // -20 bis +20 vw
      var dur    = 12 + Math.random() * 10;      // 12–22 Sekunden
      var delay  = Math.random() * 20;          // bis zu 20 Sekunden
      flake.style.left = startX + 'vw';
      flake.style.setProperty('--x-start', '0vw');
      flake.style.setProperty('--x-end', drift.toFixed(1) + 'vw');
      flake.style.animationDuration = dur.toFixed(1) + 's';
      flake.style.animationDelay = delay.toFixed(1) + 's';
      container.appendChild(flake);
    }
  }
  /* -----------------------------
    4) Init nach DOM-Ready
    ----------------------------- */
  function onReady(fn) {
    if (document.readyState === 'loading') {
      document.addEventListener('DOMContentLoaded', fn, { once: true });
    } else {
      fn();
    }
  }
  onReady(function () {
    initXmasTimer();
    initSnow();
  });
})();
})();