PageSourceSearch

https://meteozentrale.de/wp-content/themes/meteozentrale-lagezentr…/skyguard-livebild.js?ver=1786898110

js meteozentrale.de collected 2026-10-02 17:51:19 UTC 5,792 bytes, 162 lines download raw bytes

1(function () {
2  'use strict';
3
4  var config = window.MZSGLB_CONFIG || {};
5  var roots = document.querySelectorAll('[data-mzsglb-root]');
6  if (!roots.length || !config.restUrl) return;
7
8  function init(root) {
9    var loading = false;
10    var lastLoadAt = Date.now();
11
12    function $(sel) { return root.querySelector(sel); }
13
14    function text(sel, value) {
15      var el = $(sel);
16      if (el) el.textContent = value == null ? '' : String(value);
17    }
18
19    function updateTags(tags) {
20      var box = $('[data-mzsglb-tags]');
21      if (!box) return;
22      box.innerHTML = '';
23      if (!Array.isArray(tags) || !tags.length) tags = ['Radar aktiv'];
24      tags.slice(0, 5).forEach(function (tag) {
25        var span = document.createElement('span');
26        span.textContent = tag;
27        box.appendChild(span);
28      });
29    }
30
31    function uniqueUrls(urls) {
32      var out = [];
33      (urls || []).forEach(function (url) {
34        if (typeof url !== 'string') return;
35        url = url.trim();
36        if (url && out.indexOf(url) === -1) out.push(url);
37      });
38      return out;
39    }
40
41    function withCacheBuster(url) {
42      if (!url || url.indexOf('data:image/') === 0) return url;
43      var separator = url.indexOf('?') === -1 ? '?' : '&';
44      return url + separator + 'mzsglb_live=' + Date.now();
45    }
46
47    function setImage(data) {
48      var img = $('[data-mzsglb-image]');
49      if (!img) return;
50
51      var placeholder = img.getAttribute('data-mzsglb-placeholder') || '';
52      var candidates = uniqueUrls(data.image_candidates || []);
53      if (data.image_url) candidates.unshift(data.image_url);
54      candidates = uniqueUrls(candidates);
55
56      var idx = 0;
57      function tryNext() {
58        if (idx >= candidates.length) {
59          if (placeholder) {
60            img.classList.add('is-broken');
61            img.src = placeholder;
62          }
63          return;
64        }
65        var next = withCacheBuster(candidates[idx++]);
66        img.classList.remove('is-broken');
67        img.src = next;
68      }
69
70      img.onerror = tryNext;
71      img.onload = function () { img.classList.remove('is-broken'); };
72      tryNext();
73    }
74
75    function update(data) {
76      if (!data) return;
77
78      var levels = ['critical', 'flood', 'cells', 'lightning', 'warning', 'quiet', 'offline'];
79      levels.forEach(function (level) {
80        root.classList.remove('is-level-' + level);
81      });
82      var activeLevel = levels.indexOf(data.level) !== -1 ? data.level : (data.ok ? 'quiet' : 'offline');
83      root.classList.add('is-level-' + activeLevel);
84      root.setAttribute('data-mzsglb-level', activeLevel);
85      root.classList.toggle('is-stale', !!data.is_stale);
86      root.setAttribute('aria-busy', 'false');
87
88      setImage(data);
89
90      text('[data-mzsglb-status]', data.status_short || (data.ok ? 'LIVE · Radar aktiv' : 'Daten fehlen'));
91      text('[data-mzsglb-headline]', data.headline || 'SkyGuard Live');
92      text('[data-mzsglb-text]', data.text || '');
93      text('[data-mzsglb-time]', data.time_text || '—');
94      text('[data-mzsglb-updated]', data.updated_text || '');
95      text('[data-mzsglb-freshness-label]', data.freshness_label || (data.is_stale ? 'Daten verzögert' : 'Daten aktuell'));
96      text('[data-mzsglb-image-badge]', data.image_badge || ('Radar · ' + (data.time_text || '—')));
97
98      updateTags(data.tags || []);
99
100      var stats = data.stats || {};
101      text('[data-mzsglb-cells]', stats.cells != null ? stats.cells : '—');
102      text('[data-mzsglb-flashes]', stats.flashes != null ? stats.flashes : '—');
103      text('[data-mzsglb-warnings]', stats.warnings != null ? stats.warnings : '—');
104      text('[data-mzsglb-meso]', stats.mesocyclones != null ? stats.mesocyclones : '—');
105      text('[data-mzsglb-support]', stats.model_support != null ? stats.model_support : '—');
106
107      var signal = data.signal || {};
108      text('[data-mzsglb-signal]', signal.label || 'kein markantes Signal');
109      text('[data-mzsglb-signal-text]', signal.text || '');
110
111      var details = data.details || {};
112      text('[data-mzsglb-dbz]', details.dbz || '—');
113      text('[data-mzsglb-motion]', details.motion || '—');
114      text('[data-mzsglb-confidence]', details.confidence || '—');
115      text('[data-mzsglb-assessment]', details.assessment || '—');
116
117      window.MZ_HOME_SKYGUARD_DATA = data;
118      document.dispatchEvent(new CustomEvent('mz:skyguard-update', { detail: data }));
119    }
120
121    function load() {
122      if (loading) return;
123      loading = true;
124      lastLoadAt = Date.now();
125      root.classList.add('is-loading');
126      root.setAttribute('aria-busy', 'true');
127
128      var separator = config.restUrl.indexOf('?') === -1 ? '?' : '&';
129      var liveUrl = config.restUrl + separator + 'mzsglb_live=' + Date.now();
130      fetch(liveUrl, {
131        cache: 'no-store',
132        credentials: 'same-origin'
133      })
134        .then(function (r) { return r.ok ? r.json() : null; })
135        .then(update)
136        .catch(function () {})
137        .finally(function () {
138          loading = false;
139          root.classList.remove('is-loading');
140          root.setAttribute('aria-busy', 'false');
141        });
142    }
143
144    var seconds = parseInt(config.refreshSeconds || 60, 10);
145    seconds = Math.max(15, Math.min(300, seconds));
146    window.setInterval(load, seconds * 1000);
147
148    document.addEventListener('visibilitychange', function () {
149      if (!document.hidden && Date.now() - lastLoadAt >= seconds * 1000) load();
150    });
151
152    // Die bereits serverseitig gelesenen Daten versorgen Modul und Kurzlage.
153    // Erst das regulaere Intervall startet wieder einen WordPress-REST-Abruf.
154    if (config.initialData) {
155      update(config.initialData);
156    } else {
157      window.setTimeout(load, 250);
158    }
159  }
160
161  roots.forEach(init);
162})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.