document.addEventListener('keydown', function (e) { // Mac = Option, Windows/Linux = Alt const isOptionOrAlt = e.altKey || e.metaKey; if (isOptionOrAlt && e.shiftKey && e.key.toLowerCase() === 'f') { toggleFullscreen(); } }); function toggleFullscreen() { // If not in fullscreen → enter fullscreen if (!document.fullscreenElement) { document.documentElement.requestFullscreen() .catch(err => console.error("Fullscreen error:", err)); } // If already fullscreen → exit fullscreen else { document.exitFullscreen(); } } let messagePosArray = []; function displayMsg(type, msg) { const colors = ["#900000ff", "#00b200ff"]; if (type !== 0 && type !== 1) return; // idx is ALWAYS a valid non-negative index now const $div = $('
') .css({'border-color': colors[type]}) .text(msg); $('.msgDiv').append($div); // trigger entry animation setTimeout(() => { $div.addClass('show'); }, 200); setTimeout(() => { // First: set the transition properties $div.css({ 'transition': 'all 0.3s ease' }); // Next frame: apply the transform so the transition animates requestAnimationFrame(() => { $div.removeClass('show'); $div.css({ 'transform': 'scaleY(0) translateX(calc(100% + 40px))' }); }); }, 3000); // auto-remove setTimeout(() => { $div.remove(); }, 3500); } const text = document.getElementById('wsInfo'); const rect = document.getElementById('wsInfoRectangle'); let ws; let firstConnect = true; const RETRY_DELAY = 2000; // ms const urlAjaxNewWSToken = '/intern/scripts/ajax-create-ws-token.php'; async function fetchNewWSToken(freigabe) { try { const response = await fetch(urlAjaxNewWSToken, { method: "POST", headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, body: new URLSearchParams({ access: freigabe }) }); if (!response.ok) return null; const data = await response.json(); return data.success ? data.token : null; } catch (error) { console.error("Token fetch failed:", error); return null; } } async function startWebSocket() { console.log("Attempting WebSocket connection..."); let token; if (firstConnect) { token = window.WS_ACCESS_TOKEN; } else { token = await fetchNewWSToken('kampfrichter'); } if (!token) { console.error("No valid token available. Retrying..."); scheduleRetry(); return; } try { ws = new WebSocket(`wss://${window.location.hostname}/ws/?access=token&token=${token}`); } catch (err) { console.error("Malformed WebSocket URL", err); scheduleRetry(); return; } ws.onopen = () => { console.log("WebSocket connected!"); if (!firstConnect) { displayMsg(1, "Live Syncronisation wieder verfügbar"); } firstConnect = true; rect.innerHTML = ''; requestAnimationFrame(() => { text.style.opacity = 1; }); }; ws.onerror = (event) => { console.error("WebSocket error observed." + JSON.stringify(event)); }; ws.onclose = (event) => { displayMsg(0, "Live Syncronisation verloren"); firstConnect = false; rect.innerHTML = ''; requestAnimationFrame(() => { text.style.opacity = 1; }); scheduleRetry(); }; } function scheduleRetry() { console.log(`Retrying in ${RETRY_DELAY}ms...`); setTimeout(startWebSocket, RETRY_DELAY); } // Start the initial connection attempt safely startWebSocket(); $.fn.updateCurrentEdit = function() { return this.each(function() { const $input = $(this); const url = '/intern/scripts/kampfrichter/ajax/ajax-kampfrichter_currentedit.php'; if ($input.attr('data-person-id') === "0"){ $('