`;
});
} else {
outputHtml = "";
}
if(strategyOutputEl) strategyOutputEl.innerHTML = outputHtml;
}
function hasFederalLoans() {
return userData.inputs.loanTypes.some(type => type.startsWith('direct_') || type === 'grad_plus' || type === 'parent_plus' || type === 'perkins' || type === 'ffel');
}
function hasPrivateLoans() {
return userData.inputs.loanTypes.includes('private');
}
if (nextButton) {
nextButton.addEventListener('click', () => {
let canProceed = false;
if (currentTab === 0) {
canProceed = validateAndStoreTab1();
} else if (currentTab === 1) {
canProceed = validateAndStoreTab2();
if (canProceed) generateStrategySuggestions();
}
if (canProceed && currentTab < tabContents.length - 1) {
showTab(currentTab + 1);
}
});
}
if (prevButton) { prevButton.addEventListener('click', () => { if (currentTab > 0) { showTab(currentTab - 1); } }); }
if (tabButtons) {
tabButtons.forEach((button, index) => {
button.addEventListener('click', () => {
if (index < currentTab) { showTab(index); }
else if (index === currentTab) { /* Do nothing */ }
else { // Trying to jump forward
let canReach = true;
for (let i = currentTab; i < index; i++) {
if (i === 0) canReach = validateAndStoreTab1();
else if (i === 1) {
canReach = validateAndStoreTab2();
if(canReach) generateStrategySuggestions();
}
if (!canReach) { showTab(i); if(nextButton) nextButton.click(); break; }
}
if (canReach) showTab(index);
}
});
});
}
if (downloadPdfButton) {
downloadPdfButton.addEventListener('click', () => {
clearError(errorTab3El);
if (!userData.inputs.primaryGoal || userData.suggestedStrategies.length === 0) {
displayError(errorTab3El, "Please complete all steps to generate suggestions first."); return;
}
// PDF Libraries check
if (typeof window.jspdf === 'undefined' || typeof window.jspdf.jsPDF === 'undefined') {
displayError(errorTab3El, 'PDF generation library (jsPDF core) is not loaded.'); return;
}
const JSPDFConstructor = window.jspdf.jsPDF;
const doc = new JSPDFConstructor('p', 'pt', 'a4');
if (typeof doc.autoTable !== 'function') {
displayError(errorTab3El, 'PDF table plugin (jsPDF-AutoTable) is not functional.'); return;
}
let finalY = 40;
const pageWidth = doc.internal.pageSize.getWidth();
const margin = 40;
const contentWidth = pageWidth - 2 * margin;
doc.setFontSize(16);
doc.text("Student Loan Repayment Strategy Suggestions (U.S. System)", pageWidth / 2, finalY, { align: 'center' });
finalY += 25;
doc.setFontSize(11);
doc.text("Your Profile & Goals:", margin, finalY);
finalY += 15;
const profileData = [
["Loan Types:", userData.inputs.loanTypes.join(', ').replace(/_/g, ' ').replace(/\b\w/g, l => l.toUpperCase())],
["Total Loan Balance:", `$${userData.inputs.totalLoanBalance.toLocaleString()}`],
["Average Interest Rate:", `${userData.inputs.avgInterestRate}%`],
["Annual Income:", `$${userData.inputs.annualIncome.toLocaleString()}`],
["Family Size:", userData.inputs.familySize.toString()],
["Employment Sector:", userData.inputs.employmentSectorText],
["Primary Repayment Goal:", userData.inputs.primaryGoalText],
["Other Considerations:", userData.inputs.otherConsiderationsTexts.length > 0 ? userData.inputs.otherConsiderationsTexts.join('; ') : "None selected"]
];
doc.autoTable({
startY: finalY, head: [['Factor', 'Your Input']], body: profileData, theme: 'grid',
headStyles: {fillColor: [0,115,170], fontSize:10}, styles: {fontSize: 9, cellPadding:3},
columnStyles: { 0: { fontStyle: 'bold', cellWidth: 150} }
});
finalY = doc.lastAutoTable.finalY + 20;
doc.setFontSize(11);
doc.text("Suggested Repayment Strategies:", margin, finalY);
finalY += 15;
userData.suggestedStrategies.forEach(strategy => {
if (finalY > doc.internal.pageSize.getHeight() - 150) { doc.addPage(); finalY = 40; } // Check for page break before new strategy
doc.setFontSize(10);
doc.setFont(undefined, 'bold');
doc.text(strategy.name, margin, finalY);
finalY += 12;
doc.setFont(undefined, 'normal');
doc.setFontSize(9);
const descLines = doc.splitTextToSize(`Description: ${strategy.description}`, contentWidth);
doc.text(descLines, margin, finalY); finalY += descLines.length * 9 + 3;
const goodForLines = doc.splitTextToSize(`Good For: ${strategy.goodFor}`, contentWidth);
doc.text(goodForLines, margin, finalY); finalY += goodForLines.length * 9 + 3;
doc.setFont(undefined, 'bold'); doc.text("Pros:", margin, finalY); doc.setFont(undefined, 'normal');
const prosLines = doc.splitTextToSize(strategy.pros.join(', '), contentWidth - 20); // Small indent for list items
doc.text(prosLines, margin + 10, finalY); finalY += prosLines.length * 9 + 3;
doc.setFont(undefined, 'bold'); doc.text("Cons:", margin, finalY); doc.setFont(undefined, 'normal');
const consLines = doc.splitTextToSize(strategy.cons.join(', '), contentWidth - 20);
doc.text(consLines, margin + 10, finalY); finalY += consLines.length * 9 + 3;
doc.setFont(undefined, 'italic');
const eligLines = doc.splitTextToSize(`General Eligibility: ${strategy.eligibility}`, contentWidth);
doc.text(eligLines, margin, finalY); finalY += eligLines.length * 9 + 8; // Extra space after strategy
doc.setFont(undefined, 'normal');
});
doc.setFontSize(8);
doc.setTextColor(150);
const disclaimerPdf = "Disclaimer: This tool provides general guidance for U.S. student loans based on your inputs and is not financial advice. Loan programs and eligibility can change. Always consult official sources and a financial advisor for personalized advice.";
const splitDisclaimer = doc.splitTextToSize(disclaimerPdf, contentWidth);
if (finalY > doc.internal.pageSize.getHeight() - 40) { doc.addPage(); finalY = 40; }
doc.text(splitDisclaimer, margin, finalY);
doc.save("Student_Loan_Strategy_Guide.pdf");
});
}
// Initialize
showTab(0);
});
