Field Research Plan Generator Field Research Plan Generator 1. Objectives 2. Methodology 3. Logistics 4. Generated Plan Research Title Background & Rationale Research Objectives (one per line) Primary Methodology Contextual Interviews Field Observation (Fly-on-the-wall) Intercept Surveys Usability Testing (in-situ) Mixed Methods Participant Criteria (Screener) Recruitment Plan Research Location(s) Research Team Members (one per line) Project Timeline Load Sample Data Download Plan (PDF) Edit Plan Previous Next Generate Plan Research Location(s): ${planData.locations || "None specified."} Research Team: ${listToHtml(planData.team)} 6. Project Timeline ${textToHtml(planData.timeline)} `; } // --- Event Handlers --- function handleNext() { if (currentTab < 2) { // 2 is the last config tab (index 2) currentTab++; showTab(currentTab); } } function handlePrev() { if (currentTab > 0) { currentTab--; showTab(currentTab); } } function handleGenerate() { saveAllData(); renderPlan(); ui.planTabBtn.disabled = false; // Enable the plan tab currentTab = 3; showTab(currentTab); } function handleTabClick(e) { const clickedTab = e.target.closest('.frpg-tab-link'); if (!clickedTab || clickedTab.disabled) return; const tabIndex = parseInt(clickedTab.dataset.tab); if (tabIndex !== currentTab) { showTab(tabIndex); } } async function handleDownloadPDF() { ui.pdfDownloadBtn.textContent = "Generating..."; ui.pdfDownloadBtn.disabled = true; try { const { jsPDF } = window.jspdf; container.classList.add("frpg-pdf-export-mode"); const canvas = await html2canvas(ui.generatedPlan, { scale: 2 }); container.classList.remove("frpg-pdf-export-mode"); const imgData = canvas.toDataURL("image/png"); const pdf = new jsPDF({ orientation: "p", unit: "mm", format: "a4" }); const pdfWidth = pdf.internal.pageSize.getWidth(); const margin = 15; const contentWidth = pdfWidth - margin * 2; const imgHeight = (canvas.height * contentWidth) / canvas.width; pdf.addImage(imgData, "PNG", margin, margin, contentWidth, imgHeight); pdf.save(`${(planData.title || "Field_Research_Plan").replace(/ /g, "_")}.pdf`); } catch (error) { console.error("PDF Generation Error:", error); alert("An error occurred while creating the PDF."); } finally { ui.pdfDownloadBtn.textContent = "Download Plan (PDF)"; ui.pdfDownloadBtn.disabled = false; } } // --- Initial Setup & Event Listeners --- ui.prevBtn.addEventListener('click', handlePrev); ui.nextBtn.addEventListener('click', handleNext); ui.generateBtn.addEventListener('click', handleGenerate); ui.loadSampleBtn.addEventListener('click', loadSampleData); ui.editPlanBtn.addEventListener('click', () => showTab(0)); ui.pdfDownloadBtn.addEventListener('click', handleDownloadPDF); container.querySelector('.frpg-tabs').addEventListener('click', handleTabClick); // Initial setup showTab(0); });