`;
}
function updateChart(data) {
const ctx = document.getElementById('analysis-chart').getContext('2d');
const chartData = {
labels: ['Income', 'Expenses', 'Debt Service', 'Cash Flow'],
datasets: [{
data: [data.effectiveGrossIncome, data.totalOperatingExpenses, data.annualMortgage, data.effectiveGrossIncome - data.totalOperatingExpenses - data.annualMortgage],
backgroundColor: ['#22c55e', '#ef4444', '#f97316', '#3b82f6'],
}]
};
if (analysisChart) {
analysisChart.data = chartData;
analysisChart.update();
} else {
analysisChart = new Chart(ctx, {
type: 'doughnut',
data: chartData,
options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { position: 'bottom' } } }
});
}
}
function updateTabs() {
tabs.forEach((tab, i) => tab.classList.toggle('active', i === currentTabIndex));
tabContents.forEach((c, i) => c.classList.toggle('active', i === currentTabIndex));
prevBtn.disabled = currentTabIndex === 0;
nextBtn.disabled = currentTabIndex === tabs.length - 1;
prevBtn.classList.toggle('opacity-50', currentTabIndex === 0);
nextBtn.classList.toggle('opacity-50', currentTabIndex === tabs.length - 1);
}
function setupEventListeners() {
tabsContainer.addEventListener('click', (e) => { if (e.target.classList.contains('tab')) { currentTabIndex = parseInt(e.target.dataset.index); updateTabs(); } });
prevBtn.addEventListener('click', () => { if (currentTabIndex > 0) { currentTabIndex--; updateTabs(); } });
nextBtn.addEventListener('click', () => { if (currentTabIndex < tabs.length - 1) { currentTabIndex++; updateTabs(); } });
tabContentsContainer.addEventListener('input', (e) => {
if (e.target.tagName === 'INPUT') {
const category = e.target.dataset.category;
const key = e.target.dataset.key;
if (appData[category] && appData[category][key]) {
appData[category][key].value = e.target.value;
calculateAll();
}
}
});
document.getElementById('pdf-download-btn').addEventListener('click', generatePdf);
}
function generatePdf() {
const { jsPDF } = jspdf;
const pdf = new jsPDF();
const pdfContainer = document.createElement('div');
pdfContainer.style.cssText = 'position:absolute; left:-9999px; width:800px; padding:20px; font-family:Inter,sans-serif; color:#1f2937; background:white;';
const chartCanvas = document.getElementById('analysis-chart');
const chartImgData = chartCanvas.toDataURL('image/png', 1.0);
let html = `
Investment Analysis Report
`;
for (const category in appData) {
if (category === 'Dashboard') continue;
html += `
${category}
`;
for (const key in appData[category]) {
const item = appData[category][key];
html += `| ${item.label}: | ${item.prefix || ''}${item.value}${item.suffix || ''} |
`;
}
html += '
';
}
pdfContainer.innerHTML = html;
document.body.appendChild(pdfContainer);
html2canvas(pdfContainer, { scale: 2 }).then(canvas => {
const imgData = canvas.toDataURL('image/png');
const { width, height } = pdf.internal.pageSize;
const imgHeight = canvas.height * width / canvas.width;
pdf.addImage(imgData, 'PNG', 0, 0, width, imgHeight);
pdf.save('low-income-housing-analysis.pdf');
document.body.removeChild(pdfContainer);
});
}
initialize();
});