function initPdfToWord() { const fileInput = document.getElementById("pdfToWordFile"); const fileNameEl = document.getElementById("pdfToWordFileName"); const titleEl = document.getElementById("pdfToWordTitle"); const subtitleEl = document.getElementById("pdfToWordSubtitle"); const chooseTextEl = document.getElementById("pdfToWordChooseText"); const statusEl = document.getElementById("pdfToWordStatus"); const convertBtn = document.getElementById("pdfToWordConvertBtn"); const downloadBtn = document.getElementById("pdfToWordDownloadBtn"); const clearBtn = document.getElementById("pdfToWordClearBtn"); const csrfTokenEl = document.getElementById("csrfToken"); const progressWrap = document.getElementById("pdfToWordProgress"); const progressBar = document.getElementById("pdfToWordProgressBar"); const progressText = document.getElementById("pdfToWordProgressText"); const chooseLabelEl = document.getElementById("pdfToWordChooseLabel"); if (!fileInput || !convertBtn) return; let selectedFile = null; let docxBlob = null; let docxObjectUrl = null; let isConverted = false; function setStatus(text, isError) { if (!statusEl) return; statusEl.textContent = text; statusEl.classList.toggle("status-error", !!isError); statusEl.classList.toggle("status-success", !isError); } function setUploadBoxCopy(mode) { if (!titleEl || !subtitleEl || !chooseTextEl) return; const showChoose = () => { if (!chooseLabelEl) return; chooseLabelEl.hidden = false; chooseLabelEl.style.display = "inline-block"; }; const hideChoose = () => { if (!chooseLabelEl) return; chooseLabelEl.hidden = true; chooseLabelEl.style.display = "none"; }; if (mode === "uploading") { titleEl.textContent = "Uploading your document..."; subtitleEl.textContent = "Please wait while the file upload completes."; chooseTextEl.textContent = "Choose Another PDF"; hideChoose(); return; } if (mode === "converting") { titleEl.textContent = "Processing your document..."; subtitleEl.textContent = "Upload complete. Conversion is running."; chooseTextEl.textContent = "Choose Another PDF"; hideChoose(); return; } if (mode === "completed") { titleEl.textContent = "Conversion complete"; subtitleEl.textContent = "Your DOCX is ready. Click Download DOCX."; chooseTextEl.textContent = "Choose Another PDF"; showChoose(); return; } if (mode === "selected") { titleEl.textContent = "File selected"; subtitleEl.textContent = "Click Convert to DOCX to start conversion."; chooseTextEl.textContent = "Choose Another PDF"; showChoose(); return; } titleEl.textContent = "Upload your PDF document"; subtitleEl.textContent = "Supported format: .pdf (max 25MB)"; chooseTextEl.textContent = "Choose PDF File"; showChoose(); } function resetProgress() { if (progressWrap) progressWrap.style.display = "none"; if (progressText) progressText.style.display = "none"; if (progressBar) progressBar.style.width = "0%"; if (progressText) progressText.textContent = "0%"; if (progressWrap) progressWrap.classList.remove("processing"); } function startProgress() { if (progressWrap) progressWrap.style.display = "block"; if (progressText) progressText.style.display = "block"; if (progressBar) progressBar.style.width = "0%"; if (progressText) progressText.textContent = "0%"; if (progressWrap) progressWrap.classList.remove("processing"); } function updateUi() { const hasFile = !!selectedFile; const hasDocx = !!docxBlob; convertBtn.disabled = !hasFile || isConverted; if (downloadBtn) { downloadBtn.disabled = !hasDocx; downloadBtn.hidden = !hasDocx; } if (clearBtn) clearBtn.disabled = !hasFile; if (fileNameEl) fileNameEl.textContent = hasFile ? selectedFile.name : "No file selected"; } function clearDocxOutput() { docxBlob = null; isConverted = false; if (docxObjectUrl) { URL.revokeObjectURL(docxObjectUrl); docxObjectUrl = null; } } function startConversionIndicator() { if (progressWrap) progressWrap.classList.add("processing"); if (progressBar) progressBar.style.width = "100%"; if (progressText) progressText.textContent = "Converting..."; } function convertFile() { if (!selectedFile || isConverted) return; const formData = new FormData(); formData.append("file", selectedFile); clearDocxOutput(); startProgress(); setStatus("Converting PDF to DOCX...", false); setUploadBoxCopy("uploading"); convertBtn.disabled = true; if (downloadBtn) downloadBtn.disabled = true; const xhr = new XMLHttpRequest(); xhr.open("POST", "/api/pdf-to-word/", true); xhr.responseType = "blob"; if (csrfTokenEl?.value) { xhr.setRequestHeader("X-CSRFToken", csrfTokenEl.value); } xhr.upload.onprogress = (event) => { if (!event.lengthComputable || !progressBar || !progressText) return; const percent = Math.min(100, Math.round((event.loaded / event.total) * 100)); progressBar.style.width = `${percent}%`; progressText.textContent = `${percent}% uploaded`; }; xhr.upload.onload = () => { startConversionIndicator(); setStatus("Upload complete. Converting...", false); setUploadBoxCopy("converting"); }; xhr.onload = async () => { if (xhr.status >= 400) { let errorMessage = "Conversion failed."; try { const text = await xhr.response.text(); const data = JSON.parse(text || "{}"); if (data.error) errorMessage = data.error; if (data.detail) errorMessage = `${errorMessage} (${data.detail})`; } catch { // keep default } setStatus(errorMessage, true); setUploadBoxCopy("selected"); clearDocxOutput(); resetProgress(); updateUi(); return; } docxBlob = xhr.response; docxObjectUrl = URL.createObjectURL(docxBlob); isConverted = true; setStatus("DOCX generated. Click Download DOCX.", false); setUploadBoxCopy("completed"); resetProgress(); updateUi(); }; xhr.onerror = () => { setStatus("Conversion failed.", true); setUploadBoxCopy("selected"); clearDocxOutput(); resetProgress(); updateUi(); }; xhr.send(formData); } function downloadDocx() { if (!docxBlob || !docxObjectUrl || !selectedFile) return; const link = document.createElement("a"); link.href = docxObjectUrl; const baseName = selectedFile.name.replace(/\.pdf$/i, "") || "document"; link.download = `${baseName}.docx`; link.click(); } fileInput.addEventListener("change", () => { const file = fileInput.files && fileInput.files[0]; if (!file) { selectedFile = null; clearDocxOutput(); setStatus("Upload a .pdf file and convert it to DOCX.", false); setUploadBoxCopy("idle"); resetProgress(); updateUi(); return; } if (!file.name.toLowerCase().endsWith(".pdf")) { selectedFile = null; clearDocxOutput(); fileInput.value = ""; setStatus("Only .pdf files are supported.", true); setUploadBoxCopy("idle"); resetProgress(); updateUi(); return; } if (file.size > 25 * 1024 * 1024) { selectedFile = null; clearDocxOutput(); fileInput.value = ""; setStatus("File must be under 25MB.", true); setUploadBoxCopy("idle"); resetProgress(); updateUi(); return; } selectedFile = file; clearDocxOutput(); setStatus("Ready to convert.", false); setUploadBoxCopy("selected"); resetProgress(); updateUi(); }); convertBtn.addEventListener("click", () => { convertFile(); }); if (downloadBtn) { downloadBtn.addEventListener("click", downloadDocx); } if (clearBtn) { clearBtn.addEventListener("click", () => { selectedFile = null; clearDocxOutput(); fileInput.value = ""; setStatus("Upload a .pdf file and convert it to DOCX.", false); setUploadBoxCopy("idle"); resetProgress(); updateUi(); }); } setUploadBoxCopy("idle"); resetProgress(); updateUi(); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", initPdfToWord); } else { initPdfToWord(); }