Please enter valid numbers for at least one option.
';
downloadPdfBtn.style.display = 'none';
return;
}
let outputHTML = '
Results
';
const resultsData = []; // Data for PDF
let hourlyAnnualEquivalent = 0;
if (hourlyRate > 0 && hoursPerWeek > 0) {
hourlyAnnualEquivalent = hourlyRate * hoursPerWeek * 52;
outputHTML += `
Hourly Wage Annual Equivalent: ${formatCurrency(hourlyAnnualEquivalent)}
`;
resultsData.push(["Hourly Wage Annual Equivalent", formatCurrency(hourlyAnnualEquivalent)]);
}
let salaryWeeklyEquivalent = 0;
let salaryHourlyEquivalent = 0;
if (annualSalary > 0) {
salaryWeeklyEquivalent = annualSalary / 52;
salaryHourlyEquivalent = annualSalary / (hoursPerWeek > 0 ? hoursPerWeek * 52 : 40 * 52); // Use 40 hrs/week if not specified
outputHTML += `
Annual Salary Weekly Equivalent: ${formatCurrency(salaryWeeklyEquivalent)}
`;
resultsData.push(["Annual Salary Weekly Equivalent", formatCurrency(salaryWeeklyEquivalent)]);
// Only show hourly equivalent if hours per week is provided, or note assumption
const hourlyAssumption = hoursPerWeek > 0 ? `${hoursPerWeek} hours/week` : '40 hours/week (standard assumption)';
outputHTML += `
Annual Salary Hourly Equivalent (${hourlyAssumption}): ${formatCurrency(salaryHourlyEquivalent)}
`;
resultsData.push([`Annual Salary Hourly Equivalent (${hourlyAssumption})`, formatCurrency(salaryHourlyEquivalent)]);
}
// Comparison
let comparisonHTML = '';
let comparisonText = '';
let comparisonClass = '';
if (hourlyAnnualEquivalent > 0 && annualSalary > 0) {
const difference = hourlyAnnualEquivalent - annualSalary;
if (difference > 0) {
comparisonText = `Hourly wage (${formatCurrency(hourlyAnnualEquivalent)}) is better than Annual Salary (${formatCurrency(annualSalary)}) by ${formatCurrency(difference)} annually.`;
comparisonClass = 'positive';
} else if (difference < 0) {
comparisonText = `Annual Salary (${formatCurrency(annualSalary)}) is better than Hourly wage (${formatCurrency(hourlyAnnualEquivalent)}) by ${formatCurrency(Math.abs(difference))} annually.`;
comparisonClass = 'negative';
} else {
comparisonText = `Hourly wage and Annual Salary are equivalent (${formatCurrency(hourlyAnnualEquivalent)}).`;
comparisonClass = 'equal';
}
outputHTML += `
${comparisonText}
`;
resultsData.push(["Comparison", comparisonText]);
} else if (hourlyAnnualEquivalent > 0) {
comparisonText = `Calculated Annual Equivalent from Hourly Wage: ${formatCurrency(hourlyAnnualEquivalent)}`;
outputHTML += `
${comparisonText}
`;
resultsData.push(["Calculation Summary", comparisonText]);
} else if (annualSalary > 0) {
comparisonText = `Calculated Equivalents from Annual Salary (Weekly: ${formatCurrency(salaryWeeklyEquivalent)}, Hourly: ${formatCurrency(salaryHourlyEquivalent)}).`;
outputHTML += `
${comparisonText}
`;
resultsData.push(["Calculation Summary", comparisonText]);
}
resultsArea.innerHTML = outputHTML;
downloadPdfBtn.style.display = 'block'; // Show PDF button after calculation
resultsArea.dataset.results = JSON.stringify(resultsData); // Store data for PDF
}
// Event listener for calculate button
calculateBtn.addEventListener('click', calculateAndDisplay);
// Allow calculation on pressing Enter in input fields
hourlyRateInput.addEventListener('keypress', function(event) { if (event.key === 'Enter') { calculateAndDisplay(); } });
hoursPerWeekInput.addEventListener('keypress', function(event) { if (event.key === 'Enter') { calculateAndDisplay(); } });
annualSalaryInput.addEventListener('keypress', function(event) { if (event.key === 'Enter') { calculateAndDisplay(); } });
// Function to generate PDF
downloadPdfBtn.addEventListener('click', function() {
const { jsPDF } = window.jspdf;
const doc = new jsPDF();
const resultsData = JSON.parse(resultsArea.dataset.results || '[]');
if (resultsData.length === 0) {
alert("No results to download.");
return;
}
// --- PDF Styling (Matching CSS color scheme) ---
const primaryColor = getComputedStyle(document.documentElement).getPropertyValue('--primary-color').trim();
const textColor = getComputedStyle(document.documentElement).getPropertyValue('--text-color').trim();
const outputBackgroundColor = getComputedStyle(document.documentElement).getPropertyValue('--output-background').trim();
doc.setFontSize(18);
doc.setTextColor(primaryColor);
doc.text("Hourly Wage vs. Salary Calculation Results", 14, 22);
doc.setFontSize(12);
doc.setTextColor(textColor);
// Add inputs to PDF first
let yPos = 35;
doc.text("Inputs:", 14, yPos);
yPos += 7;
doc.setFontSize(10);
doc.text(`Hourly Rate: ${hourlyRateInput.value ? '$' + hourlyRateInput.value : 'Not entered'}`, 14, yPos);
yPos += 7;
doc.text(`Hours Per Week: ${hoursPerWeekInput.value ? hoursPerWeekInput.value : 'Not entered'}`, 14, yPos);
yPos += 7;
doc.text(`Annual Salary: ${annualSalaryInput.value ? '$' + annualSalaryInput.value : 'Not entered'}`, 14, yPos);
yPos += 15; // Add space before results table
doc.setFontSize(12);
doc.setTextColor(primaryColor);
doc.text("Calculated Results:", 14, yPos);
// Add results in a table format using autoTable plugin
doc.autoTable({
startY: yPos + 5,
head: [['Description', 'Value']],
body: resultsData,
theme: 'grid', // Simple grid theme
styles: {
textColor: textColor.substring(1), // Remove # for jspdf
lineColor: '#cccccc', // Border color
lineWidth: 0.1
},
headStyles: {
fillColor: primaryColor.substring(1), // Header background
textColor: '#ffffff', // Header text white
fontStyle: 'bold'
},
bodyStyles: {
fillColor: outputBackgroundColor.substring(1), // Body background
textColor: textColor.substring(1) // Body text color
},
alternateRowStyles: {
fillColor: '#ffffff' // Alternate row background
}
});
doc.save('wage_salary_calculation.pdf');
});
});