/** * xxxiii.io/fraud — inline results, never blank page on submit. */ (function () { var global = typeof window !== 'undefined' ? window : this; var SERVICE_DOWN = 'Analysis service temporarily unavailable — try again or visit blockchainfraud.org'; function levelFromScore(score) { if (score >= 75) return 'Critical'; if (score >= 55) return 'High'; if (score >= 30) return 'Medium'; return 'Low'; } function normalizeLevel(raw) { if (!raw) return null; var t = String(raw).trim().replace(/[^A-Za-z]/g, ''); if (!t) return null; var cap = t.charAt(0).toUpperCase() + t.slice(1).toLowerCase(); return ['Low', 'Medium', 'High', 'Critical'].indexOf(cap) >= 0 ? cap : null; } function engineDisplayName(header, metaEngine) { if (metaEngine) return metaEngine.replace(/-/g, ' ').replace(/v(\d)/, 'v$1'); if (!header) return 'GMIIE Fraud Engine v2.1.0'; var h = String(header).toLowerCase(); if (h.indexOf('grok') >= 0) return 'GMIIE Analysis'; if (h.indexOf('gmiie-fraud-engine') >= 0) return 'GMIIE Fraud Engine v2.1.0'; if (h === 'edge-fallback-v2' || h === 'edge-fallback') return 'GMIIE Fraud Engine v2.1.0'; if (h.indexOf('python') >= 0) return 'Python Pipeline'; return 'GMIIE Fraud Engine v2.1.0'; } function parseReportMeta(html) { var s = String(html); var score = null; var patterns = [ /data-fraud-score=["']?(\d+)/i, /name="fraud-score"\s+content="(\d+)"/i, /Risk score:\s*(\d+)\s*\/\s*100/i, /class="risk-score-display"[^>]*>\s*(\d+)\s*\/\s*100/i, /class="score"[^>]*>\s*(\d+)\s*\/\s*100/i, /
' + scored.level + ' risk — take recovery action now.
' + 'View recovery steps for your situationReport returned but score could not be parsed. ' + SERVICE_DOWN + '
'; return; } var blobUrl = URL.createObjectURL(new Blob([html], { type: 'text/html' })); var speakText = reportSpeakSummary(scored); notifyVoiceDesk(scored); results.innerHTML = '' + formatSummaryLine(scored) + '
' + reportActionsHtml(scored, speakText) + ''; bindPdfButton(results, form); results.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); } function showJsonReport(results, json, engineHeader, form) { results.classList.add('visible'); var meta = parseJsonMeta(json); var scored = resolveReport(meta, engineHeader); if (scored.unavailable) { results.innerHTML = 'Analysis returned without a score. ' + SERVICE_DOWN + '
'; return; } notifyVoiceDesk(scored); results.innerHTML = '' + formatSummaryLine(scored) + '
' + reportActionsHtml(scored, reportSpeakSummary(scored)); bindPdfButton(results, form); results.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); } var form = document.getElementById('fraud-check-form'); var results = document.getElementById('fraud-results'); var submitBtn = document.getElementById('fraud-submit-btn'); var statusEl = document.getElementById('proxy-status'); if (!form || !results) return; form.addEventListener('submit', function (ev) { ev.preventDefault(); var text = (document.getElementById('fraud-text') || {}).value || ''; if (!String(text).trim()) { alert('Paste the suspicious message first.'); return; } if (submitBtn) { submitBtn.disabled = true; submitBtn.textContent = 'Analyzing…'; } if (statusEl) { statusEl.textContent = 'Running check…'; statusEl.classList.remove('ok', 'err'); } results.classList.add('visible'); results.innerHTML = 'Analyzing… contacting fraud engine
'; fetch('/api/fraud/analyze', { method: 'POST', body: new FormData(form), headers: { Accept: 'text/html,application/json' }, }) .then(function (r) { var ct = (r.headers.get('content-type') || '').toLowerCase(); var engineHeader = r.headers.get('X-Fraud-Engine'); if (r.ok && ct.includes('text/html')) { return r.text().then(function (html) { if (!html || html.length < 80) throw new Error(SERVICE_DOWN); showHtmlReport(results, html, engineHeader, form); if (statusEl) { statusEl.textContent = 'Analysis complete'; statusEl.classList.add('ok'); } }); } if (r.ok && ct.includes('application/json')) { return r.json().then(function (json) { showJsonReport(results, json, engineHeader, form); if (statusEl) { statusEl.textContent = 'Analysis complete'; statusEl.classList.add('ok'); } }); } return r .json() .catch(function () { return {}; }) .then(function (j) { throw new Error(j.error || SERVICE_DOWN); }); }) .catch(function (err) { results.classList.add('visible'); var msg = String(err.message || err); if (!/unavailable|502|503|failed/i.test(msg)) { msg = msg + '. ' + SERVICE_DOWN; } results.innerHTML = '' + msg + ' · blockchainfraud.org
'; if (statusEl) { statusEl.textContent = 'Check failed — see message above'; statusEl.classList.add('err'); } }) .finally(function () { if (submitBtn) { submitBtn.disabled = false; submitBtn.textContent = 'Run Fraud Check'; } }); }); })();