273: document.addEventListener('DOMContentLoaded', function(){ 274: document.querySelectorAll('.overlay,.lkModal,.cpModal,#streamModalV3').forEach(prep); 277: root.addEventListener('dblclick', function(ev){ 287: document.addEventListener('keydown', function(ev){ 289: const open = Array.from(document.querySelectorAll('.overlay.show,.lkModal.show,.cpModal.show,#streamModalV3.show,[aria-hidden="false"].overlay,[aria-hidden="false"].lkModal,[aria-hidden="false"].cpModal,[aria-hidden="false"]#streamModalV3')); 301: function qq(sel, root){ return Array.prototype.slice.call((root || document).querySelectorAll(sel)); } 336: modal.innerHTML = [ 350: q('cpOverlayHardModalClose').addEventListener('click', function(ev){ 356: modal.querySelector('[data-close-overlay-modal="1"]').addEventListener('click', function(ev){ 362: document.addEventListener('keydown', function(ev){ 397: var el = document.querySelector(selectors[j]); 466: mount.innerHTML = ''; 508: mount.innerHTML = ''; 535: el.addEventListener('click', opener, true); 536: el.addEventListener('dblclick', opener, true); 539: document.addEventListener('dblclick', function(ev){ 553: document.querySelector('.overlay-composer'), 554: document.querySelector('.graphics-composer') 576: function boot(){ 593: document.addEventListener('DOMContentLoaded', boot, {once:true}); 595: boot(); 661: document.addEventListener('DOMContentLoaded', function(){ 662: document.querySelectorAll('.overlay,.lkModal,.cpModal,#streamModalV3').forEach(prep); 663: document.addEventListener('keydown', function(ev){ 665: const open = Array.from(document.querySelectorAll('.overlay.show,.lkModal.show,.cpModal.show,#streamModalV3.show,[aria-hidden="false"].overlay,[aria-hidden="false"].lkModal,[aria-hidden="false"].cpModal,[aria-hidden="false"]#streamModalV3')); 677: function qq(sel, root){ return Array.prototype.slice.call((root || document).querySelectorAll(sel)); } 712: modal.innerHTML = [ 726: q('cpOverlayHardModalClose').addEventListener('click', function(ev){ 732: modal.querySelector('[data-close-overlay-modal="1"]').addEventListener('click', function(ev){ 738: document.addEventListener('keydown', function(ev){ 773: var el = document.querySelector(selectors[j]); 842: mount.innerHTML = ''; 884: mount.innerHTML = ''; 911: el.addEventListener('click', opener, true); 912: el.addEventListener('dblclick', opener, true); 915: document.addEventListener('dblclick', function(ev){ 929: document.querySelector('.overlay-composer'), 930: document.querySelector('.graphics-composer') 952: function boot(){ 969: document.addEventListener('DOMContentLoaded', boot, {once:true}); 971: boot(); 1187: if (!document.querySelector('.overlay.show,.lkModal.show,.cpModal.show,#streamModalV3.show,[aria-hidden="false"].overlay,[aria-hidden="false"].lkModal,[aria-hidden="false"].cpModal,[aria-hidden="false"]#streamModalV3')) { 1195: root.addEventListener('click', function(ev){ if (ev.target === root) closeFn ? closeFn() : w.__modalHide(root); }); 1223: root.innerHTML = 1236: const x = root.querySelector('.lkModal__x'); 1237: if (x && !x.__boundClose){ x.__boundClose = true; x.addEventListener('click', close); } 1238: root.querySelector('.lkModal__ttl').textContent = title; 1239: const body = root.querySelector('.lkModal__body'); 1240: body.innerHTML = html; 1273: const wrap = document.querySelector(".wrap"); 1811: if (Number.isFinite(n)) maxSeq = Math.max(maxSeq, n); 1814: try{ renderMediaThumbs(); }catch(_){} 1815: try{ renderUI(); }catch(_){} 1844: if (Number.isFinite(n)) maxSeq = Math.max(maxSeq, n); 1920:const tabBtns = Array.from(document.querySelectorAll(".tabBtn")); 2039: if (!isFinite(n)) return fallback; 2067: const v = container.querySelector("video"); 2120: const $ = (id)=>root.querySelector("#"+id); 2156: [fitEl, zoomEl, xEl, yEl].forEach(el=>el.addEventListener("input", applyAndSave)); 2157: [zoomN, xN, yN].forEach(el=>el.addEventListener("change", syncFromNumber)); 2159: root.querySelector("#gf_reset").addEventListener("click", ()=>{ 2223: b.onclick = () => selectPreviewBySlot(i); 2227:qaPreview.onclick = ()=>{ /* wired by TAKE/preview system */ }; 2228:qaRecord.onclick = ()=>{ /* wired later */ }; 2229:if (qaStream) qaStream.onclick = ()=>{ openStreamModal(); }; 2230:{ const __btnRecord = document.getElementById("btnRecord"); if (__btnRecord && qaRecord) __btnRecord.onclick = ()=>qaRecord.click(); } 2231:{ const __btnStream = document.getElementById("btnStream"); if (__btnStream) __btnStream.onclick = ()=>{ openStreamModal(); }; } 2237: btn.addEventListener("click", ()=>{ 2247: window.GuestStudio.init({ 2261: window.renderGuestStudio = function(){ return window.GuestStudio.render(); }; 2299:if (btnSkin) btnSkin.onclick = openSkin; 2328: btnSaveSkin.onclick = async ()=>{ 2341: btnResetSkin.onclick = async ()=>{ 2358:if (btnCloseSkin) btnCloseSkin.onclick = closeSkin; 2359:if (skinOverlay) skinOverlay.addEventListener("click",(e)=>{ 2362:document.addEventListener("keydown",(e)=>{ 2370: tBody.innerHTML = ""; 2390: input.oninput = ()=>{ 2475:window.addEventListener("resize", applyFit); 2552:window.addEventListener("beforeunload", ()=>{ 2558:window.addEventListener("pagehide", ()=>{ 2564:document.addEventListener("visibilitychange", ()=>{ 2724: renderUI(); 2814: renderUI(); 2918:function renderUI(){ 2920: guestsList.innerHTML = ""; 2927: scr.innerHTML = `
${slotConnState(s)}
`; 2940: info.innerHTML = `
${name}
${pills.join("")}
`; 2948: camBtn.innerHTML = `${svgIcon("cam")}`; 2950: camBtn.onclick = () => toggleCamPreview(s.idx); 2955: micBtn.innerHTML = `${svgIcon("mic")}`; 2957: micBtn.onclick = () => toggleMicMonitor(s.idx); 2962: cueBtn.innerHTML = `${svgIcon("bell")}`; 2964: cueBtn.onclick = () => toggleCue(s.idx); 2974: rMicBtn.innerHTML = `${svgIcon("mic")}`; 2976: rMicBtn.onclick = ()=>{ 2982: renderUI(); 2988: rCamBtn.innerHTML = `${svgIcon("cam")}`; 2990: rCamBtn.onclick = ()=>{ 2995: renderUI(); 3020: window.renderGuestStudio(); 3022: window.GuestStudio.render(); 3034: stripRow.innerHTML = ""; 3039: div.innerHTML = ` 3063: st.fader.oninput = () => { 3111: renderUI(); 3125: renderUI(); 3131: renderUI(); 3155: renderUI(); // update active cue button 3163: previewScreen.querySelectorAll("video,img,iframe,div._ph,div._pvholder,audio").forEach(n => n.remove()); 3266: onAirScreen.querySelectorAll("div._ph").forEach(n=>n.remove()); 3277: let holder = onAirScreen.querySelector("#"+holderId); 3285: holder.innerHTML = ""; 3305:fileInput.addEventListener("change", async ()=>{ 3334: renderMediaThumbs(); 3367: renderMediaThumbs(); 3368: renderUI(); 3376: renderMediaThumbs(); 3377: renderUI(); 3431: renderMediaThumbs(); 3432: renderUI(); 3443: btnRemoveMedia.onclick = ()=> { 3448: btnClearMedia.onclick = ()=> clearAllMedia(); 3526: meta.innerHTML = `
${cfg.title}
${cfg.sub}
`; 3537: el.addEventListener("click", openNow, true); 3538: el.addEventListener("dblclick", openNow, true); 3539: el.addEventListener("keydown", (ev)=>{ 3546:function renderMediaThumbs(){ 3547: thumbs.innerHTML = ""; 3563: pv.innerHTML = ""; 3575: rm.onclick = (ev)=>{ ev.stopPropagation(); removeMediaById(item.id); }; 3580: meta.innerHTML = `
${item.name}
${item.kind}
`; 3721: const mediaEl = document.querySelector('#onAirScreen video, #__programRoot video, #previewScreen video'); 3727: const onAirVid = document.querySelector("#onAirScreen video") || document.querySelector("#__programRoot video"); 3731: const prevVid = document.querySelector("#previewScreen video"); 3874: const lbl = container.querySelector(".scrLabel"); 3875: container.innerHTML = ""; 3890: container.innerHTML = '
NO VIDEO
'; 4055: renderUI(); 4074: renderUI(); 4130: renderUI(); 4168: renderUI(); 4192: renderUI(); 4212: renderUI(); 4229: renderUI(); 4248: renderUI(); 4427: meta.innerHTML = `
${def.name}
${def.kind}
`; 4441: el.addEventListener("dblclick", (ev)=>{ 4448: el.addEventListener("contextmenu", (ev)=>{ 4456: el.addEventListener("click", (ev)=>{ 4491: fxTransitions.innerHTML = ""; 4509: fxOverlays.innerHTML = ""; 4529: fxVirtuals.innerHTML = ""; 4553:fxModal.innerHTML = ` 4572:mediaModal.innerHTML = ` 4586:const mediaTitle = mediaModal.querySelector("#mediaTitle"); 4587:const mediaBody = mediaModal.querySelector("#mediaBody"); 4588:const mediaClose = mediaModal.querySelector("#mediaClose"); 4589:const mediaSave = mediaModal.querySelector("#mediaSave"); 4592:mediaClose.onclick = ()=> closeMediaModal(); 4593:mediaModal.addEventListener("click",(e)=>{ if (e.target === mediaModal) closeMediaModal(); }); 4630: rng.oninput = fmt; fmt(); 4649:mediaSave.onclick = ()=>{ 4652: const els = mediaBody.querySelectorAll("input, select, textarea"); 4725: renderStreamLog(); 4843:streamModal.innerHTML = ` 4901:const streamClose = streamModal.querySelector("#streamClose"); 4902:const streamEndpoint = streamModal.querySelector("#streamEndpoint"); 4903:const streamToken = streamModal.querySelector("#streamToken"); 4904:const streamSaveCfg = streamModal.querySelector("#streamSaveCfg"); 4905:const streamTimeout = streamModal.querySelector("#streamTimeout"); 4906:const streamPoll = streamModal.querySelector("#streamPoll"); 4907:const streamAdd = streamModal.querySelector("#streamAdd"); 4908:const streamStartEnabled = streamModal.querySelector("#streamStartEnabled"); 4909:const streamStopAll = streamModal.querySelector("#streamStopAll"); 4910:const streamList = streamModal.querySelector("#streamList"); 4911:const streamRoomBadge = streamModal.querySelector("#streamRoomBadge"); 4912:const streamLogEl = streamModal.querySelector("#streamLog"); 4913:const streamCopyLog = streamModal.querySelector("#streamCopyLog"); 4914:const streamClearLog = streamModal.querySelector("#streamClearLog"); 4916:streamClose.onclick = ()=> closeStreamModal(); 4917:streamModal.addEventListener("click",(e)=>{ if (e.target === streamModal) closeStreamModal(); }); 4918:document.addEventListener("keydown",(e)=>{ if (e.key === "Escape" && streamModal.classList.contains("show")) closeStreamModal(); }); 4932:streamSaveCfg.onclick = ()=>{ 4945:streamAdd.onclick = ()=>{ 4955: renderStreamList(); 4958:streamCopyLog.onclick = async ()=>{ 4967:streamClearLog.onclick = ()=>{ 4970: renderStreamLog(); 4973:function renderStreamLog(){ 5035:function renderStreamList(statusMap){ 5036: streamList.innerHTML = ""; 5048: if (html != null) el.innerHTML = html; 5063: left.innerHTML = ` 5073: mid.innerHTML = ` 5085: btns.innerHTML = ` 5097: row.addEventListener("change",(e)=>{ 5107: row.addEventListener("click", async (e)=>{ 5125: renderStreamList(statusMap); 5133: renderStreamList(statusMap); 5153:streamStartEnabled.onclick = async ()=>{ 5175:streamStopAll.onclick = async ()=>{ 5192: renderStreamList({}); 5204: renderStreamList(map); 5233:const fxTitle = fxModal.querySelector("#fxTitle"); 5234:const fxBody = fxModal.querySelector("#fxBody"); 5235:const fxClose = fxModal.querySelector("#fxClose"); 5236:const fxSave = fxModal.querySelector("#fxSave"); 5240:fxClose.onclick = ()=>closeFxModal(); 5241:fxModal.addEventListener("click",(e)=>{ if (e.target === fxModal) closeFxModal(); }); 5276: rng.oninput = fmt; fmt(); 5335: const els = fxBody.querySelectorAll("input, select, textarea"); 5346:fxSave.onclick = ()=>{ 5505: btnGuides.addEventListener("click", toggleGuides); 5507:if (btnGuidesSettings) btnGuidesSettings.addEventListener("click", openGuidesSettings); 5508:document.addEventListener("click", (ev)=>{ 5516:document.addEventListener("change", (ev)=>{ 5525:document.addEventListener("keydown", (ev)=>{ 5531: btnMonitor.addEventListener("click", ()=>{ 5544: let root = onAirScreen.querySelector("#__programRoot"); 5701: const prevStage = root.querySelector(".programStage"); 5720: renderSnapshotInto(newStage, { 5757: btnTake.onclick = ()=> takeToProgram(); 5764: el.querySelectorAll("video,audio").forEach(m=>{ 5770: el.innerHTML = ""; 5849: v.addEventListener("loadedmetadata", ()=>{ 5859: v.addEventListener("timeupdate", ()=>{ 5877: v.addEventListener("timeupdate", ()=>{ 5917: a.addEventListener("loadedmetadata", ()=>{ 5926: a.addEventListener("timeupdate", ()=>{ 5997:function renderVirtual(stage, baseSrc, isPreview, layoutId, layoutSettings){ 6117:function renderOverlays(layer, overlaysEnabled, overlaysSettings){ 6119: layer.innerHTML = ""; 6170: d.innerHTML = `${escapeHtml(t)}${escapeHtml(sub)}`; 6179: d.innerHTML = `
${escapeHtml(txt)}
`; 6323: const stage = previewScreen ? previewScreen.querySelector(".mixStage") : null; 6324: const cvs = stage ? stage.querySelector("canvas.guidesCanvas") : null; 6346:function renderSnapshotInto(container, snap, isPreview, withGuides){ 6358: renderVirtual(stage, src, isPreview, virtualId, vset); 6370: renderOverlays(ovs, snap ? snap.overlaysEnabled : null, snap ? snap.overlaysSettings : null); 6385: const stage = previewScreen ? previewScreen.querySelector(".mixStage") : null; 6387: const ovs = stage.querySelector(".mixOverlays"); 6390: renderOverlays(ovs, snap.overlaysEnabled, snap.overlaysSettings); 6396: const stage = root ? root.querySelector(".mixStage") : null; 6398: const ovs = stage.querySelector(".mixOverlays"); 6400: renderOverlays(ovs, fxState.overlays.enabled, fxState.overlays.settings); 6406: const stage = root ? root.querySelector(".programStage") : null; 6409: renderSnapshotInto(stage, { 6431: renderSnapshotInto(previewScreen, getPreviewSnapshot(true), true, guidesOn); 6457: onAirScreen.querySelectorAll("div._ph").forEach(n=>n.remove()); 6460: let holder = onAirScreen.querySelector("#"+holderId); 6468: holder.innerHTML = ""; 6493:renderMediaThumbs(); 6507: let stage = root.querySelector('.programStage'); 6515: renderSnapshotInto(stage, { 6672: function bindBackdrop(id){ var el=q(id); if(!el || el.__lateBound) return; el.__lateBound=true; el.addEventListener('click', function(ev){ if(ev.target===el) hide(el); }); } 6673: function boot(){ 6678: if(btnOpenMediaStudio && !btnOpenMediaStudio.__bound && typeof window.openMediaStudioLauncher === 'function'){ btnOpenMediaStudio.__bound=true; btnOpenMediaStudio.addEventListener('click', window.openMediaStudioLauncher, true); } 6680: if(btnOpenVirtualStudio && !btnOpenVirtualStudio.__bound && typeof window.openVirtualStudioLauncher === 'function'){ btnOpenVirtualStudio.__bound=true; btnOpenVirtualStudio.addEventListener('click', window.openVirtualStudioLauncher, true); } 6682: if(btnOpenTransitionStudio && !btnOpenTransitionStudio.__bound && typeof window.openTransitionStudioLauncher === 'function'){ btnOpenTransitionStudio.__bound=true; btnOpenTransitionStudio.addEventListener('click', window.openTransitionStudioLauncher, true); } 6687: if(btnGc && !btnGc.__lateCloseBound){ btnGc.__lateCloseBound=true; btnGc.addEventListener('click', function(ev){ ev.preventDefault(); ev.stopPropagation(); hide('guidesModal'); }, true); } 6689: if(btnGsav && !btnGsav.__lateSaveBound){ btnGsav.__lateSaveBound=true; btnGsav.addEventListener('click', function(ev){ ev.preventDefault(); ev.stopPropagation(); if (typeof window.saveGuidesFromPanel === 'function') window.saveGuidesFromPanel(); else hide('guidesModal'); }, true); } 6691: if(btnGres && !btnGres.__lateResetBound){ btnGres.__lateResetBound=true; btnGres.addEventListener('click', function(ev){ ev.preventDefault(); ev.stopPropagation(); if (typeof window.resetGuidesPanel === 'function') window.resetGuidesPanel(); }, true); } 6695: if(fxClose && !fxClose.__lateBound){ fxClose.__lateBound=true; fxClose.addEventListener('click', function(ev){ ev.preventDefault(); ev.stopPropagation(); hide(fx); }, true); } 6712: var nameEl = el.querySelector('.name,b,.thumbName,.thumbMeta b'); 6717: root.addEventListener('contextmenu', function(ev){ 6720: root.addEventListener('dblclick', function(ev){ 6723: root.addEventListener('click', function(ev){ 6738: var close = oc.querySelector('.ocClose,[data-close="overlay-composer"],.close,button[aria-label="Close"]'); 6739: if(close && !close.__lateBound){ close.__lateBound=true; close.addEventListener('click', function(ev){ ev.preventDefault(); ev.stopPropagation(); hide(oc); }, true); } 6742: document.addEventListener('keydown', function(ev){ 6747: if(document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot, {once:true}); else boot(); 6752: var nodes = document.querySelectorAll('#btnGuidesSettings'); 6758: if(document.readyState === 'loading') document.addEventListener('DOMContentLoaded', dedupeGuidesSettingsButton, {once:true}); 6819: var open = document.querySelectorAll(