function setMode(mode) { const voucherMode = document.getElementById('voucher-mode'); const memberMode = document.getElementById('member-mode'); const voucherTab = document.querySelector('.tab-btn:nth-child(1)'); const memberTab = document.querySelector('.tab-btn:nth-child(2)'); const form = document.login; if (mode === 'voucher') { voucherMode.classList.remove('hidden'); memberMode.classList.add('hidden'); voucherTab.classList.add('active'); memberTab.classList.remove('active'); // Sync to form immediately if (form) { const code = document.getElementById('voucher-input').value; form.username.value = code; form.password.value = document.getElementById('voucher-pass').value || code; } } else { voucherMode.classList.add('hidden'); memberMode.classList.remove('hidden'); voucherTab.classList.remove('active'); memberTab.classList.add('active'); // Sync to form immediately if (form) { form.username.value = document.getElementById('member-user').value; form.password.value = document.getElementById('member-pass').value; } } // Update login button text based on mode const loginBtn = document.getElementById('login-btn'); if (loginBtn) { const lang = localStorage.getItem('twinpath_lang') || 'en'; const key = mode === 'voucher' ? 'login_voucher' : 'login_member'; loginBtn.setAttribute('data-i18n', key); if (typeof translations !== 'undefined' && translations[lang] && translations[lang][key]) { loginBtn.innerText = translations[lang][key]; } } } function doLogin() { const form = document.login; const mode = document.querySelector('.tab-btn.active').innerText.toLowerCase(); // Sync inputs based on mode if (mode === 'voucher') { const code = document.getElementById('voucher-input').value; form.username.value = code; form.password.value = code; // Voucher usually uses same code for user/pass or just user with empty pass (depends on config) // Note: Check your hotspot config. Often Vouchers are "Username = Password" } else { form.username.value = document.getElementById('member-user').value; form.password.value = document.getElementById('member-pass').value; } // Handle CHAP security if available // Note: This relies on variables injected by TwinpathNet (Mikrotik) into the HTML/JS context // We assume 'hexMD5' is available from md5.js /* TwinpathNet usually puts this logic in the