`;
}).join('');
// Positive signals
document.getElementById('positiveSignals').innerHTML = (data.positiveSignals || []).map(s =>
`
${s}`
).join('');
// Verify yourself
document.getElementById('verifyList').innerHTML = (data.verifyYourself || []).map(s =>
`
${s}`
).join('');
// Questions
document.getElementById('questionsList').innerHTML = (data.questionsToAsk || []).map((q, i) =>
`
${i+1}
${q}`
).join('');
document.getElementById('demoBanner').classList.toggle('visible', !!isDemo);
document.getElementById('results').classList.add('visible');
document.getElementById('results').scrollIntoView({ behavior: 'smooth', block: 'start' });
}
function getFormData() {
const assetClasses = [...document.querySelectorAll('.checkbox-item input:checked')].map(c => c.value);
return {
name: document.getElementById('sponsorName').value.trim(),
website: document.getElementById('websiteUrl').value.trim(),
linkedin: document.getElementById('linkedinUrl').value.trim(),
state: document.getElementById('stateOp').value.trim(),
dealCount: parseInt(document.getElementById('dealCount').value) || 0,
yearsActive: parseInt(document.getElementById('yearsActive').value) || 0,
assetClasses
};
}
function loadDemo() {
document.getElementById('sponsorName').value = 'Apex Capital Group';
document.getElementById('websiteUrl').value = 'https://apexcapitalgroup.com';
document.getElementById('linkedinUrl').value = 'https://linkedin.com/in/johnapex';
document.getElementById('stateOp').value = 'Texas';
document.getElementById('dealCount').value = '12';
document.getElementById('yearsActive').value = '8';
document.querySelectorAll('.checkbox-item input').forEach(cb => {
cb.checked = ['multifamily', 'industrial'].includes(cb.value);
});
document.getElementById('errorMsg').classList.remove('visible');
renderResults(DEMO_DATA, true, 'Apex Capital Group');
}
async function runAudit() {
const data = getFormData();
if (!data.name) {
showError('Please enter a sponsor name.');
return;
}
document.getElementById('errorMsg').classList.remove('visible');
document.getElementById('results').classList.remove('visible');
document.getElementById('loading').classList.add('visible');
document.getElementById('auditBtn').disabled = true;
try {
const res = await fetch('/api/audit-sponsor', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
});
if (!res.ok) {
const err = await res.json().catch(() => ({ error: 'Unknown error' }));
throw new Error(err.error || `HTTP ${res.status}`);
}
const result = await res.json();
renderResults(result, false, data.name);
} catch (err) {
if (err.message.includes('fetch') || err.message.includes('Failed') || err.message.includes('NetworkError')) {
showError('Cannot reach the backend. Showing demo results instead.');
renderResults(DEMO_DATA, true, data.name || 'Demo Sponsor');
} else {
showError('Audit failed: ' + err.message);
}
} finally {
document.getElementById('loading').classList.remove('visible');
document.getElementById('auditBtn').disabled = false;
}
}
function showError(msg) {
const el = document.getElementById('errorMsg');
el.textContent = msg;
el.classList.add('visible');
}