`;
}).join('');
lastResult.paths = paths;
};
// --- PDF Generation ---
const generatePdf = async () => {
if (!lastResult.tree) return;
const treeImage = canvas.toDataURL('image/png');
const tableRows = lastResult.paths.map(path => {
const pathString = path.map(p => p.name).join(', ');
const finalProb = path.reduce((acc, p) => acc * p.prob, 1);
return `
| ${pathString} | ${finalProb.toFixed(4)} |
`;
}).join('');
pdfContentArea.innerHTML = `
Probability Tree Report
Probability Tree Diagram
Final Probabilities
| Path | Probability |
${tableRows}
`;
pdfContentArea.style.display = 'block';
pdfContentArea.style.position = 'absolute';
pdfContentArea.style.left = '-9999px';
pdfContentArea.style.width = '1000px';
try {
const pdfCanvas = await html2canvas(pdfContentArea, { scale: 2 });
const imgData = pdfCanvas.toDataURL('image/png');
const { jsPDF } = window.jspdf;
const pdf = new jsPDF({ orientation: 'portrait', unit: 'px', format: 'a4' });
const pdfWidth = pdf.internal.pageSize.getWidth();
const imgHeight = pdfCanvas.height * pdfWidth / pdfCanvas.width;
pdf.addImage(imgData, 'PNG', 0, 0, pdfWidth, imgHeight);
pdf.save(`Probability-Tree-Report.pdf`);
} catch (error) {
console.error("PDF generation failed:", error);
alert("Could not generate PDF.");
} finally {
pdfContentArea.style.display = 'none';
}
};
const showError = (msg) => {
errorMessage.textContent = msg;
errorMessage.style.display = 'block';
};
// --- Event Listeners ---
addEventBtn.addEventListener('click', () => addEvent());
eventsContainer.addEventListener('click', (e) => {
if (e.target.classList.contains('add-outcome-btn')) {
addOutcome(e.target.previousElementSibling);
}
if (e.target.classList.contains('remove-outcome-btn')) {
e.target.closest('.outcome-item').remove();
}
if (e.target.classList.contains('remove-event-btn')) {
e.target.closest('.event-block').remove();
}
});
generateBtn.addEventListener('click', () => {
errorMessage.style.display = 'none';
const events = parseInputData();
if (events) {
const treeData = generateTreeData(events);
lastResult.tree = treeData;
drawTree(treeData);
displayProbabilities(treeData);
resultsContainer.style.display = 'block';
}
});
downloadPdfBtn.addEventListener('click', generatePdf);
// --- Initial State ---
addEvent(true); // Add the first event block
});