function initWordToPdf() { const fileInput = document.getElementById("wordToPdfFile"); const fileNameEl = document.getElementById("wordToPdfFileName"); const titleEl = document.getElementById("wordToPdfTitle"); const subtitleEl = document.getElementById("wordToPdfSubtitle"); const chooseTextEl = document.getElementById("wordToPdfChooseText"); const statusEl = document.getElementById("wordToPdfStatus"); const convertBtn = document.getElementById("wordToPdfConvertBtn"); const downloadBtn = document.getElementById("wordToPdfDownloadBtn"); const clearBtn = document.getElementById("wordToPdfClearBtn"); const csrfTokenEl = document.getElementById("csrfToken"); const progressWrap = document.getElementById("wordToPdfProgress"); const progressBar = document.getElementById("wordToPdfProgressBar"); const progressText = document.getElementById("wordToPdfProgressText"); const chooseLabelEl = document.getElementById("wordToPdfChooseLabel"); if (!fileInput || !convertBtn) return; let selectedFile = null; let pdfBlob = null; let pdfObjectUrl = 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 DOCX"; hideChoose(); return; } if (mode === "converting") { titleEl.textContent = "Processing your document..."; subtitleEl.textContent = "Upload complete. Conversion is running."; chooseTextEl.textContent = "Choose Another DOCX"; hideChoose(); return; } if (mode === "completed") { titleEl.textContent = "Conversion complete"; subtitleEl.textContent = "Your PDF is ready. Click Download PDF."; chooseTextEl.textContent = "Choose Another DOCX"; showChoose(); return; } if (mode === "selected") { titleEl.textContent = "File selected"; subtitleEl.textContent = "Click Convert to PDF to start conversion."; chooseTextEl.textContent = "Choose Another DOCX"; showChoose(); return; } titleEl.textContent = "Upload your Word document"; subtitleEl.textContent = "Supported format: .docx (max 25MB)"; chooseTextEl.textContent = "Choose DOCX 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 hasPdf = !!pdfBlob; convertBtn.disabled = !hasFile || isConverted; if (downloadBtn) { downloadBtn.disabled = !hasPdf; downloadBtn.hidden = !hasPdf; } if (clearBtn) clearBtn.disabled = !hasFile; if (fileNameEl) fileNameEl.textContent = hasFile ? selectedFile.name : "No file selected"; } function clearPdfOutput() { pdfBlob = null; isConverted = false; if (pdfObjectUrl) { URL.revokeObjectURL(pdfObjectUrl); pdfObjectUrl = 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); clearPdfOutput(); startProgress(); setStatus("Converting document to PDF...", false); setUploadBoxCopy("uploading"); convertBtn.disabled = true; if (downloadBtn) downloadBtn.disabled = true; const xhr = new XMLHttpRequest(); xhr.open("POST", "/api/word-to-pdf/", 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; } catch { // keep default } setStatus(errorMessage, true); clearPdfOutput(); resetProgress(); updateUi(); return; } pdfBlob = xhr.response; pdfObjectUrl = URL.createObjectURL(pdfBlob); isConverted = true; setStatus("PDF generated. Click Download PDF.", false); setUploadBoxCopy("completed"); resetProgress(); updateUi(); }; xhr.onerror = () => { setStatus("Conversion failed.", true); setUploadBoxCopy("selected"); clearPdfOutput(); resetProgress(); updateUi(); }; xhr.send(formData); } function downloadPdf() { if (!pdfBlob || !pdfObjectUrl || !selectedFile) return; const link = document.createElement("a"); link.href = pdfObjectUrl; const baseName = selectedFile.name.replace(/\.docx$/i, "") || "document"; link.download = `${baseName}.pdf`; link.click(); } fileInput.addEventListener("change", () => { const file = fileInput.files && fileInput.files[0]; if (!file) { selectedFile = null; clearPdfOutput(); setStatus("Upload a .docx file and convert it to PDF.", false); setUploadBoxCopy("idle"); resetProgress(); updateUi(); return; } if (!file.name.toLowerCase().endsWith(".docx")) { selectedFile = null; clearPdfOutput(); fileInput.value = ""; setStatus("Only .docx files are supported.", true); setUploadBoxCopy("idle"); resetProgress(); updateUi(); return; } if (file.size > 25 * 1024 * 1024) { selectedFile = null; clearPdfOutput(); fileInput.value = ""; setStatus("File must be under 25MB.", true); setUploadBoxCopy("idle"); resetProgress(); updateUi(); return; } selectedFile = file; clearPdfOutput(); setStatus("Ready to convert.", false); setUploadBoxCopy("selected"); resetProgress(); updateUi(); }); convertBtn.addEventListener("click", () => { convertFile(); }); if (downloadBtn) { downloadBtn.addEventListener("click", downloadPdf); } if (clearBtn) { clearBtn.addEventListener("click", () => { selectedFile = null; clearPdfOutput(); fileInput.value = ""; setStatus("Upload a .docx file and convert it to PDF.", false); setUploadBoxCopy("idle"); resetProgress(); updateUi(); }); } setUploadBoxCopy("idle"); resetProgress(); updateUi(); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", initWordToPdf); } else { initWordToPdf(); }