`;
});
container.innerHTML = html;
}
function showTab(tabNumber) {
document.querySelectorAll('.tab-pane').forEach(p => p.classList.add('hidden'));
getEl(`tab-${tabNumber}`).classList.remove('hidden');
document.querySelectorAll('.tab-btn').forEach(b => {
b.classList.toggle('active', b.dataset.tab === `tab-${tabNumber}`);
b.classList.toggle('inactive', b.dataset.tab !== `tab-${tabNumber}`);
});
currentTab = tabNumber;
updateNavigation();
}
function updateNavigation() {
prevBtn.disabled = currentTab === 1;
nextBtn.style.display = currentTab === totalTabs ? 'none' : 'inline-block';
nextBtn.textContent = (currentTab === totalTabs - 1) ? 'Generate Report' : 'Next';
stepIndicator.textContent = `Step ${currentTab} of ${totalTabs}`;
}
function saveTabData() {
if (currentTab === 1) {
appData.companyName = getEl('companyName').value;
appData.policyName = getEl('policyName').value;
appData.policyDate = getEl('policyDate').value;
} else if (currentTab === 2) {
appData.checklistResults = [];
const form = getEl('form-checklist');
checklistQuestions.forEach(q => {
const answer = form.elements[q.id].value;
appData.checklistResults.push({
id: q.id,
text: q.text,
answer: parseInt(answer), // 1 for Yes, 0 for No
recommendation: q.recommendation
});
});
}
}
function validateTab(tabNumber) {
const formId = { 1: 'form-policy-info', 2: 'form-checklist' }[tabNumber];
if (!formId) return true;
const form = getEl(formId);
if (form && !form.checkValidity()) {
form.reportValidity();
return false;
}
return true;
}
function generateReport() {
saveTabData();
const score = appData.checklistResults.reduce((sum, item) => sum + item.answer, 0);
const total = checklistQuestions.length;
const percentage = Math.round((score / total) * 100);
let scoreColor = 'bg-green-500';
let assessment = 'Strong';
if (percentage < 50) { scoreColor = 'bg-red-500'; assessment = 'Needs Significant Improvement'; }
else if (percentage < 80) { scoreColor = 'bg-yellow-500'; assessment = 'Room for Improvement'; }
const recommendations = appData.checklistResults.filter(r => r.answer === 0);
let html = `
`;
getEl('report-container').innerHTML = html;
showTab(3);
}
function handlePdfDownload() {
if (!appData.checklistResults) { alert('Please generate a report first.'); return; }
const { jsPDF } = window.jspdf;
const doc = new jsPDF();
doc.setFontSize(20);
doc.text("Whistleblower Policy Compliance Report", 105, 20, { align: 'center' });
doc.setFontSize(12);
doc.text("Policy Details", 14, 40);
doc.setFontSize(10);
doc.text(`Company: ${appData.companyName}\nPolicy: ${appData.policyName}\nEffective Date: ${appData.policyDate}`, 14, 48);
const score = appData.checklistResults.reduce((sum, item) => sum + item.answer, 0);
const percentage = Math.round((score / checklistQuestions.length) * 100);
doc.setFontSize(12);
doc.text(`Overall Compliance Score: ${percentage}%`, 14, 70);
const tableBody = appData.checklistResults.map(r => [r.text, r.answer === 1 ? 'Yes' : 'No']);
doc.autoTable({
startY: 80,
head: [['Checklist Item', 'Response']],
body: tableBody,
theme: 'grid',
headStyles: { fillColor: [41, 128, 185] },
didParseCell: function(data) {
if (data.section === 'body' && data.column.index === 1) {
if (data.cell.raw === 'No') data.cell.styles.textColor = [220, 53, 69];
}
}
});
let finalY = doc.autoTable.previous.finalY + 15;
const recommendations = appData.checklistResults.filter(r => r.answer === 0);
if(recommendations.length > 0) {
doc.setFontSize(12);
doc.text("Improvement Areas & Recommendations", 14, finalY);
const recText = recommendations.map(r => `- For the issue "${r.text}", it is recommended to:\n ${r.recommendation}`).join('\n\n');
doc.setFontSize(9);
doc.text(recText, 14, finalY + 7, { maxWidth: 180 });
}
doc.setFontSize(8);
doc.setTextColor(150);
doc.text("This report was generated by the Corporate Whistleblower Policy Compliance Tool.", 105, doc.internal.pageSize.height - 10, { align: 'center' });
doc.save(`Whistleblower-Report-${appData.companyName.replace(/\s/g, '_')}.pdf`);
}
// --- Event Listeners & Initialization ---
nextBtn.addEventListener('click', () => {
if (!validateTab(currentTab)) return;
saveTabData();
if (currentTab < totalTabs - 1) {
showTab(currentTab + 1);
} else {
generateReport();
}
});
prevBtn.addEventListener('click', () => {
if (currentTab > 1) {
saveTabData();
showTab(currentTab - 1);
}
});
getEl('download-pdf-btn').addEventListener('click', handlePdfDownload);
// Initial load
populateChecklist();
updateNavigation();
});
Compliance Report
Policy Details
Company: ${appData.companyName}
Policy: ${appData.policyName}
Effective Date: ${appData.policyDate}
Overall Compliance Score
${assessment}
Improvement Areas
${recommendations.length === 0 ? 'Excellent! Your policy appears to meet all key benchmarks in this assessment.
' : `-
${recommendations.map(r => `
- Issue: A 'No' was indicated for: '${r.text}'
Recommendation: ${r.recommendation} `).join('')}
