// Setup search functionality function setupSearch() { const searchInput = document.getElementById('channel-search'); let searchTimeout; // Search input handler searchInput.addEventListener('input', function() { const query = this.value.trim(); clearTimeout(searchTimeout); searchTimeout = setTimeout(() => { if (query.length >= 2) { searchChannels(query); } else if (query.length === 0) { selectCategory(currentCategory); } }, 300); }); // Keyboard shortcut support (Ctrl+K) document.addEventListener('keydown', function(e) { if ((e.ctrlKey || e.metaKey) && e.key === 'k') { e.preventDefault(); searchInput.focus(); searchInput.select(); } // Escape to clear search if (e.key === 'Escape' && document.activeElement === searchInput) { searchInput.value = ''; selectCategory(currentCategory); searchInput.blur(); } }); // Search on Enter searchInput.addEventListener('keydown', function(e) { if (e.key === 'Enter') { const query = this.value.trim(); if (query.length >= 2) { searchChannels(query); } } }); } // Search channels function searchChannels(query) { if (!allChannelsData.channels) { console.warn('No channel data available for search'); return; } const filteredChannels = allChannelsData.channels.filter(channel => channel.name.toLowerCase().includes(query.toLowerCase()) || channel.categoryName.toLowerCase().includes(query.toLowerCase()) || (channel.number && channel.number.toString().includes(query)) ); // Reset page to 1 for search results currentPage = 1; document.getElementById('section-title').textContent = `Search Results for "${query}"`; document.getElementById('section-description').textContent = `${filteredChannels.length} channels found`; document.getElementById('category-filter-info').textContent = `Searching all categories`; displayChannels(filteredChannels); } // Filter channels by type (for filter buttons) function filterChannels(filterType) { // Update filter buttons document.querySelectorAll('.filter-btn').forEach(btn => { btn.className = btn.className.replace('active bg-blue-600 text-white', 'bg-gray-200 text-gray-700'); }); event.target.className = event.target.className.replace('bg-gray-200 text-gray-700', 'active bg-blue-600 text-white'); // Apply filter switch(filterType) { case 'all': selectCategory('all'); break; case 'network-tv': selectCategory('network-tv'); break; case 'sports': selectCategory('sports-networks'); break; case 'international': selectCategory('canada'); break; } } // Display error message function displayError(message) { const container = document.getElementById('channels-container'); container.innerHTML = `
${message}