(function () { var STORAGE_KEY = 'upgrade_loan_saved_username'; var INVITE_KEY = 'upgrade_loan_invite_code'; function togglePassword(button) { var targetSelector = button.getAttribute('data-target'); if (!targetSelector) { return; } var input = document.querySelector(targetSelector); var icon = button.querySelector('i'); if (!input || !icon) { return; } var isPassword = input.getAttribute('type') === 'password'; input.setAttribute('type', isPassword ? 'text' : 'password'); icon.classList.toggle('fa-eye', !isPassword); icon.classList.toggle('fa-eye-slash', isPassword); } function initPasswordToggles() { document.querySelectorAll('.auth-toggle-pwd').forEach(function (button) { button.addEventListener('click', function () { togglePassword(button); }); }); } function initSavedUsername(inputSelector, rememberSelector) { var input = document.querySelector(inputSelector); var remember = document.querySelector(rememberSelector); if (!input || !remember) { return; } try { var saved = localStorage.getItem(STORAGE_KEY); if (saved) { input.value = saved; remember.checked = true; } } catch (error) { // Ignore storage errors in private mode. } } function persistSavedUsername(inputSelector, rememberSelector) { var input = document.querySelector(inputSelector); var remember = document.querySelector(rememberSelector); if (!input || !remember) { return; } try { if (remember.checked && input.value.trim()) { localStorage.setItem(STORAGE_KEY, input.value.trim()); } else { localStorage.removeItem(STORAGE_KEY); } } catch (error) { // Ignore storage errors in private mode. } } function saveInviteCode(code) { if (!code) { return; } try { sessionStorage.setItem(INVITE_KEY, String(code).trim()); } catch (error) { // Ignore. } } function readInviteCode() { var params = new URLSearchParams(window.location.search || ''); var fromUrl = params.get('inviteCode') || params.get('invita') || params.get('invite') || params.get('code'); if (fromUrl) { saveInviteCode(fromUrl); return String(fromUrl).trim(); } try { return (sessionStorage.getItem(INVITE_KEY) || '').trim(); } catch (error) { return ''; } } function applyInviteToInput(inputSelector) { var input = document.querySelector(inputSelector); if (!input) { return ''; } var code = readInviteCode(); if (code) { input.value = code; } return (input.value || '').trim(); } function applyCsrfToken(token) { if (!token) { return; } var meta = document.querySelector('meta[name="csrf-token"]'); if (meta) { meta.setAttribute('content', token); } document.querySelectorAll('input[name="_token"]').forEach(function (input) { input.value = token; }); } function csrfTokenUrl() { var meta = document.querySelector('meta[name="csrf-token-url"]') || document.querySelector('meta[name="csrf-token-url"]'); return meta ? meta.getAttribute('content') : '/csrf-token'; } function refreshCsrfToken() { return fetch(csrfTokenUrl(), { method: 'GET', credentials: 'same-origin', headers: { Accept: 'application/json', 'X-Requested-With': 'XMLHttpRequest', }, }) .then(function (response) { if (!response.ok) { throw new Error('csrf refresh failed'); } return response.json(); }) .then(function (data) { if (data && data.token) { applyCsrfToken(data.token); return data.token; } throw new Error('csrf token missing'); }); } function handleExpiredCsrf(layer, message) { var msg = message || 'Page expired. Refreshing…'; if (layer && typeof layer.msg === 'function') { layer.msg(msg); } setTimeout(function () { window.location.reload(); }, 800); } function initBfcacheReload() { window.addEventListener('pageshow', function (event) { if (event.persisted) { window.location.reload(); } }); } function initVisibilityCsrfRefresh() { document.addEventListener('visibilitychange', function () { if (document.visibilityState !== 'visible') { return; } refreshCsrfToken().catch(function () { // Ignore; submit handler will reload on 419. }); }); } function initAuthPageGuards(options) { options = options || {}; try { initBfcacheReload(); initVisibilityCsrfRefresh(); refreshCsrfToken().catch(function () { // Ignore warm-up failures. }); } catch (error) { // Never block page scripts. } return { expiredMessage: options.expiredMessage || 'Page expired. Refreshing…', }; } initPasswordToggles(); window.AuthForms = { initSavedUsername: initSavedUsername, persistSavedUsername: persistSavedUsername, refreshCsrfToken: refreshCsrfToken, handleExpiredCsrf: handleExpiredCsrf, initAuthPageGuards: initAuthPageGuards, saveInviteCode: saveInviteCode, readInviteCode: readInviteCode, applyInviteToInput: applyInviteToInput, }; })();