`;
gslae_domElements.pdfDownloadBtn.classList.remove('gslae-hidden');
}
function gslae_hexToRgb(hex) {
if (!hex || typeof hex !== 'string') return null;
const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
hex = hex.replace(shorthandRegex, function(m, r, g, b) { return r + r + g + g + b + b; });
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result ? { r: parseInt(result[1], 16), g: parseInt(result[2], 16), b: parseInt(result[3], 16) } : null;
}
function gslae_generatePdf() {
if (typeof window.jspdf === 'undefined' || typeof window.jspdf.jsPDF === 'undefined' || typeof window.jspdf.jsPDF.API === 'undefined' || typeof window.jspdf.jsPDF.API.autoTable === 'undefined') {
alert("PDF generation library is not loaded. Please try again later."); return;
}
if (!gslae_validateTab1() || !gslae_validateTab2()) {
alert("Please ensure all inputs are correctly filled before generating PDF.");
if (!gslae_validateTab1()) gslae_navigateToTab('gslae-tab1');
else if (!gslae_validateTab2()) gslae_navigateToTab('gslae-tab2');
return;
}
gslae_calculateAndDisplayAffordability(); // Ensure data is fresh
if (gslae_domElements.resultsContainer.innerHTML.includes("gslae-error-message")) {
alert("Cannot generate PDF due to errors in input or calculation. Please correct them."); return;
}
const ActualJsPDF = window.jspdf.jsPDF;
const doc = new ActualJsPDF();
const { annualSalary, incomePercentage, grossMonthlyIncome, affordableMonthlyPayment, interestRate, termYears,
affordableLoanAmount, totalRepaid, totalInterestPaid } = gslae_loanData;
doc.setFontSize(18);
const primaryColorRGB = gslae_hexToRgb(getComputedStyle(document.documentElement).getPropertyValue('--gslae-primary-color').trim());
const secondaryColorRGB = gslae_hexToRgb(getComputedStyle(document.documentElement).getPropertyValue('--gslae-secondary-color').trim());
const accentColorRGB = gslae_hexToRgb(getComputedStyle(document.documentElement).getPropertyValue('--gslae-accent-color').trim());
if (primaryColorRGB) doc.setTextColor(primaryColorRGB.r, primaryColorRGB.g, primaryColorRGB.b); else doc.setTextColor(0,121,107);
doc.text("Grad School Loan Affordability Estimate", 105, 22, null, null, "center");
doc.setFontSize(12);
doc.setTextColor(33, 37, 41); // --gslae-text-color
let startY = 35;
const tableHeadFillColor = secondaryColorRGB ? [secondaryColorRGB.r, secondaryColorRGB.g, secondaryColorRGB.b] : [0,77,64];
doc.setFontSize(14);
if (secondaryColorRGB) doc.setTextColor(secondaryColorRGB.r, secondaryColorRGB.g, secondaryColorRGB.b); else doc.setTextColor(0,77,64);
doc.text("Your Inputs & Assumptions", 14, startY); startY += 8;
doc.autoTable({
startY: startY, theme: 'grid', headStyles: { fillColor: tableHeadFillColor, textColor: 255 },
body: [
["Estimated Annual Post-Graduation Salary:", gslae_formatCurrency(annualSalary)],
["Percentage of Income for Loan Payments:", gslae_formatPercent(incomePercentage,0)],
["Resulting Gross Monthly Income:", gslae_formatCurrency(grossMonthlyIncome)],
["Resulting Affordable Monthly Payment:", gslae_formatCurrency(affordableMonthlyPayment)],
["Assumed Annual Loan Interest Rate:", gslae_formatPercent(interestRate)],
["Assumed Loan Repayment Term:", `${termYears} years`],
], margin: { left: 14, right: 14 },
styles: { fontSize: 10 }, headStyles: { fontSize: 11 }, bodyStyles: { cellPadding: 2.5 }
});
startY = doc.autoTable.previous.finalY + 12;
doc.setFontSize(14);
if (secondaryColorRGB) doc.setTextColor(secondaryColorRGB.r, secondaryColorRGB.g, secondaryColorRGB.b); else doc.setTextColor(0,77,64);
doc.text("Estimated Loan Affordability", 14, startY); startY += 8;
doc.autoTable({
startY: startY, theme: 'grid', headStyles: { fillColor: tableHeadFillColor, textColor: 255 },
body: [
[{content: "Estimated Total Loan Amount You Might Afford:", styles: {fontStyle: 'bold'}},
{content: gslae_formatCurrency(affordableLoanAmount), styles: {fontStyle: 'bold', fontSize: 11, textColor: accentColorRGB ? [accentColorRGB.r, accentColorRGB.g, accentColorRGB.b] : [255,171,64]}}],
["Total Amount You'd Pay Over Loan Life:", gslae_formatCurrency(totalRepaid)],
["Total Interest You'd Pay Over Loan Life:", gslae_formatCurrency(totalInterestPaid)],
], margin: { left: 14, right: 14 },
styles: { fontSize: 10 }, headStyles: { fontSize: 11 }, bodyStyles: { cellPadding: 2.5 }
});
startY = doc.autoTable.previous.finalY + 15;
doc.setFontSize(11);
doc.setTextColor(33, 37, 41);
doc.text("Important Considerations:", 14, startY); startY += 7;
doc.setFontSize(9);
const guidance1 = "This is an estimate to help you think about potential loan amounts. Actual loan affordability depends on many personal financial factors including your full budget after graduation (taxes, living expenses, savings goals, other debts).";
const guidance2 = "It's often wise to borrow less than the maximum estimated amount if possible. Thoroughly research your chosen field's earning potential and explore all options to reduce borrowing, such as scholarships, grants, and assistantships.";
const splitGuidance1 = doc.splitTextToSize(guidance1, doc.internal.pageSize.width - 28);
doc.text(splitGuidance1, 14, startY);
startY += (splitGuidance1.length * (doc.getLineHeight() / doc.internal.scaleFactor)) + 4;
const splitGuidance2 = doc.splitTextToSize(guidance2, doc.internal.pageSize.width - 28);
doc.text(splitGuidance2, 14, startY);
doc.setFontSize(9);
doc.setTextColor(120);
doc.text(`Report generated on: ${new Date().toLocaleDateString()} ${new Date().toLocaleTimeString()}`, 14, doc.internal.pageSize.height - 10);
doc.save("Grad_School_Loan_Affordability_Estimate.pdf");
}
// Ensure this function is globally available if called by oninput
window.gslae_updateAffordablePaymentDisplay = gslae_updateAffordablePaymentDisplay;
window.gslae_switchTab = gslae_switchTab;
window.gslae_navigateToTab = gslae_navigateToTab;
window.gslae_generatePdf = gslae_generatePdf;