/** * Connection page — connect form with localStorage persistence. */ function ConnectPage(params, container) { var html = '
' + '
' + '
' + '

Connect

' + '' + '

Enter the address (including rcon port) and the rcon password below to connect.

' + '
' + '
' + '' + '' + '
' + '
' + '' + '' + '
' + '
' + '' + '' + '
' + '' + '
' + '
' + '
' + '
' + '
' + '
' + '
'; container.innerHTML = html; var addrInput = document.getElementById('connection-address'); var passInput = document.getElementById('connection-password'); var saveCheck = document.getElementById('connection-save'); var errorDiv = document.getElementById('connect-error'); var savedDiv = document.getElementById('saved-connections'); var connectionsLimit = 5; function loadConnections() { try { return JSON.parse(localStorage.previousConnections || '[]'); } catch (e) { return []; } } function saveConnections(conns) { localStorage.previousConnections = JSON.stringify(conns); } function showError(msg) { errorDiv.textContent = msg; errorDiv.style.display = 'block'; } function hideError() { errorDiv.style.display = 'none'; } function addConnection(addr, pass) { var conns = loadConnections(); conns = conns.filter(function (c) { return c.Address !== addr; }); conns.push({ Address: addr, Password: pass, date: new Date().toISOString() }); saveConnections(conns); } function doConnect(addr, pass) { hideError(); Rcon.connect(addr, pass); } function renderSaved() { var conns = loadConnections(); if (conns.length === 0) { savedDiv.innerHTML = ''; return; } var display = conns.slice().reverse(); var shown = connectionsLimit || display.length; var h = '

Saved Connections

'; if (conns.length > 5) { h += ''; } savedDiv.innerHTML = h; var links = savedDiv.querySelectorAll('.saved-conn'); for (var j = 0; j < links.length; j++) { links[j].addEventListener('click', function (e) { e.preventDefault(); doConnect(this.dataset.addr, this.dataset.pass); }); } var toggle = document.getElementById('toggle-conn-limit'); if (toggle) { toggle.addEventListener('click', function () { connectionsLimit = connectionsLimit ? undefined : 5; renderSaved(); }); } } document.getElementById('connect-form').addEventListener('submit', function (e) { e.preventDefault(); var addr = addrInput.value.trim(); var pass = passInput.value.trim(); if (!addr || !pass) return; if (saveCheck.checked) addConnection(addr, pass); doConnect(addr, pass); }); function onConnected() { // Navigation handled by app.js — don't set hash here } function onDisconnected(ev) { showError('Connection was closed — Error ' + (ev ? ev.code : 'unknown')); } Rcon.on('connected', onConnected); Rcon.on('disconnected', onDisconnected); renderSaved(); // Auto-connect from URL — check hash for address and password var hash = window.location.hash; var pwMatch = hash.match(/[?&]password=([^&]+)/); if (pwMatch) { passInput.value = decodeURIComponent(pwMatch[1]); window.location.hash = hash.replace(/[?&]password=[^&]+/, ''); } var addrMatch = hash.match(/^#\/([^/]+)\//); if (addrMatch) addrInput.value = addrMatch[1]; if (addrInput.value && passInput.value) { if (saveCheck.checked) addConnection(addrInput.value.trim(), passInput.value.trim()); doConnect(addrInput.value.trim(), passInput.value.trim()); } return function cleanup() { Rcon.off('connected', onConnected); Rcon.off('disconnected', onDisconnected); }; }