const uploadArea = document.getElementById('upload-area'); const fileInput = document.getElementById('file-input'); const uploadStatus = document.getElementById('upload-status'); const searchInput = document.getElementById('search-input'); const searchBtn = document.getElementById('search-btn'); const searchStatus = document.getElementById('search-status'); const resultsSection = document.getElementById('results-section'); const resultsContainer = document.getElementById('results-container'); const imageCount = document.getElementById('image-count'); updateStats(); uploadArea.addEventListener('click', () => { fileInput.click(); }); fileInput.addEventListener('change', (e) => { if (e.target.files.length > 0) { uploadFile(e.target.files[0]); } }); uploadArea.addEventListener('dragover', (e) => { e.preventDefault(); uploadArea.classList.add('dragover'); }); uploadArea.addEventListener('dragleave', () => { uploadArea.classList.remove('dragover'); }); uploadArea.addEventListener('drop', (e) => { e.preventDefault(); uploadArea.classList.remove('dragover'); if (e.dataTransfer.files.length > 0) { uploadFile(e.dataTransfer.files[0]); } }); searchBtn.addEventListener('click', () => { performSearch(); }); searchInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') { performSearch(); } }); async function uploadFile(file) { const formData = new FormData(); formData.append('file', file); showStatus(uploadStatus, 'info', 'Uploading and indexing image...'); try { const response = await fetch('/upload', { method: 'POST', body: formData }); const data = await response.json(); if (response.ok) { showStatus(uploadStatus, 'success', `${data.message}. Total: ${data.total_images} images.`); updateStats(); fileInput.value = ''; } else { showStatus(uploadStatus, 'error', data.error || 'Upload failed'); } } catch (error) { showStatus(uploadStatus, 'error', 'Network error. Please try again.'); } } async function performSearch() { const query = searchInput.value.trim(); if (!query) { showStatus(searchStatus, 'error', 'Please enter a search query'); return; } searchBtn.disabled = true; searchBtn.innerHTML = ' Searching...'; showStatus(searchStatus, 'info', 'Searching...'); resultsSection.style.display = 'none'; try { const response = await fetch('/search', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ query: query }) }); const data = await response.json(); if (response.ok) { displayResults(data.results); showStatus(searchStatus, 'success', `Found ${data.results.length} result(s)`); } else { showStatus(searchStatus, 'error', data.error || 'Search failed'); } } catch (error) { showStatus(searchStatus, 'error', 'Network error. Please try again.'); } finally { searchBtn.disabled = false; searchBtn.innerHTML = ` Search `; } } function displayResults(results) { resultsContainer.innerHTML = ''; if (results.length === 0) { resultsContainer.innerHTML = '
No results found
'; resultsSection.style.display = 'block'; return; } results.forEach(result => { const resultItem = document.createElement('div'); resultItem.className = 'result-item'; resultItem.innerHTML = `