Total Interest
${document.getElementById('total-interest').textContent}
Total Paid
${document.getElementById('total-paid').textContent}
`;
document.getElementById('pdf-chart-img').src = balanceChart ? balanceChart.toBase64Image() : '';
document.querySelector('#pdf-schedule-table tbody').innerHTML = scheduleData.map(row => `
| ${row.paymentNumber} | ${row.date} | ${formatCurrency(row.principal)} |
${formatCurrency(row.interest)} | ${document.getElementById('monthly-payment').textContent} | ${formatCurrency(row.endingBalance)} |
`).join('');
const contentToPrint = document.getElementById('pdf-output');
contentToPrint.style.display = 'block';
try {
const canvas = await html2canvas(contentToPrint, { scale: 2 });
const { jsPDF } = window.jspdf;
const imgData = canvas.toDataURL('image/png');
const pdf = new jsPDF({ orientation: 'landscape', unit: 'pt', format: 'a4' });
const pdfWidth = pdf.internal.pageSize.getWidth();
const pdfHeight = (canvas.height * pdfWidth) / canvas.width;
pdf.addImage(imgData, 'PNG', 0, 0, pdfWidth, pdfHeight);
pdf.save('Loan-Amortization-Report.pdf');
} catch (err) {
console.error("Error generating PDF:", err);
alert("Could not generate PDF.");
} finally {
contentToPrint.style.display = 'none';
}
}
// --- EVENT LISTENERS ---
calculateBtn.addEventListener('click', calculateAndDisplay);
downloadPdfBtn.addEventListener('click', handlePdfDownload);
// --- INITIALIZATION ---
// Set default date to today
const today = new Date();
const yyyy = today.getFullYear();
const mm = String(today.getMonth() + 1).padStart(2, '0');
const dd = String(today.getDate()).padStart(2, '0');
startDateInput.value = `${yyyy}-${mm}-${dd}`;
lucide.createIcons();
});