(() => { // ========================= // Safe embed/iframe wrapper // ========================= const eventIframe = document.getElementById('eventIframe'); const iframeSection = document.getElementById('event-iframe-section'); if (!eventIframe || !eventIframe.parentElement) return; const pt = eventIframe.parentElement; // Styling hardening (keep your existing behavior) if (iframeSection) iframeSection.style.minHeight = '1px'; eventIframe.style.minHeight = '1px'; eventIframe.style.overflow = 'hidden'; pt.style.overflow = 'hidden'; // Heights let qH = 0; // These are extracted from injected HTML scripts (evJSFromHtml) let srv = ''; let mpath = ''; let mque = ''; // Unload guard let unloadCalled = false; // Throttle setHeight calls let heightRaf = 0; function requestSetHeight() { if (heightRaf) return; heightRaf = requestAnimationFrame(() => { heightRaf = 0; setHeight(); }); } function toSafeInt(value, fallback = 0) { const n = Number(value); return Number.isFinite(n) ? Math.trunc(n) : fallback; } function removeOverflow() { const topWrapper = document.getElementById('top-wrapper'); if (!topWrapper) return; const flHtml = topWrapper.closest('.fl-html'); if (flHtml) { flHtml.style.overflow = 'visible'; topWrapper.classList.add('content-shown'); console.log('Overflow set to visible on .fl-html parent!'); } else { console.error('.fl-html parent not found for #top-wrapper.'); } } function setIframeHeight(len) { const safeLen = toSafeInt(len, 0); console.log('setting height:' + safeLen); pt.style.height = safeLen + 'px'; console.log('pt hight:' + pt.style.height); } function setQa(len) { const qaElem = document.getElementById('qa'); if (!qaElem) return; const safeLen = toSafeInt(len, 0); qaElem.style.height = safeLen + 'px'; qaElem.style.minHeight = safeLen + 'px'; } function setHeight() { const playerWrapperDiv = document.getElementById('playerWrapperDiv'); const playerWrapper = document.getElementById('playerWrapper'); if (playerWrapperDiv) { const playerH = playerWrapperDiv.clientWidth * 0.5625; console.log('playerWrapper height::' + playerH); if (playerH) removeOverflow(); if (playerWrapperDiv.children[0]) { playerWrapperDiv.children[0].style.height = playerH + 'px'; } const iframe = playerWrapper?.getElementsByTagName('iframe')?.[0]; if (iframe) iframe.height = playerH; const headerTextDiv = document.getElementById('headerTextDiv'); const headerH = headerTextDiv ? headerTextDiv.clientHeight : 0; const heightToSet = toSafeInt(playerH) + toSafeInt(headerH) + toSafeInt(qH); setIframeHeight(heightToSet); setQa(qH); return; } if (!playerWrapperDiv && playerWrapper) { const playerH = playerWrapper.clientWidth * 0.5625; console.log('.playerWrapper height:' + playerH); if (playerH) removeOverflow(); if (playerWrapper.children[0]) { playerWrapper.children[0].style.height = playerH + 'px'; } const headerHeight = document.getElementById('headerWrapper')?.clientHeight || 0; const subheaderHeight = document.getElementById('subheaderWrapper')?.clientHeight || 0; console.log('header Height:' + headerHeight); console.log('subheaderHeight Height:' + subheaderHeight); console.log('qH :' + qH); const heightToSet = toSafeInt(playerH) + toSafeInt(headerHeight) + toSafeInt(subheaderHeight) + toSafeInt(qH) + 5; console.log('total:' + heightToSet); setIframeHeight(heightToSet); setQa(qH); if (heightToSet === 0) { setTimeout(() => requestSetHeight(), 1000); } } } function extractBetween(haystack, startToken, endToken) { const s = haystack.indexOf(startToken); if (s < 0) return ''; const e = haystack.indexOf(endToken, s + startToken.length); if (e < 0) return ''; return haystack.substring(s + startToken.length, e); } function isBadToken(str) { if (!str) return true; if (str.includes('NaN')) return true; if (str.includes('undefined') || str.includes('null')) return true; if (str.includes('NONE AVAILABLE IN ITEMS')) return true; return false; } function evJSFromHtml(html) { const newElement = document.createElement('div'); newElement.innerHTML = html; const scripts = newElement.getElementsByTagName('script'); for (let i = 0; i < scripts.length; i++) { const inner = scripts[i].innerHTML || ''; const tempSrv = extractBetween(inner, 'srv="', '";'); const tempMpath = extractBetween(inner, "mpath = '", "';"); const tempMque = extractBetween(inner, "mque = '", "';"); // Only accept good values; never overwrite with garbage if (!isBadToken(tempSrv) && !isBadToken(tempMpath) && !isBadToken(tempMque)) { srv = tempSrv; mpath = tempMpath; mque = tempMque; } } } // ========================= // Beacon safety // ========================= function isBadBeaconUrl(url) { if (!url) return true; if (url.includes('/NaN&statusCode=')) return true; // exact outage signature if (url.includes('NaN')) return true; // general NaN block if (url.includes('undefined') || url.includes('null')) return true; if (url.includes('NONE%20AVAILABLE%20IN%20ITEMS') || url.includes('NONE AVAILABLE IN ITEMS')) return true; return false; } function buildBeaconUrl(statusCode) { if (isBadToken(srv) || isBadToken(mpath) || isBadToken(mque)) return null; const code = toSafeInt(statusCode, 0); if (!code) return null; const url = srv + mpath + mque + '&statusCode=' + code; return isBadBeaconUrl(url) ? null : url; } function safeSendBeacon(statusCode) { const url = buildBeaconUrl(statusCode); if (!url) return; // sendBeacon uses POST (expected) if (navigator.sendBeacon) { navigator.sendBeacon(url); return; } // Fallback: GET; do NOT mutate mque try { const request = new XMLHttpRequest(); request.open('GET', url, true); request.send(null); } catch (_) { // ignore } } // ========================= // Events // ========================= window.addEventListener('message', (event) => { if (event.origin !== 'https://media.rampard.net') return; if (typeof event.data !== 'string') return; if (event.data.startsWith('setHeightAll')) { const heightAll = toSafeInt(event.data.substring(12), 0); pt.style.height = heightAll + 'px'; console.log('set height all:' + heightAll); } else if (event.data.startsWith('setHeight')) { qH = toSafeInt(event.data.substring(9), 0); console.log('received qH:' + qH); } else if (!event.data.includes('nuanria_messaging')) { pt.innerHTML = event.data; evJSFromHtml(event.data); } console.log('-setHeight->'); requestSetHeight(); }); window.addEventListener('resize', () => { requestSetHeight(); }); // visibilitychange is intentionally disabled to reduce beacon amplification risk /* window.addEventListener('visibilitychange', function () { if (unloadCalled) return; if (document.visibilityState === 'hidden') { safeSendBeacon(41); } else { safeSendBeacon(33); } }); */ window.addEventListener('beforeunload', function () { unloadCalled = true; safeSendBeacon(40); }); })();