/**
* 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
';
for (var i = 0; i < Math.min(shown, display.length); i++) {
var c = display[i];
h += '- ' + c.Address + ' — ' + new Date(c.date).toLocaleString() + '
';
}
h += '
';
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() {
window.location.hash = '#/' + Rcon.getAddress() + '/info';
}
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);
};
}