← Back to Black Justice ← Back to Page 2 ← Back to Page 1 Support Your Race
Black Justice Engine header graphic

Start a New Black Justice Case

Use this page to turn your situation into a structured case. Keep all public text anonymous and focused on what the entities did. Your real contact details are stored in the private Identity Vault, not on the public case page.

New Case Form – Step 2

The form below matches the Black Justice Engine case template. You can save the case as a draft or submit it for public listing once the backend is connected.

Section 3 – IC Framing (Public)

Identity Engine – case focus on the racial profile of person or entity (Who is giving you trouble?)

Use the standard Identity Engine dropdowns to declare the race, ethnicity and sub-branch of the person/entity/organisation the focus is on. They could be anti-Black racist suspect/s in your opinion.

Identity dropdowns ready (standard mode).

Suggested PDF filename: BJ-______ENTITY-ID______YYYYMMDD.pdf

Section 4 – Harm and Justice Path (Public)
Section 5 – Short Case Summary (Public)

Explain what happened in plain language. Do not include full names, home addresses, emails, phone numbers, bank account numbers, NHS numbers or children’s names. Alternatively, you can refer to a report/document/etc already written instead.

Optional: paste up to 3 public hyperlinks to your full report / evidence pack (ic3csi.com or elsewhere). You can copy these links into the online form later.

Section 6 – First Timeline Event (Public)

Do not include full names, addresses, emails, phone numbers, account numbers, NHS numbers or children’s names.

Section 7 – Privacy, Safety and Consent

The Black Justice Engine keeps structured records to expose anti-Black racism and institutional failure. Some personal data is stored privately so we can contact you and manage your case. You can ask us to correct or remove your private contact details at any time.

