`;
});
return html;
};
const initializeAssessment = () => {
document.getElementById('hipaaTab').innerHTML = generateAssessmentHTML('HIPAA Assessment', assessmentData['HIPAA Assessment']);
document.getElementById('starkAksTab').innerHTML = generateAssessmentHTML('Stark & Anti-Kickback', assessmentData['Stark & Anti-Kickback']);
document.getElementById('emtalaTab').innerHTML = generateAssessmentHTML('EMTALA Assessment', assessmentData['EMTALA Assessment']);
caseInfo.facility = document.getElementById('setupFacilityName').value;
caseInfo.assessor = document.getElementById('setupAssessorName').value;
document.getElementById('dashFacilityName').textContent = caseInfo.facility;
document.getElementById('setupTab').classList.remove('active');
tabBar.style.display = 'flex';
navBar.style.display = 'flex';
showTab(1); // Start on first assessment tab
};
const calculateScores = () => {
const scores = {};
const riskItems = [];
let totalPossible = 0;
let totalScored = 0;
Object.keys(assessmentData).forEach(category => {
let categoryPossible = 0;
let categoryScored = 0;
assessmentData[category].forEach(item => {
const checked = document.querySelector(`input[name="${item.id}"]:checked`);
if (checked) {
const value = parseInt(checked.value);
if (value !== -1) { // Not N/A
categoryPossible += 2;
categoryScored += value;
if(value < 2) {
riskItems.push({
category,
question: item.q,
status: value === 1 ? "Partially Compliant" : "Not Compliant"
});
}
}
}
});
scores[category] = (categoryPossible > 0) ? Math.round((categoryScored / categoryPossible) * 100) : 100;
totalPossible += categoryPossible;
totalScored += categoryScored;
});
scores.overall = (totalPossible > 0) ? Math.round((totalScored / totalPossible) * 100) : 100;
return { scores, riskItems };
};
const createProgressBar = (title, score) => {
let barColor = 'var(--progress-bar-high)';
if (score < 50) barColor = 'var(--progress-bar-low)';
else if (score < 85) barColor = 'var(--progress-bar-medium)';
return `
`;
};
const updateDashboard = () => {
const { scores, riskItems } = calculateScores();
// Overall Score Circle
const scoreCircle = document.getElementById('scoreCircle');
const circumference = 2 * Math.PI * 54;
const offset = circumference - (scores.overall / 100) * circumference;
scoreCircle.style.strokeDashoffset = offset;
document.getElementById('overallScoreDisplay').textContent = `${scores.overall}%`;
let riskLevel = 'High Compliance';
let riskColor = 'var(--progress-bar-high)';
if (scores.overall < 50) { riskLevel = 'High Risk'; riskColor = 'var(--progress-bar-low)'; }
else if (scores.overall < 85) { riskLevel = 'Medium Risk'; riskColor = 'var(--progress-bar-medium)'; }
document.getElementById('overallRiskLevel').textContent = riskLevel;
document.getElementById('overallRiskLevel').style.color = riskColor;
scoreCircle.style.stroke = riskColor;
// Category Scores
document.getElementById('hipaaScoreContainer').innerHTML = createProgressBar('HIPAA Compliance', scores['HIPAA Assessment']);
document.getElementById('starkAksScoreContainer').innerHTML = createProgressBar('Stark & Anti-Kickback', scores['Stark & Anti-Kickback']);
document.getElementById('emtalaScoreContainer').innerHTML = createProgressBar('EMTALA Compliance', scores['EMTALA Assessment']);
// Risk Items
const riskContainer = document.getElementById('riskItemsContainer');
if (riskItems.length > 0) {
riskContainer.innerHTML = '
${title}
${score}%
- ' + riskItems.map(item =>
`
- [${item.status}] ${item.category}: ${item.question} ` ).join('') + '
Congratulations! No compliance gaps were identified.
'; } showTab(0); }; const generatePdf = () => { const { jsPDF } = window.jspdf; const dashboardContent = document.getElementById('dashboardContent'); html2canvas(dashboardContent, { scale: 2, useCORS: true }).then(canvas => { const imgData = canvas.toDataURL('image/png'); const pdf = new jsPDF({ orientation: 'portrait', unit: 'pt', format: 'a4' }); const pdfWidth = pdf.internal.pageSize.getWidth(); const margin = 40; const usableWidth = pdfWidth - margin * 2; const imgProps = pdf.getImageProperties(imgData); const pdfHeight = (imgProps.height * usableWidth) / imgProps.width; pdf.addImage(imgData, 'PNG', margin, margin, usableWidth, pdfHeight); pdf.save(`${(caseInfo.facility || 'Compliance_Report').replace(/\s/g, '_')}.pdf`); }).catch(err => { console.error("PDF Generation Error:", err); }); }; // --- Event Listeners --- document.querySelectorAll('[data-tab]').forEach((tab, index) => { tab.addEventListener('click', () => showTab(index)); }); nextButton.addEventListener('click', () => { if (currentTab < tabKeys.length - 1) showTab(currentTab + 1); }); prevButton.addEventListener('click', () => { if (currentTab > 1) showTab(currentTab - 1); }); startAssessmentButton.addEventListener('click', initializeAssessment); updateDashboardButton.addEventListener('click', updateDashboard); downloadPdfButton.addEventListener('click', generatePdf); });