// ============================================================ // DASHBOARD - Variables & State // ============================================================ var ws = null; var gsGrid = null; var isLocked = false; var state = { connected: false, cameras: null, currentCamera: null, items: null, currentItem: null, events: null, currentEvent: null, avatars: null, currentAvatar: null, system: null }; var statusInterval = null; var pingInterval = null; var STORAGE_KEY = 'streamingle-dashboard-layout'; var currentTab = 'dashboard'; // ============================================================ // RETARGETING - Variables & State // ============================================================ var rtWs = null; var rtCharactersData = {}; var rtPresets = []; var rtConnected = false; var rtInitialized = false; // ============================================================ // TAB SWITCHING // ============================================================ function switchTab(tab) { currentTab = tab; // Toggle tab buttons document.getElementById('tabBtnDashboard').className = 'tab-btn' + (tab === 'dashboard' ? ' active' : ''); document.getElementById('tabBtnRetargeting').className = 'tab-btn' + (tab === 'retargeting' ? ' active' : ''); // Toggle tab content document.getElementById('tabDashboard').className = 'tab-content' + (tab === 'dashboard' ? ' active' : ''); document.getElementById('tabRetargeting').className = 'tab-content' + (tab === 'retargeting' ? ' active' : ''); // Toggle header controls document.getElementById('dashboardControls').style.display = (tab === 'dashboard') ? '' : 'none'; document.getElementById('retargetingControls').style.display = (tab === 'retargeting') ? '' : 'none'; // Lazy connect retargeting WS if (tab === 'retargeting' && !rtInitialized) { rtInitialized = true; rtConnectWebSocket(); } } // ============================================================ // DASHBOARD - Widget Definitions // ============================================================ var WIDGET_DEFS = { cameras: { title: 'Cameras', badgeId: 'camera-badge', defaultPos: { x: 0, y: 0, w: 6, h: 4, minW: 3, minH: 2 }, content: function() { return '
'; } }, items: { title: 'Items', badgeId: 'item-badge', defaultPos: { x: 6, y: 0, w: 6, h: 4, minW: 3, minH: 2 }, content: function() { return '' + '