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.