let initialWindowHeight; document.addEventListener("DOMContentLoaded", function() { initialWindowHeight = window.innerHeight; if (localStorage.getItem("dark-mode") === "true") { document.body.classList.add("dark-mode"); document.getElementById('theme-icon').classList.remove('fa-moon'); document.getElementById('theme-icon').classList.add('fa-sun'); } else { document.getElementById('theme-icon').classList.remove('fa-sun'); document.getElementById('theme-icon').classList.add('fa-moon'); } if (localStorage.getItem("view-mode") === "list") { document.body.classList.add("list-mode"); document.getElementById('view-mode-icon').classList.remove('fa-list'); document.getElementById('view-mode-icon').classList.add('fa-table'); } else { document.getElementById('view-mode-icon').classList.remove('fa-table'); document.getElementById('view-mode-icon').classList.add('fa-list'); } document.querySelectorAll('.group').forEach(group => { const groupName = group.id; const collapsed = group.dataset.collapsed === 'true'; if (collapsed) { group.classList.add('collapsed'); } else if (localStorage.getItem(`collapsed-${groupName}`) === 'true') { group.classList.add('collapsed'); } }); document.addEventListener("click", function(event) { const settingsMenu = document.getElementById('settings-menu'); if (!settingsMenu.contains(event.target) && !event.target.closest('.icon-button')) { settingsMenu.classList.remove('visible'); } }); const searchInput = document.getElementById('search-input'); searchInput.addEventListener('input', handleSearch); searchInput.addEventListener('keydown', handleKeyDown); document.addEventListener('keydown', function(event) { if (event.key === '/') { event.preventDefault(); searchInput.focus(); } if (event.key === 'Escape' || event.key === 'Esc') { event.preventDefault(); clearSearch(); searchInput.blur(); } }); window.visualViewport.addEventListener('resize', adjustFooterPosition); }); function searchFocus() { document.getElementById('search-input').focus() } function toggleDarkMode() { document.body.classList.toggle("dark-mode"); const themeIcon = document.getElementById('theme-icon'); if (document.body.classList.contains("dark-mode")) { localStorage.setItem("dark-mode", "true"); themeIcon.classList.remove('fa-moon'); themeIcon.classList.add('fa-sun'); } else { localStorage.setItem("dark-mode", "false"); themeIcon.classList.remove('fa-sun'); themeIcon.classList.add('fa-moon'); } } function toggleGroup(group) { const groupElement = document.getElementById(group); groupElement.classList.toggle("collapsed"); const isCollapsed = groupElement.classList.contains("collapsed"); localStorage.setItem(`collapsed-${group}`, isCollapsed); } function toggleSettings() { const settingsMenu = document.getElementById('settings-menu'); settingsMenu.classList.toggle('visible'); } function refreshData() { location.reload(); } function toggleViewMode() { document.body.classList.toggle("list-mode"); const viewModeIcon = document.getElementById('view-mode-icon'); if (document.body.classList.contains("list-mode")) { localStorage.setItem("view-mode", "list"); viewModeIcon.classList.remove('fa-list'); viewModeIcon.classList.add('fa-table'); } else { localStorage.setItem("view-mode", "box"); viewModeIcon.classList.remove('fa-table'); viewModeIcon.classList.add('fa-list'); } } let selectedRouterIndex = -1; function handleSearch(event) { const query = event.target.value.toLowerCase(); const groups = document.querySelectorAll('.group'); const content = document.getElementById('content'); // Remove the search group if it exists let searchGroup = document.getElementById('search-group'); if (searchGroup) { searchGroup.remove(); } if (query === '') { // Show all original groups groups.forEach(group => group.style.display = ''); selectedRouterIndex = -1; } else { // Hide all original groups groups.forEach(group => group.style.display = 'none'); // Create and show the search group searchGroup = document.createElement('div'); searchGroup.id = 'search-group'; searchGroup.className = 'group'; content.appendChild(searchGroup); searchGroup.innerHTML = `

${query}

`; const routerContainer = searchGroup.querySelector('.router-container'); const matchingRouters = []; document.querySelectorAll('.router').forEach(router => { const displayName = router.querySelector('h2').textContent.toLowerCase(); if (displayName.includes(query)) { const clonedRouter = router.cloneNode(true); matchingRouters.push(clonedRouter); routerContainer.appendChild(clonedRouter); } }); if (matchingRouters.length > 0) { selectedRouterIndex = 0; matchingRouters[selectedRouterIndex].classList.add('selected'); } // Scroll to search group document.getElementById("header").scrollIntoView({ behavior: "instant" }); } } function handleKeyDown(event) { const searchGroup = document.getElementById('search-group'); if (!searchGroup) return; const matchingRouters = searchGroup.querySelectorAll('.router'); if (matchingRouters.length === 0) return; const isListMode = document.body.classList.contains('list-mode'); const itemsPerRow = getItemsPerRow(); switch (event.key) { case 'ArrowDown': event.preventDefault(); if (isListMode) { if (selectedRouterIndex < matchingRouters.length - 1) { matchingRouters[selectedRouterIndex].classList.remove('selected'); selectedRouterIndex++; matchingRouters[selectedRouterIndex].classList.add('selected'); matchingRouters[selectedRouterIndex].scrollIntoView({ behavior: 'smooth', block: 'center' }); } } else { if (selectedRouterIndex + itemsPerRow < matchingRouters.length) { matchingRouters[selectedRouterIndex].classList.remove('selected'); selectedRouterIndex += itemsPerRow; matchingRouters[selectedRouterIndex].classList.add('selected'); matchingRouters[selectedRouterIndex].scrollIntoView({ behavior: 'smooth', block: 'center' }); } } break; case 'ArrowUp': event.preventDefault(); if (isListMode) { if (selectedRouterIndex > 0) { matchingRouters[selectedRouterIndex].classList.remove('selected'); selectedRouterIndex--; matchingRouters[selectedRouterIndex].classList.add('selected'); matchingRouters[selectedRouterIndex].scrollIntoView({ behavior: 'smooth', block: 'center' }); } } else { if (selectedRouterIndex - itemsPerRow >= 0) { matchingRouters[selectedRouterIndex].classList.remove('selected'); selectedRouterIndex -= itemsPerRow; matchingRouters[selectedRouterIndex].classList.add('selected'); matchingRouters[selectedRouterIndex].scrollIntoView({ behavior: 'smooth', block: 'center' }); } } break; case 'ArrowRight': if (!isListMode) { event.preventDefault(); if (selectedRouterIndex < matchingRouters.length - 1) { matchingRouters[selectedRouterIndex].classList.remove('selected'); selectedRouterIndex++; matchingRouters[selectedRouterIndex].classList.add('selected'); matchingRouters[selectedRouterIndex].scrollIntoView({ behavior: 'smooth', block: 'center' }); } } break; case 'ArrowLeft': if (!isListMode) { event.preventDefault(); if (selectedRouterIndex > 0) { matchingRouters[selectedRouterIndex].classList.remove('selected'); selectedRouterIndex--; matchingRouters[selectedRouterIndex].classList.add('selected'); matchingRouters[selectedRouterIndex].scrollIntoView({ behavior: 'smooth', block: 'center' }); } } break; case 'Enter': event.preventDefault(); if (selectedRouterIndex >= 0 && selectedRouterIndex < matchingRouters.length) { matchingRouters[selectedRouterIndex].click(); } break; } } function getItemsPerRow() { const width = window.innerWidth; if (width <= 480) return 1; if (width <= 1024) return 2; return 3; } function clearSearch() { const searchInput = document.getElementById('search-input'); searchInput.value = ''; handleSearch({ target: searchInput }); } function adjustFooterPosition() { const footer = document.querySelector('.footer'); const visualViewportHeight = window.visualViewport.height; const bottomOffset = window.innerHeight - visualViewportHeight; // Set the bottom position footer.style.bottom = `${bottomOffset}px`; }