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(