document.addEventListener('DOMContentLoaded', function () { const settingsMenu = document.getElementById('settings-menu'); settingsMenu.innerHTML = `

Settings

Transport is how the proxy will send information.

Epoxy
Epoxy
Libcurl

Enter a different Wisp Server to connect to.

Recommended to keep this as default.

Turn this on to go into about:blank every time the page loads (Recommended).

Keep this on for the navigation bar when searching (Recommended).

Having any problems? Join our Discord Server below or open an issue on GitHub for support.

`; const settingsIcon = document.getElementById('settings-icon'); const closeSettingsBtn = document.getElementById('close-settings'); const saveWispBtn = document.getElementById('save-wisp-url'); const transportSelector = document.querySelector('.transport-selector'); const transportSelected = transportSelector.querySelector('.transport-selected'); const transportOptions = transportSelector.querySelector('.transport-options'); const navbarToggle = document.getElementById('navbar-toggle'); const defaultWispUrl = `${window.location.protocol === "https:" ? "wss" : "ws"}://${window.location.host}/w/`; let currentWispUrl = localStorage.getItem('customWispUrl') || defaultWispUrl; const wispInput = document.querySelector("#wisp-server"); wispInput.value = currentWispUrl; let isToggling = false; function isValidUrl(url) { try { const p = new URL(url); return (p.protocol === "wss:" || p.protocol === "ws:") && url.endsWith('/'); } catch (_) { return false; } } function runScriptIfChecked() { let inFrame; try { inFrame = window !== top; } catch (e) { inFrame = true; } const aboutBlankChecked = JSON.parse(localStorage.getItem("aboutBlankChecked")) || false; if (!aboutBlankChecked || inFrame) { return; } const defaultTitle = "Google."; const defaultIcon = "https://www.google.com/favicon.ico"; const title = localStorage.getItem("siteTitle") || defaultTitle; const icon = localStorage.getItem("faviconURL") || defaultIcon; const iframeSrc = "/"; const popup = window.open("", "_blank"); if (!popup || popup.closed) { alert("Failed to load automask. Please allow popups and try again."); return; } popup.document.head.innerHTML = ` ${title} `; popup.document.body.innerHTML = ` `; window.location.replace("https://bisd.schoology.com/home"); } document.getElementById("aboutblank-toggle").addEventListener("change", function() { localStorage.setItem("aboutBlankChecked", JSON.stringify(this.checked)); if (this.checked) { showToast('success', 'Auto About:Blank is now enabled.'); } else { showToast('error', 'Auto About:Blank is now disabled.'); } runScriptIfChecked(); }); window.addEventListener("load", function() { const aboutBlankChecked = JSON.parse(localStorage.getItem("aboutBlankChecked")) || false; document.getElementById("aboutblank-toggle").checked = aboutBlankChecked; runScriptIfChecked(); }); function updateWispServerUrl(url) { if (isValidUrl(url)) { currentWispUrl = url; localStorage.setItem('customWispUrl', url); document.dispatchEvent(new CustomEvent('wispUrlChanged', { detail: currentWispUrl })); showToast('success', `Wisp Server URL changed to: ${currentWispUrl}`); } else { currentWispUrl = defaultWispUrl; localStorage.setItem('customWispUrl', defaultWispUrl); document.dispatchEvent(new CustomEvent('wispUrlChanged', { detail: currentWispUrl })); showToast('error', "Invalid URL. Reverting to default..."); } } function updateServerInfo() { const speedSpan = document.getElementById('server-speed'); const uptimeSpan = document.getElementById('server-uptime'); const specsSpan = document.getElementById('server-specs'); let uptimeInterval; fetch('/api/info') .then(response => { if (!response.ok) throw new Error(); return response.json(); }) .then(data => { if (data?.speed) { const updateUptimeDisplay = () => { const uptime = Date.now() - data.startTime; const days = Math.floor(uptime / 86400000); const hours = Math.floor((uptime % 86400000) / 3600000); const minutes = Math.floor((uptime % 3600000) / 60000); const seconds = Math.floor((uptime % 60000) / 1000); uptimeSpan.textContent = `${days}d ${hours}h ${minutes}m ${seconds}s`; }; updateUptimeDisplay(); clearInterval(uptimeInterval); uptimeInterval = setInterval(updateUptimeDisplay, 1000); speedSpan.textContent = `${data.speed} (${data.averageLatency}ms)`; specsSpan.textContent = data.specs; } setTimeout(updateServerInfo, 10000); }) .catch(() => { speedSpan.textContent = 'Connection error'; setTimeout(updateServerInfo, 30000); }); } function initializeInfo() { const infoTab = document.getElementById('info-tab'); const infoContent = document.getElementById('info-content'); const startMonitoring = () => { updateServerInfo(); infoTab.removeEventListener('click', startMonitoring); }; if (infoContent.classList.contains('active')) { updateServerInfo(); } else { infoTab.addEventListener('click', startMonitoring, { once: true }); } } function showToast(type, message) { const toast = document.createElement('div'); toast.className = `toast ${type} show`; const icons = { success: '', error: '', info: '', warning: '' }; toast.innerHTML = `${icons[type]||''}${message}`; const progressBar = document.createElement('div'); progressBar.className = 'progress-bar'; toast.appendChild(progressBar); const closeBtn = document.createElement('button'); closeBtn.className = 'toast-close'; closeBtn.innerHTML = ''; closeBtn.addEventListener('click', () => { toast.classList.replace('show', 'hide'); setTimeout(() => toast.remove(), 500); }); toast.appendChild(closeBtn); document.body.appendChild(toast); setTimeout(() => { toast.classList.replace('show', 'hide'); setTimeout(() => toast.remove(), 500); }, 3000); } saveWispBtn.addEventListener('click', () => updateWispServerUrl(wispInput.value.trim())); settingsIcon.addEventListener('click', e => { e.preventDefault(); toggleSettingsMenu(); }); closeSettingsBtn.addEventListener('click', toggleSettingsMenu); function toggleSettingsMenu() { if (isToggling) return; isToggling = true; const icon = document.querySelector('#settings-icon i.settings-icon'); if (settingsMenu.classList.contains('open')) { settingsMenu.classList.add('close'); icon.classList.replace('fa-solid', 'fa-regular'); setTimeout(() => { settingsMenu.classList.remove('open', 'close'); isToggling = false; }, 300); } else { settingsMenu.classList.add('open'); icon.classList.replace('fa-regular', 'fa-solid'); setTimeout(() => { settingsMenu.classList.remove('close'); isToggling = false; }, 300); } } transportSelected.addEventListener('click', e => { e.stopPropagation(); transportOptions.classList.toggle('transport-show'); transportSelected.classList.toggle('transport-arrow-active'); }); Array.from(transportOptions.getElementsByTagName('div')).forEach(option => { option.addEventListener('click', function (e) { e.stopPropagation(); const val = this.textContent; transportSelected.textContent = val; localStorage.setItem('transport', val.toLowerCase()); transportOptions.classList.remove('transport-show'); transportSelected.classList.remove('transport-arrow-active'); document.dispatchEvent(new CustomEvent('newTransport', { detail: val.toLowerCase() })); showToast('success', `Transport changed to ${val}`); }); }); document.getElementById('proxy-content').classList.add('active'); function switchTab(activeTab, activeContent, ...others) { others.forEach(id => document.getElementById(id).classList.remove('active')); document.getElementById(activeTab).classList.add('active'); document.getElementById(activeContent).classList.add('active'); } document.getElementById('proxy-tab').addEventListener('click', () => switchTab('proxy-tab', 'proxy-content', 'cloak-tab', 'cloak-content', 'appearance-tab', 'appearance-content', 'info-tab', 'info-content')); document.getElementById('cloak-tab').addEventListener('click', () => switchTab('cloak-tab', 'cloak-content', 'proxy-tab', 'proxy-content', 'appearance-tab', 'appearance-content', 'info-tab', 'info-content')); document.getElementById('appearance-tab').addEventListener('click', () => switchTab('appearance-tab', 'appearance-content', 'proxy-tab', 'proxy-content', 'cloak-tab', 'cloak-content', 'info-tab', 'info-content')); document.getElementById('info-tab').addEventListener('click', () => switchTab('info-tab', 'info-content', 'proxy-tab', 'proxy-content', 'cloak-tab', 'cloak-content', 'appearance-tab', 'appearance-content')); document.querySelectorAll('.tab-button').forEach(btn => { btn.addEventListener('click', function () { const icon = this.querySelector('i'); if (!icon.classList.contains('fa-bounce')) { icon.classList.add('fa-bounce'); setTimeout(() => icon.classList.remove('fa-bounce'), 750); } }); }); navbarToggle.addEventListener('change', function () { showToast(this.checked ? 'success' : 'error', `Navigation Bar ${this.checked ? 'enabled' : 'disabled'}`); }); initializeInfo(); });