let currentResults = null; let searchInProgress = false; let downloadInProgress = false; let loadMoreInProgress = false; let selectedBooks = new Set(); let currentQuery = ""; let currentPage = 1; let totalPagesAvailable = 0; let headlessMode = true; let totalBooksCount = 0; async function searchBooks(resetResults = true) { if (searchInProgress) { return; } const query = document.getElementById("query").value.trim(); const headless = document.getElementById("headless").checked; headlessMode = headless; currentQuery = query; if (!query) { showError("Vui lòng nhập từ khóa tìm kiếm"); return; } if (query.length < 2) { showError("Từ khóa phải có ít nhất 2 ký tự"); return; } searchInProgress = true; if (resetResults) { selectedBooks.clear(); currentPage = 1; currentResults = null; } document.getElementById("loadingIndicator").style.display = "block"; document.getElementById("loadingMessage").textContent = resetResults ? "Đang tìm kiếm sách..." : `Đang tải trang ${currentPage + 1}...`; document.getElementById("errorMessage").style.display = "none"; if (resetResults) { document.getElementById("resultsContent").innerHTML = ""; } document.getElementById("progressText").textContent = "Đang khởi tạo..."; const searchBtn = document.getElementById("searchBtn"); searchBtn.disabled = true; searchBtn.textContent = resetResults ? "Đang tìm..." : "Đang tải..."; try { const nextPage = resetResults ? 1 : currentPage + 1; const response = await fetch("/scraperZLibrary/api/search", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ query: query, page: nextPage, headless: headless, }), }); const data = await response.json(); if (data.success) { if (resetResults) { currentResults = data; currentPage = data.current_page || 1; totalPagesAvailable = data.total_pages || 1; totalBooksCount = data.total_books_count || data.books.length; displayResults(data); } else { // Merge new books with existing results if (currentResults) { currentResults.books = [...currentResults.books, ...data.books]; currentResults.total_count = currentResults.books.length; currentPage = data.current_page; totalPagesAvailable = data.total_pages; totalBooksCount = data.total_books_count || totalBooksCount; appendBooksToGrid( data.books, currentResults.books.length - data.books.length, ); updateStatsBar(currentResults); updateResultCount(); updateSelectionInfo(); } else { currentResults = data; currentPage = data.current_page || 1; totalPagesAvailable = data.total_pages || 1; totalBooksCount = data.total_books_count || data.books.length; displayResults(data); } } } else { showError(data.error || "Có lỗi xảy ra khi tìm kiếm"); } } catch (error) { console.error("Search error:", error); showError("Không thể kết nối đến máy chủ."); } finally { searchInProgress = false; loadMoreInProgress = false; document.getElementById("loadingIndicator").style.display = "none"; searchBtn.disabled = false; searchBtn.textContent = "Tìm kiếm"; } } async function loadMoreBooks() { if (loadMoreInProgress || searchInProgress) { return; } if (currentPage >= totalPagesAvailable) { alert("Đã tải hết tất cả các trang!"); return; } loadMoreInProgress = true; await searchBooks(false); } function appendBooksToGrid(newBooks, startIndex) { const booksGrid = document.querySelector(".books-grid"); if (!booksGrid) return; let html = ""; newBooks.forEach((book, idx) => { const index = startIndex + idx; const bookId = `book-${index}`; html += `
Thử từ khóa khác hoặc kiểm tra lại chính tả
Từ khóa: "${escapeHtml(data.query)}"
${escapeHtml(message)}
Vui lòng thử lại với từ khóa khác.