diff --git a/public/!!.html b/public/!!.html
index 5d7ce122..3e732d38 100644
--- a/public/!!.html
+++ b/public/!!.html
@@ -8,7 +8,7 @@
-
Waves
+ Waves.
diff --git a/public/!.html b/public/!.html
index 28f97445..74a2905c 100644
--- a/public/!.html
+++ b/public/!.html
@@ -8,7 +8,7 @@
- Waves
+ Waves.
diff --git a/public/$.html b/public/$.html
index 3173aa78..a97a1aad 100644
--- a/public/$.html
+++ b/public/$.html
@@ -8,7 +8,7 @@
- Waves
+ Waves.
diff --git a/public/assets/js/$.js b/public/assets/js/$.js
index b63cc2ae..1b3e12f9 100644
--- a/public/assets/js/$.js
+++ b/public/assets/js/$.js
@@ -1,320 +1,315 @@
document.addEventListener('DOMContentLoaded', () => {
- const historyStack = [];
- let currentIndex = -1;
- const refreshIcon = document.getElementById('refreshIcon');
- const fullscreenIcon = document.getElementById('fullscreenIcon');
- const backIcon = document.getElementById('backIcon');
- const forwardIcon = document.getElementById('forwardIcon');
- const iframe = document.getElementById('cool-iframe');
- const erudaLoadingScreen = document.getElementById('erudaLoadingScreen');
- if (!refreshIcon || !fullscreenIcon || !backIcon || !forwardIcon || !iframe) return;
- let loadingHidden = false;
-
+ const historyStack = []
+ let currentIndex = -1
+ const refreshIcon = document.getElementById('refreshIcon')
+ const fullscreenIcon = document.getElementById('fullscreenIcon')
+ const backIcon = document.getElementById('backIcon')
+ const forwardIcon = document.getElementById('forwardIcon')
+ const iframe = document.getElementById('cool-iframe')
+ const erudaLoadingScreen = document.getElementById('erudaLoadingScreen')
+ if (!refreshIcon || !fullscreenIcon || !backIcon || !forwardIcon || !iframe) return
+
+ const originalTitle = document.title
+ let loadingHidden = false
+
function showLoadingScreen(withToast = true, showEruda = false) {
- loadingHidden = false;
- NProgress.start();
- if (withToast) {
- showToast(
- 'Consider joining our Discord <3',
- 'success',
- 'heart'
- );
- }
+ loadingHidden = false
+ NProgress.start()
+ document.title = 'Loading... <3'
+ if (withToast) {
+ showToast(
+ 'Consider joining our Discord <3',
+ 'success',
+ 'heart'
+ )
+ }
}
-
+
function hideLoadingScreen() {
- if (loadingHidden) return;
- loadingHidden = true;
- NProgress.done();
+ if (loadingHidden) return
+ loadingHidden = true
+ NProgress.done()
+ document.title = originalTitle
}
-
+
refreshIcon.addEventListener('click', () => {
- refreshIcon.classList.add('spin');
- if (iframe.tagName === 'IFRAME') {
- const currentUrl = iframe.contentWindow.location.href;
- if (normalizeUrl(currentUrl) !== normalizeUrl(historyStack[currentIndex] || '')) {
- addToHistory(currentUrl);
+ refreshIcon.classList.add('spin')
+ if (iframe.tagName === 'IFRAME') {
+ const currentUrl = iframe.contentWindow.location.href
+ if (normalizeUrl(currentUrl) !== normalizeUrl(historyStack[currentIndex] || '')) {
+ addToHistory(currentUrl)
+ }
+ iframe.contentWindow.location.reload(true)
}
- iframe.contentWindow.location.reload(true);
- }
- setTimeout(() => refreshIcon.classList.remove('spin'), 300);
- });
-
+ setTimeout(() => refreshIcon.classList.remove('spin'), 300)
+ })
+
fullscreenIcon.addEventListener('click', () => {
- if (iframe.requestFullscreen) iframe.requestFullscreen();
- else if (iframe.mozRequestFullScreen) iframe.mozRequestFullScreen();
- else if (iframe.webkitRequestFullscreen) iframe.webkitRequestFullscreen();
- else if (iframe.msRequestFullscreen) iframe.msRequestFullscreen();
- });
-
+ if (iframe.requestFullscreen) iframe.requestFullscreen()
+ else if (iframe.mozRequestFullScreen) iframe.mozRequestFullScreen()
+ else if (iframe.webkitRequestFullscreen) iframe.webkitRequestFullscreen()
+ else if (iframe.msRequestFullscreen) iframe.msRequestFullscreen()
+ })
+
backIcon.addEventListener('click', () => {
- if (currentIndex > 0) {
- currentIndex--;
- iframe.src = historyStack[currentIndex];
- showLoadingScreen(false, false);
- updateNavButtons();
- updateDecodedSearchInput();
- }
- });
-
+ if (currentIndex > 0) {
+ currentIndex--
+ iframe.src = historyStack[currentIndex]
+ showLoadingScreen(false, false)
+ updateNavButtons()
+ updateDecodedSearchInput()
+ }
+ })
+
forwardIcon.addEventListener('click', () => {
- if (currentIndex < historyStack.length - 1) {
- currentIndex++;
- iframe.src = historyStack[currentIndex];
- showLoadingScreen(false, false);
- updateNavButtons();
- updateDecodedSearchInput();
- }
- });
-
+ if (currentIndex < historyStack.length - 1) {
+ currentIndex++
+ iframe.src = historyStack[currentIndex]
+ showLoadingScreen(false, false)
+ updateNavButtons()
+ updateDecodedSearchInput()
+ }
+ })
+
function normalizeUrl(urlStr) {
- try {
- const url = new URL(urlStr);
- url.searchParams.delete('ia');
- return url.toString();
- } catch (e) {
- return urlStr;
- }
+ try {
+ const url = new URL(urlStr)
+ url.searchParams.delete('ia')
+ return url.toString()
+ } catch (e) {
+ return urlStr
+ }
}
-
+
function addToHistory(url) {
- const normalized = normalizeUrl(url);
- if (currentIndex >= 0 && normalizeUrl(historyStack[currentIndex]) === normalized) return;
- if (currentIndex < historyStack.length - 1) historyStack.splice(currentIndex + 1);
- historyStack.push(url);
- currentIndex++;
- updateNavButtons();
- updateDecodedSearchInput();
+ const normalized = normalizeUrl(url)
+ if (currentIndex >= 0 && normalizeUrl(historyStack[currentIndex]) === normalized) return
+ if (currentIndex < historyStack.length - 1) historyStack.splice(currentIndex + 1)
+ historyStack.push(url)
+ currentIndex++
+ updateNavButtons()
+ updateDecodedSearchInput()
}
-
+
function updateNavButtons() {
- backIcon.disabled = currentIndex <= 0;
- forwardIcon.disabled = currentIndex >= historyStack.length - 1;
- backIcon.classList.toggle('disabled', currentIndex <= 0);
- forwardIcon.classList.toggle('disabled', currentIndex >= historyStack.length - 1);
+ backIcon.disabled = currentIndex <= 0
+ forwardIcon.disabled = currentIndex >= historyStack.length - 1
+ backIcon.classList.toggle('disabled', currentIndex <= 0)
+ forwardIcon.classList.toggle('disabled', currentIndex >= historyStack.length - 1)
}
-
+
function updateDecodedSearchInput() {
- const searchInput2 = document.getElementById('searchInputt');
- if (!searchInput2) return;
- let url = '';
- if (currentIndex >= 0 && historyStack[currentIndex]) {
- url = historyStack[currentIndex];
- } else if (iframe.src) {
- url = iframe.src;
- }
- searchInput2.value = decodeUrl(url);
- const lockIcon = document.getElementById('lockIcon');
- if (lockIcon) {
- lockIcon.className = decodeUrl(url).startsWith('https://')
- ? 'fa-regular fa-lock'
- : 'fa-regular fa-lock-open';
- lockIcon.style.color = '';
- }
+ const searchInput2 = document.getElementById('searchInputt')
+ if (!searchInput2) return
+ let url = ''
+ if (currentIndex >= 0 && historyStack[currentIndex]) {
+ url = historyStack[currentIndex]
+ } else if (iframe.src) {
+ url = iframe.src
+ }
+ searchInput2.value = decodeUrl(url)
+ const lockIcon = document.getElementById('lockIcon')
+ if (lockIcon) {
+ lockIcon.className = decodeUrl(url).startsWith('https://') ?
+ 'fa-regular fa-lock' :
+ 'fa-regular fa-lock-open'
+ lockIcon.style.color = ''
+ }
}
-
+
iframe.addEventListener('load', () => {
- try { hideLoadingScreen(); }
- catch (error) {
- console.error('Error during iframe load:', error);
- hideLoadingScreen();
- } finally {
- if (erudaLoadingScreen) erudaLoadingScreen.style.display = 'none';
- }
- });
-
+ try {
+ hideLoadingScreen()
+ } catch {
+ hideLoadingScreen()
+ } finally {
+ if (erudaLoadingScreen) erudaLoadingScreen.style.display = 'none'
+ }
+ })
+
iframe.addEventListener('error', () => {
- console.error('Error loading iframe content.');
- hideLoadingScreen();
- });
-
+ hideLoadingScreen()
+ })
+
iframe.addEventListener('loadstart', () => {
- if (navbarToggle && navbarToggle.checked && navBar) {
- navBar.style.display = 'block';
- }
- showLoadingScreen(false, false);
- });
-
- const navBar = document.querySelector('.navbar');
- const topBar = document.querySelector('.topbar');
- const searchInput1 = document.getElementById('searchInput');
- const searchInput2 = document.getElementById('searchInputt');
- const movies = document.getElementById('movies');
- const ai = document.getElementById('ai');
- const navbarToggle = document.getElementById('navbar-toggle');
-
+ const navBar = document.querySelector('.navbar')
+ const navbarToggle = document.getElementById('navbar-toggle')
+ if (navbarToggle && navbarToggle.checked && navBar) navBar.style.display = 'block'
+ showLoadingScreen(false, false)
+ })
+
+ const navBar = document.querySelector('.navbar')
+ const topBar = document.querySelector('.topbar')
+ const searchInput1 = document.getElementById('searchInput')
+ const searchInput2 = document.getElementById('searchInputt')
+ const movies = document.getElementById('movies')
+ const ai = document.getElementById('ai')
+ const navbarToggle = document.getElementById('navbar-toggle')
+
if (navbarToggle && navBar) {
- const savedNavbarState = localStorage.getItem('navbarToggled');
- navbarToggle.checked = savedNavbarState === null ? true : savedNavbarState === 'true';
- navBar.style.display =
- iframe.style.display === 'block' && navbarToggle.checked ? 'block' : 'none';
- navbarToggle.addEventListener('change', () => {
- localStorage.setItem('navbarToggled', navbarToggle.checked);
- navBar.style.display =
- iframe.style.display === 'block' && navbarToggle.checked ? 'block' : 'none';
- });
+ const savedNavbarState = localStorage.getItem('navbarToggled')
+ navbarToggle.checked = savedNavbarState === null ? true : savedNavbarState === 'true'
+ navBar.style.display = iframe.style.display === 'block' && navbarToggle.checked ? 'block' : 'none'
+ navbarToggle.addEventListener('change', () => {
+ localStorage.setItem('navbarToggled', navbarToggle.checked)
+ navBar.style.display = iframe.style.display === 'block' && navbarToggle.checked ? 'block' : 'none'
+ })
}
-
- iframe.style.display = 'none';
- window.addEventListener('load', hideLoadingScreen);
-
+
+ iframe.style.display = 'none'
+ window.addEventListener('load', hideLoadingScreen)
+
+ ;
[searchInput1, searchInput2].forEach(input => {
- if (input) {
- input.addEventListener('keyup', e => {
- if (e.key === 'Enter') handleSearch(input.value);
- });
- }
- });
- if (movies) movies.addEventListener('click', e => { e.preventDefault(); handleSearch('https://movies.usewaves.site/'); });
- if (ai) ai.addEventListener('click', e => { e.preventDefault(); handleSearch('https://ai.usewaves.site/'); });
-
+ if (input) {
+ input.addEventListener('keyup', e => {
+ if (e.key === 'Enter') handleSearch(input.value)
+ })
+ }
+ })
+
+ if (movies) movies.addEventListener('click', e => {
+ e.preventDefault();
+ handleSearch('https://movies.usewaves.site/')
+ })
+ if (ai) ai.addEventListener('click', e => {
+ e.preventDefault();
+ handleSearch('https://ai.usewaves.site/')
+ })
+
function clearBackground() {
- const preserved = [
- document.querySelector('.navbar'),
- document.getElementById('cool-iframe'),
- document.querySelector('.loading-screen'),
- erudaLoadingScreen
- ];
- Array.from(document.body.children).forEach(child => {
- if (!preserved.includes(child)) child.remove();
- });
+ const preserved = [
+ document.querySelector('.navbar'),
+ document.getElementById('cool-iframe'),
+ document.querySelector('.loading-screen'),
+ erudaLoadingScreen
+ ]
+ Array.from(document.body.children).forEach(child => {
+ if (!preserved.includes(child)) child.remove()
+ })
}
-
+
async function handleSearch(query) {
- clearBackground();
-
- let searchURL;
+ clearBackground()
+ let searchURL
if (
- query.startsWith('/assets/g/') ||
- query.startsWith(window.location.origin + '/assets/g/')
+ query.startsWith('/assets/g/') ||
+ query.startsWith(window.location.origin + '/assets/g/')
) {
- searchURL = query;
+ searchURL = query
} else {
- searchURL = generateSearchUrl(query);
+ searchURL = generateSearchUrl(query)
}
-
- if (searchInput2) searchInput2.value = searchURL;
-
- historyStack.length = 0;
- currentIndex = -1;
- showLoadingScreen(true, false);
- iframe.style.display = 'block';
- if (topBar) topBar.style.display = 'none';
- backIcon.disabled = forwardIcon.disabled = true;
-
- let finalUrl;
+ if (searchInput2) searchInput2.value = searchURL
+ historyStack.length = 0
+ currentIndex = -1
+ showLoadingScreen(true, false)
+ iframe.style.display = 'block'
+ if (topBar) topBar.style.display = 'none'
+ backIcon.disabled = forwardIcon.disabled = true
+ let finalUrl
try {
- const u = new URL(searchURL, window.location.origin);
- if (u.origin === window.location.origin && u.pathname.startsWith('/assets/g/')) {
- finalUrl = u.href;
- } else {
- finalUrl = await getUrl(searchURL);
- }
- } catch (err) {
- console.error('Error parsing URL, proxying by default:', err);
- finalUrl = await getUrl(searchURL);
+ const u = new URL(searchURL, window.location.origin)
+ if (u.origin === window.location.origin && u.pathname.startsWith('/assets/g/')) {
+ finalUrl = u.href
+ } else {
+ finalUrl = await getUrl(searchURL)
+ }
+ } catch {
+ finalUrl = await getUrl(searchURL)
}
-
- iframe.src = finalUrl;
+ iframe.src = finalUrl
iframe.onload = () => {
- hideLoadingScreen();
- if (navbarToggle && navbarToggle.checked && navBar) navBar.style.display = 'block';
- generateSubject();
- updateDecodedSearchInput();
- };
+ hideLoadingScreen()
+ if (navbarToggle && navbarToggle.checked && navBar) navBar.style.display = 'block'
+ generateSubject()
+ updateDecodedSearchInput()
+ }
iframe.onerror = () => {
- console.error('Failed to load content.');
- hideLoadingScreen();
- };
- }
-
- window.handleSearch = handleSearch;
-
+ hideLoadingScreen()
+ }
+ }
+
+ window.handleSearch = handleSearch
+
function generateSearchUrl(query) {
- try {
- return new URL(query).toString();
- } catch {
try {
- const u = new URL(`https://${query}`);
- if (u.hostname.includes('.')) return u.toString();
- } catch {}
- }
- return `https://duckduckgo.com/?q=${encodeURIComponent(query)}&ia=web`;
+ return new URL(query).toString()
+ } catch {
+ try {
+ const u = new URL(`https://${query}`)
+ if (u.hostname.includes('.')) return u.toString()
+ } catch {}
+ }
+ return `https://duckduckgo.com/?q=${encodeURIComponent(query)}&ia=web`
}
-
+
function showToast(message, type = 'success', iconType = 'check') {
- const toast = document.createElement('div');
- toast.className = `toast show ${type}`;
- const icons = {
- success: '',
- error: '',
- info: '',
- warning: '',
- heart: ''
- };
- const icon = icons[iconType] || icons.heart;
- toast.innerHTML = `${icon}${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.add('hide');
- setTimeout(() => toast.remove(), 500);
- });
- toast.appendChild(closeBtn);
- document.body.appendChild(toast);
- setTimeout(() => {
- toast.classList.add('hide');
- setTimeout(() => toast.remove(), 500);
- }, 3000);
+ const toast = document.createElement('div')
+ toast.className = `toast show ${type}`
+ const icons = {
+ success: '',
+ error: '',
+ info: '',
+ warning: '',
+ heart: ''
+ }
+ const icon = icons[iconType] || icons.heart
+ toast.innerHTML = `${icon}${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.add('hide')
+ setTimeout(() => toast.remove(), 500)
+ })
+ toast.appendChild(closeBtn)
+ document.body.appendChild(toast)
+ setTimeout(() => {
+ toast.classList.add('hide')
+ setTimeout(() => toast.remove(), 500)
+ }, 3000)
}
-
+
function preloadResources(url) {
- if (!url) {
- console.error('Preload failed: URL is undefined or empty.');
- return;
- }
-
+ if (!url) return
try {
- const link = document.createElement('link');
- link.rel = 'preload';
- link.href = url;
- link.as = 'fetch';
- link.crossOrigin = 'anonymous';
- document.head.appendChild(link);
- console.log(`Resource preloaded: ${url}`);
- } catch (error) {
- console.error('Error preloading resource:', error);
- }
+ const link = document.createElement('link')
+ link.rel = 'preload'
+ link.href = url
+ link.as = 'fetch'
+ link.crossOrigin = 'anonymous'
+ document.head.appendChild(link)
+ } catch {}
}
-
+
function getUrl(url) {
- return Promise.resolve(__uv$config.prefix + __uv$config.encodeUrl(url));
+ return Promise.resolve(__uv$config.prefix + __uv$config.encodeUrl(url))
}
-
+
function generateSubject() {
- const subjects = ['math', 'science', 'history', 'art', 'programming', 'philosophy'];
- const random = subjects[Math.floor(Math.random() * subjects.length)];
- history.replaceState({}, '', '/learning?subject=' + random);
+ const subjects = ['math', 'science', 'history', 'art', 'programming', 'philosophy']
+ const random = subjects[Math.floor(Math.random() * subjects.length)]
+ history.replaceState({}, '', '/learning?subject=' + random)
}
-
+
function decodeUrl(enc) {
- try {
- const o = new URL(enc, window.location.origin);
- const p = (__uv$config && __uv$config.prefix) || '/wa/a/';
- if (o.pathname.startsWith(p)) {
- const part = o.pathname.slice(p.length);
- return (__uv$config.decodeUrl ? __uv$config.decodeUrl(part) : decodeURIComponent(part));
- }
- } catch {}
- return enc;
+ try {
+ const o = new URL(enc, window.location.origin)
+ const p = (__uv$config && __uv$config.prefix) || '/wa/a/'
+ if (o.pathname.startsWith(p)) {
+ const part = o.pathname.slice(p.length)
+ return (__uv$config.decodeUrl ? __uv$config.decodeUrl(part) : decodeURIComponent(part))
+ }
+ } catch {}
+ return enc
}
-
- window.decodeUrl = decodeUrl;
- window.addToHistory = addToHistory;
- window.updateDecodedSearchInput = updateDecodedSearchInput;
- window.normalizeUrl = normalizeUrl;
-});
\ No newline at end of file
+
+ window.decodeUrl = decodeUrl
+ window.addToHistory = addToHistory
+ window.updateDecodedSearchInput = updateDecodedSearchInput
+ window.normalizeUrl = normalizeUrl
+})
\ No newline at end of file
diff --git a/public/assets/js/navbar.js b/public/assets/js/navbar.js
index 4ea09067..4964034e 100644
--- a/public/assets/js/navbar.js
+++ b/public/assets/js/navbar.js
@@ -10,13 +10,14 @@ document.head.appendChild(style);
const historyStack = [];
let currentIndex = -1;
const elements = {
- refreshIcon: document.getElementById('refreshIcon'),
- fullscreenIcon: document.getElementById('fullscreenIcon'),
- backIcon: document.getElementById('backIcon'),
- forwardIcon: document.getElementById('forwardIcon'),
- searchInput2: document.getElementById('searchInputt'),
- iframe: document.getElementById('cool-iframe')
+ refreshIcon: document.getElementById('refreshIcon'),
+ fullscreenIcon: document.getElementById('fullscreenIcon'),
+ backIcon: document.getElementById('backIcon'),
+ forwardIcon: document.getElementById('forwardIcon'),
+ searchInput2: document.getElementById('searchInputt'),
+ iframe: document.getElementById('cool-iframe')
};
+const originalTitle = document.title;
let loadingFallbackTimeout;
elements.refreshIcon.addEventListener('click', handleRefresh);
@@ -25,99 +26,106 @@ elements.backIcon.addEventListener('click', handleBack);
elements.forwardIcon.addEventListener('click', handleForward);
function showLoadingScreen() {
- if (typeof NProgress !== 'undefined') NProgress.start();
+ if (typeof NProgress !== 'undefined') {
+ NProgress.start();
+ document.title = 'Loading... <3';
+ setTimeout(() => {
+ if (typeof NProgress !== 'undefined') NProgress.done();
+ }, 10000);
+ }
}
function hideLoadingScreen() {
- if (typeof NProgress !== 'undefined') NProgress.done();
+ if (typeof NProgress !== 'undefined') NProgress.done();
+ document.title = originalTitle;
}
function handleRefresh() {
- elements.refreshIcon.classList.add('spin');
- const iframe = elements.iframe;
- const currentUrl = iframe.contentWindow.location.href;
- if (normalizeUrl(currentUrl) !== normalizeUrl(historyStack[currentIndex] || '')) {
- addToHistory(currentUrl);
- }
- iframe.contentWindow.location.reload(true);
- setTimeout(() => elements.refreshIcon.classList.remove('spin'), 300);
+ elements.refreshIcon.classList.add('spin');
+ const iframe = elements.iframe;
+ const currentUrl = iframe.contentWindow.location.href;
+ if (normalizeUrl(currentUrl) !== normalizeUrl(historyStack[currentIndex] || '')) {
+ addToHistory(currentUrl);
+ }
+ iframe.contentWindow.location.reload(true);
+ setTimeout(() => elements.refreshIcon.classList.remove('spin'), 300);
}
function handleFullscreen() {
- const iframe = elements.iframe;
- if (iframe && iframe.tagName === 'IFRAME') iframe.requestFullscreen();
+ const iframe = elements.iframe;
+ if (iframe && iframe.tagName === 'IFRAME') iframe.requestFullscreen();
}
function handleBack() {
- toggleButtonAnimation(elements.backIcon, 'button-animate-back');
- if (currentIndex > 0) {
- currentIndex--;
- updateIframeSrc();
- }
+ toggleButtonAnimation(elements.backIcon, 'button-animate-back');
+ if (currentIndex > 0) {
+ currentIndex--;
+ updateIframeSrc();
+ }
}
function handleForward() {
- toggleButtonAnimation(elements.forwardIcon, 'button-animate-forward');
- if (currentIndex < historyStack.length - 1) {
- currentIndex++;
- updateIframeSrc();
- }
+ toggleButtonAnimation(elements.forwardIcon, 'button-animate-forward');
+ if (currentIndex < historyStack.length - 1) {
+ currentIndex++;
+ updateIframeSrc();
+ }
}
function toggleButtonAnimation(button, animationClass) {
- button.classList.add(animationClass);
- setTimeout(() => button.classList.remove(animationClass), 200);
+ button.classList.add(animationClass);
+ setTimeout(() => button.classList.remove(animationClass), 200);
}
function normalizeUrl(urlStr) {
- try {
- const url = new URL(urlStr);
- url.searchParams.delete('ia');
- return url.toString();
- } catch (e) {
- return urlStr;
- }
+ try {
+ const url = new URL(urlStr);
+ url.searchParams.delete('ia');
+ return url.toString();
+ } catch (e) {
+ return urlStr;
+ }
}
function addToHistory(url) {
- const normalized = normalizeUrl(url);
- if (currentIndex >= 0 && normalizeUrl(historyStack[currentIndex]) === normalized) return;
- if (currentIndex < historyStack.length - 1) historyStack.splice(currentIndex + 1);
- historyStack.push(url);
- currentIndex++;
- updateNavButtons();
- updateDecodedSearchInput();
+ const normalized = normalizeUrl(url);
+ if (currentIndex >= 0 && normalizeUrl(historyStack[currentIndex]) === normalized) return;
+ if (currentIndex < historyStack.length - 1) historyStack.splice(currentIndex + 1);
+ historyStack.push(url);
+ currentIndex++;
+ updateNavButtons();
+ updateDecodedSearchInput();
}
function updateIframeSrc() {
- showLoadingScreen();
- elements.iframe.src = historyStack[currentIndex];
- updateNavButtons();
- updateDecodedSearchInput();
+ showLoadingScreen();
+ elements.iframe.src = historyStack[currentIndex];
+ updateNavButtons();
+ updateDecodedSearchInput();
}
function updateNavButtons() {
- const isAtStart = currentIndex <= 0;
- const isAtEnd = currentIndex >= historyStack.length - 1;
- elements.backIcon.disabled = isAtStart;
- elements.forwardIcon.disabled = isAtEnd;
- elements.backIcon.classList.toggle('disabled', isAtStart);
- elements.forwardIcon.classList.toggle('disabled', isAtEnd);
+ const isAtStart = currentIndex <= 0;
+ const isAtEnd = currentIndex >= historyStack.length - 1;
+ elements.backIcon.disabled = isAtStart;
+ elements.forwardIcon.disabled = isAtEnd;
+ elements.backIcon.classList.toggle('disabled', isAtStart);
+ elements.forwardIcon.classList.toggle('disabled', isAtEnd);
}
function updateDecodedSearchInput() {
- if (elements.searchInput2) {
- const url = historyStack[currentIndex] || elements.iframe.src;
- elements.searchInput2.value = decodeUrl(url);
- }
+ if (elements.searchInput2) {
+ const url = historyStack[currentIndex] || elements.iframe.src;
+ elements.searchInput2.value = decodeUrl(url);
+ }
}
function decodeUrl(url) {
- try {
- return decodeURIComponent(url);
- } catch (e) {
- return url;
- }
+ try {
+ return decodeURIComponent(url);
+ } catch (e) {
+ return url;
+ }
}
window.addToHistory = addToHistory;
@@ -125,57 +133,51 @@ window.updateDecodedSearchInput = updateDecodedSearchInput;
window.normalizeUrl = normalizeUrl;
function detectIframeNavigation() {
- try {
- const iframeWindow = elements.iframe.contentWindow;
- const pushState = iframeWindow.history.pushState;
- const replaceState = iframeWindow.history.replaceState;
- iframeWindow.history.pushState = function() {
- pushState.apply(this, arguments);
- handleIframeNavigation(iframeWindow.location.href);
- };
- iframeWindow.history.replaceState = function() {
- replaceState.apply(this, arguments);
- handleIframeNavigation(iframeWindow.location.href);
- };
- iframeWindow.addEventListener('popstate', () => handleIframeNavigation(iframeWindow.location.href));
- iframeWindow.addEventListener('hashchange', () => handleIframeNavigation(iframeWindow.location.href));
- } catch (error) {}
+ try {
+ const iframeWindow = elements.iframe.contentWindow;
+ const pushState = iframeWindow.history.pushState;
+ const replaceState = iframeWindow.history.replaceState;
+ iframeWindow.history.pushState = function() {
+ pushState.apply(this, arguments);
+ handleIframeNavigation(iframeWindow.location.href);
+ };
+ iframeWindow.history.replaceState = function() {
+ replaceState.apply(this, arguments);
+ handleIframeNavigation(iframeWindow.location.href);
+ };
+ iframeWindow.addEventListener('popstate', () => handleIframeNavigation(iframeWindow.location.href));
+ iframeWindow.addEventListener('hashchange', () => handleIframeNavigation(iframeWindow.location.href));
+ } catch (error) {}
}
function handleIframeNavigation(rawUrl) {
- let urlStr = rawUrl;
- try {
- urlStr = decodeUrl(rawUrl);
- } catch {}
-
- try {
- const u = new URL(urlStr);
- if (u.hostname.endsWith('duckduckgo.com')) {
- if (typeof NProgress !== 'undefined') NProgress.done();
- return;
- }
- } catch (e) {
- }
-
- if (normalizeUrl(urlStr) !== normalizeUrl(historyStack[currentIndex] || '')) {
- showLoadingScreen();
- addToHistory(urlStr);
- } else {
- hideLoadingScreen();
- }
- }
+ let urlStr = rawUrl;
+ try {
+ urlStr = decodeUrl(rawUrl);
+ } catch {}
+ try {
+ const u = new URL(urlStr);
+ if (u.hostname.endsWith('duckduckgo.com')) {
+ if (typeof NProgress !== 'undefined') NProgress.done();
+ return;
+ }
+ } catch (e) {}
+ if (normalizeUrl(urlStr) !== normalizeUrl(historyStack[currentIndex] || '')) {
+ showLoadingScreen();
+ addToHistory(urlStr);
+ } else {
+ hideLoadingScreen();
+ }
+}
elements.iframe.addEventListener('load', () => {
- try {
- detectIframeNavigation();
- if (historyStack.length === 0) {
- addToHistory(elements.iframe.contentWindow.location.href);
- } else {
- handleIframeNavigation(elements.iframe.contentWindow.location.href);
- }
- } catch (error) {
- console.error('Error during iframe load handling:', error);
- } finally {
- hideLoadingScreen();
- }
+ try {
+ detectIframeNavigation();
+ if (historyStack.length === 0) {
+ addToHistory(elements.iframe.contentWindow.location.href);
+ } else {
+ handleIframeNavigation(elements.iframe.contentWindow.location.href);
+ }
+ } catch (error) {}
+ hideLoadingScreen();
});
\ No newline at end of file