'; return html; } function downloadBlob(filename, mime, content) { try { var blob = new Blob([content], { type: mime }); var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = filename; document.body.appendChild(a); a.click(); setTimeout(function() { try { URL.revokeObjectURL(url); } catch (e) {} try { document.body.removeChild(a); } catch (e2) {} }, 500); return true; } catch (e) { return false; } } function printHtml(html) { try { var w = window.open('', '_blank'); if (!w) return false; w.document.open(); w.document.write(html); w.document.close(); setTimeout(function() { try { w.focus(); w.print(); } catch (e) {} }, 250); return true; } catch (e2) { return false; } } function nowStamp() { var d = new Date(); return { iso: d.toISOString(), human: d.toLocaleString(undefined, { year:'numeric', month:'short', day:'2-digit', hour:'2-digit', minute:'2-digit' }) }; } function showExportPrompt(caseObj, submitMode) { if (!exportModal) return; var stamp = nowStamp(); safeUpdateCase(caseObj.ref, { export_prompted_iso: stamp.iso, export_prompted_human: stamp.human }); if (exportRefLine) { exportRefLine.textContent = 'Reference: ' + String(caseObj.ref || '') + ' — saved locally: ' + String(caseObj.created_human || caseObj.created_iso || ''); } if (exportAck) { try { exportAck.checked = false; } catch (e0) {} } // Require export or acknowledgement for SUBMIT; optional for DRAFT. var satisfied = (submitMode !== 'submit'); function setDoneState() { if (!btnGoCases) return; btnGoCases.disabled = !satisfied; } setDoneState(); function markExport(scope, kind) { var st = nowStamp(); var patch = { export_last_iso: st.iso, export_last_human: st.human, export_last_scope: scope, export_last_kind: kind }; safeUpdateCase(caseObj.ref, patch); satisfied = true; setDoneState(); } if (btnExportTxtFull) { btnExportTxtFull.onclick = function() { var content = buildExportText(caseObj, 'full'); var ok = downloadBlob(String(caseObj.ref || 'CASE') + '_FULL.txt', 'text/plain;charset=utf-8', content); if (ok) markExport('full', 'txt'); }; } if (btnExportDocFull) { btnExportDocFull.onclick = function() { var html = buildExportHtml(caseObj, 'full'); var ok = downloadBlob(String(caseObj.ref || 'CASE') + '_FULL.doc', 'application/msword', html); if (ok) markExport('full', 'word'); }; } if (btnPrintPdfFull) { btnPrintPdfFull.onclick = function() { var html = buildExportHtml(caseObj, 'full'); var ok = printHtml(html); if (ok) markExport('full', 'print'); }; } if (btnExportTxtPublic) { btnExportTxtPublic.onclick = function() { var content = buildExportText(caseObj, 'public'); var ok = downloadBlob(String(caseObj.ref || 'CASE') + '_PUBLIC.txt', 'text/plain;charset=utf-8', content); if (ok) markExport('public', 'txt'); }; } if (btnExportDocPublic) { btnExportDocPublic.onclick = function() { var html = buildExportHtml(caseObj, 'public'); var ok = downloadBlob(String(caseObj.ref || 'CASE') + '_PUBLIC.doc', 'application/msword', html); if (ok) markExport('public', 'word'); }; } if (btnPrintPdfPublic) { btnPrintPdfPublic.onclick = function() { var html = buildExportHtml(caseObj, 'public'); var ok = printHtml(html); if (ok) markExport('public', 'print'); }; } if (exportAck) { exportAck.onchange = function() { if (exportAck.checked) { var st2 = nowStamp(); safeUpdateCase(caseObj.ref, { export_ack_iso: st2.iso, export_ack_human: st2.human }); satisfied = true; setDoneState(); } else { satisfied = (submitMode !== 'submit'); setDoneState(); } }; } if (btnReturnToForm) { btnReturnToForm.onclick = function() { exportModal.hidden = true; exportModal.setAttribute('aria-hidden', 'true'); try { exportModal.scrollTop = 0; } catch (e) {} }; } if (btnGoCases) { btnGoCases.onclick = function() { window.location.href = '/black-justice-cases.html'; }; } exportModal.hidden = false; exportModal.setAttribute('aria-hidden', 'false'); } form.addEventListener('submit', function(ev) { ev.preventDefault(); var formData = new FormData(form); var submitMode = formData.get('submit_mode') || 'draft'; var raceValue = getSelectValue('race'); var ethValue = getSelectValue('ethnicity'); var subValue = getSelectValue('subbranch'); var identityRace = raceValue || ((step1Data && step1Data.race) ? step1Data.race : '') || ((editCase && editCase.identity && editCase.identity.race) ? editCase.identity.race : ''); var identityEth = ethValue || ((step1Data && step1Data.ethnicity) ? step1Data.ethnicity : '') || ((editCase && editCase.identity && editCase.identity.ethnicity) ? editCase.identity.ethnicity : ''); var identitySub = subValue || ((step1Data && step1Data.subbranch) ? step1Data.subbranch : '') || ((editCase && editCase.identity && editCase.identity.subbranch) ? editCase.identity.subbranch : ''); var mainEntityInput = document.getElementById('main_entity'); var mainEntityRaw = ''; var mainEntityDisplay = ''; var mainEntityId = ''; if (mainEntityInput) { mainEntityRaw = String(mainEntityInput.value || ''); mainEntityDisplay = String(mainEntityInput.value || '').trim(); mainEntityId = String(mainEntityInput.dataset.entityId || '').trim(); } var harms = getAll(formData, 'harm[]'); var paths = getAll(formData, 'path[]'); var evidenceFileNames = []; var evidenceFileInput1 = document.getElementById('event_evidence_file_1'); var evidenceFileInput2 = document.getElementById('event_evidence_file_2'); var evidenceFileInput3 = document.getElementById('event_evidence_file_3'); if (evidenceFileInput1 && evidenceFileInput1.files && evidenceFileInput1.files.length > 0) { evidenceFileNames.push(evidenceFileInput1.files[0].name); } if (evidenceFileInput2 && evidenceFileInput2.files && evidenceFileInput2.files.length > 0) { evidenceFileNames.push(evidenceFileInput2.files[0].name); } if (evidenceFileInput3 && evidenceFileInput3.files && evidenceFileInput3.files.length > 0) { evidenceFileNames.push(evidenceFileInput3.files[0].name); } var now = new Date(); var createdIso = now.toISOString(); var createdHuman = now.toLocaleString(undefined, { year: 'numeric', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); var existingRaw = null; var existingCases = []; try { existingRaw = window.localStorage.getItem('ic3csi_black_justice_cases'); if (existingRaw) { existingCases = JSON.parse(existingRaw); if (!Array.isArray(existingCases)) existingCases = []; } } catch (e) { existingCases = []; } var ref = ''; if (editCase && editCase.ref) { ref = editCase.ref; } else if (editRef) { ref = editRef; } else { ref = 'BJ-' + (existingCases.length + 1); } var caseObj = { ref: ref, created_iso: createdIso, created_human: createdHuman, mode: submitMode === 'submit' ? 'submit' : 'draft', export_prompted_iso: (editCase && editCase.export_prompted_iso) ? editCase.export_prompted_iso : '', export_prompted_human: (editCase && editCase.export_prompted_human) ? editCase.export_prompted_human : '', export_last_iso: (editCase && editCase.export_last_iso) ? editCase.export_last_iso : '', export_last_human: (editCase && editCase.export_last_human) ? editCase.export_last_human : '', export_last_scope: (editCase && editCase.export_last_scope) ? editCase.export_last_scope : '', export_last_kind: (editCase && editCase.export_last_kind) ? editCase.export_last_kind : '', export_ack_iso: (editCase && editCase.export_ack_iso) ? editCase.export_ack_iso : '', export_ack_human: (editCase && editCase.export_ack_human) ? editCase.export_ack_human : '', owner_for: ((step1Data && step1Data.owner_for) ? step1Data.owner_for : ((editCase && editCase.owner_for) ? editCase.owner_for : '')), case_owner_name: ((step1Data && step1Data.owner_name) ? step1Data.owner_name : ((editCase && editCase.case_owner_name) ? editCase.case_owner_name : '')), case_owner_label: ((step1Data && step1Data.owner_label) ? step1Data.owner_label : ((editCase && editCase.case_owner_label) ? editCase.case_owner_label : '')), case_owner_email: ((step1Data && step1Data.owner_contact_email) ? step1Data.owner_contact_email : ((editCase && editCase.case_owner_email) ? editCase.case_owner_email : '')), case_owner_phone: ((step1Data && step1Data.owner_contact_phone) ? step1Data.owner_contact_phone : ((editCase && editCase.case_owner_phone) ? editCase.case_owner_phone : '')), owner_area: ((step1Data && step1Data.owner_area) ? step1Data.owner_area : ((editCase && editCase.owner_area) ? editCase.owner_area : '')), case_title: ((step1Data && step1Data.case_title) ? step1Data.case_title : ((editCase && editCase.case_title) ? editCase.case_title : '')), case_type: ((step1Data && step1Data.case_type) ? step1Data.case_type : ((editCase && editCase.case_type) ? editCase.case_type : '')), case_country: ((step1Data && step1Data.case_country) ? step1Data.case_country : ((editCase && editCase.case_country) ? editCase.case_country : '')), case_area: ((step1Data && step1Data.case_area) ? step1Data.case_area : ((editCase && editCase.case_area) ? editCase.case_area : '')), entity_main: ((step1Data && step1Data.entity_main) ? step1Data.entity_main : ((editCase && editCase.entity_main) ? editCase.entity_main : '')), entity_other: ((step1Data && step1Data.entity_other) ? step1Data.entity_other : ((editCase && editCase.entity_other) ? editCase.entity_other : '')), identity: { race: identityRace, ethnicity: identityEth, subbranch: identitySub }, main_entity: { entity_id: mainEntityId || '', entity_display: mainEntityDisplay || '', raw_input: mainEntityRaw || '' }, event: (function() { var primary = formData.get('event_primary_entity') || ''; if ((!primary || !String(primary).trim()) && mainEntityDisplay) { primary = String(mainEntityDisplay).trim(); } if ((!primary || !String(primary).trim()) && step1Data && step1Data.entity_main) { primary = String(step1Data.entity_main).trim(); } return { event_type: formData.get('event_type') || '', event_date: formData.get('event_date') || '', event_kind: formData.get('event_kind') || '', event_primary_entity: primary || '', event_secondary_entity: formData.get('event_secondary_entity') || '', event_description: formData.get('event_description') || '', event_private_note: formData.get('event_private_note') || '' }; })(), evidence: { title: formData.get('event_evidence_title') || '', summary: formData.get('event_evidence_summary') || '', mode: formData.get('event_evidence_mode') || '', visibility: formData.get('event_file_visibility') || '', filenames: evidenceFileNames, filename: (evidenceFileNames.length > 0 ? evidenceFileNames[0] : '') }, harms: harms, paths: paths, racism: { racism_role: formData.get('racism_role') || '', racism_note: formData.get('racism_note') || '', event_racism_role: formData.get('event_racism_role') || '', event_racism_note: formData.get('event_racism_note') || '' }, status: formData.get('case_status') || '', summary: formData.get('case_summary') || '', consent: { agree_public: !!formData.get('agree_public'), agree_safety: !!formData.get('agree_safety'), agree_contact: !!formData.get('agree_contact') } , report_link_1: ((step1Data && step1Data.report_link_1) || ((editCase && (editCase.report_link_4 || editCase.report_link_5 || editCase.report_link_6)) ? (editCase.report_link_1 || '') : '') || ''), report_link_2: ((step1Data && step1Data.report_link_2) || ((editCase && (editCase.report_link_4 || editCase.report_link_5 || editCase.report_link_6)) ? (editCase.report_link_2 || '') : '') || ''), report_link_3: ((step1Data && step1Data.report_link_3) || ((editCase && (editCase.report_link_4 || editCase.report_link_5 || editCase.report_link_6)) ? (editCase.report_link_3 || '') : '') || ''), report_link_4: formData.get('report_link_4') || '', report_link_5: formData.get('report_link_5') || '', report_link_6: formData.get('report_link_6') || '' }; try { if (editCase && editCase.ref && editCaseIndex >= 0 && editCaseIndex < existingCases.length) { existingCases[editCaseIndex] = caseObj; } else if (editRef) { // try to find a matching ref just in case var replaced = false; for (var i = 0; i < existingCases.length; i++) { if (existingCases[i] && existingCases[i].ref === editRef) { existingCases[i] = caseObj; replaced = true; break; } } if (!replaced) { existingCases.push(caseObj); } } else { existingCases.push(caseObj); } window.localStorage.setItem('ic3csi_black_justice_cases', JSON.stringify(existingCases)); // Persist Section 1 + 2 cache per case reference for safe later viewing/editing. try { var s1 = step1Data || {}; s1.editing_ref = String(ref || ''); if (typeof s1.owner_for === 'undefined') s1.owner_for = caseObj.owner_for || ''; if (typeof s1.owner_name === 'undefined') s1.owner_name = caseObj.case_owner_name || ''; if (typeof s1.owner_label === 'undefined') s1.owner_label = caseObj.case_owner_label || ''; if (typeof s1.owner_contact_email === 'undefined') s1.owner_contact_email = caseObj.case_owner_email || ''; if (typeof s1.owner_contact_phone === 'undefined') s1.owner_contact_phone = caseObj.case_owner_phone || ''; if (typeof s1.owner_area === 'undefined') s1.owner_area = caseObj.owner_area || ''; if (typeof s1.race === 'undefined') s1.race = caseObj.identity ? (caseObj.identity.race || '') : ''; if (typeof s1.ethnicity === 'undefined') s1.ethnicity = caseObj.identity ? (caseObj.identity.ethnicity || '') : ''; if (typeof s1.subbranch === 'undefined') s1.subbranch = caseObj.identity ? (caseObj.identity.subbranch || '') : ''; if (typeof s1.case_title === 'undefined') s1.case_title = caseObj.case_title || ''; if (typeof s1.case_type === 'undefined') s1.case_type = caseObj.case_type || ''; if (typeof s1.case_country === 'undefined') s1.case_country = caseObj.case_country || ''; if (typeof s1.case_area === 'undefined') s1.case_area = caseObj.case_area || ''; if (typeof s1.entity_main === 'undefined') s1.entity_main = caseObj.entity_main || ''; if (typeof s1.entity_other === 'undefined') s1.entity_other = caseObj.entity_other || ''; if (typeof s1.report_link_1 === 'undefined') s1.report_link_1 = caseObj.report_link_1 || ''; if (typeof s1.report_link_2 === 'undefined') s1.report_link_2 = caseObj.report_link_2 || ''; if (typeof s1.report_link_3 === 'undefined') s1.report_link_3 = caseObj.report_link_3 || ''; safeSetLS('ic3csi_black_justice_step1', JSON.stringify(s1)); if (ref) { safeSetLS('ic3csi_black_justice_step1_' + ref, JSON.stringify(s1)); } } catch (e3) {} try { window.localStorage.removeItem('ic3csi_black_justice_edit_ref'); } catch (e2) {} } catch (e) { // ignore storage issues (e.g. disabled or full) } renderCaseSummary(caseObj); showExportPrompt(caseObj, submitMode); }); })();