January 13-15, 2026
diff --git a/assets/css/badge-verification.css b/assets/css/badge-verification.css
new file mode 100644
index 0000000..3de8865
--- /dev/null
+++ b/assets/css/badge-verification.css
@@ -0,0 +1,361 @@
+.badge-verification-page {
+ padding-top: 10rem;
+}
+
+.badge-verification-page code {
+ color: #1f4d78;
+ white-space: normal;
+}
+
+.badge-lookup-form,
+.badge-record,
+.badge-registry-table-card,
+.badge-disclaimer {
+ background: #ffffff;
+ border: 1px solid #d8dde6;
+ border-radius: 0.5rem;
+ box-shadow: 0 0.25rem 1rem rgba(0, 0, 0, 0.05);
+ margin-top: 1.5rem;
+ padding: 1.5rem;
+}
+
+.badge-lookup-form label {
+ color: #12365a;
+ display: block;
+ font-family: Montserrat, sans-serif;
+ font-size: 0.82rem;
+ font-weight: 700;
+ letter-spacing: 0.03em;
+ margin-bottom: 0.5rem;
+ text-transform: uppercase;
+}
+
+.badge-lookup-heading {
+ border-bottom: 1px solid #e4e8ef;
+ margin-bottom: 1rem;
+ padding-bottom: 0.75rem;
+}
+
+.badge-lookup-heading h3 {
+ color: #12365a;
+ font-family: Montserrat, sans-serif;
+ font-weight: 700;
+ margin-bottom: 0;
+}
+
+.badge-input-row {
+ display: flex;
+ gap: 0.75rem;
+}
+
+.badge-id-search {
+ appearance: none;
+ background: #ffffff;
+ border: 2px solid #8fa2bc;
+ border-radius: 0.25rem;
+ color: #102a43;
+ flex: 1;
+ font-family: Montserrat, sans-serif;
+ font-size: 1.05rem;
+ font-weight: 700;
+ letter-spacing: 0.02em;
+ min-width: 0;
+ padding: 0.85rem 1rem;
+}
+
+.badge-id-search::placeholder {
+ color: #7b8794;
+ font-weight: 400;
+ letter-spacing: 0;
+}
+
+.badge-id-search:focus {
+ border-color: #0052b8;
+ box-shadow: 0 0 0 0.2rem rgba(0, 82, 184, 0.18);
+ outline: 0;
+}
+
+.badge-filter-grid {
+ align-items: end;
+ display: grid;
+ gap: 0.9rem;
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ margin-top: 1.25rem;
+}
+
+.badge-filter-control {
+ appearance: none;
+ background: #ffffff;
+ border: 1px solid #b9c4d4;
+ border-radius: 0.25rem;
+ color: #102a43;
+ font-family: Montserrat, sans-serif;
+ font-size: 0.95rem;
+ min-height: 2.75rem;
+ padding: 0.65rem 0.75rem;
+ width: 100%;
+}
+
+select.badge-filter-control {
+ background-image: linear-gradient(45deg, transparent 50%, #405268 50%), linear-gradient(135deg, #405268 50%, transparent 50%);
+ background-position: calc(100% - 16px) 1.15rem, calc(100% - 11px) 1.15rem;
+ background-repeat: no-repeat;
+ background-size: 5px 5px, 5px 5px;
+ padding-right: 2rem;
+}
+
+.badge-filter-control:focus {
+ border-color: #0052b8;
+ box-shadow: 0 0 0 0.15rem rgba(0, 82, 184, 0.16);
+ outline: 0;
+}
+
+.badge-filter-actions {
+ grid-column: 1 / -1;
+ min-width: 0;
+ white-space: nowrap;
+}
+
+.badge-filter-actions .btn {
+ white-space: nowrap;
+}
+
+.badge-id-search:disabled,
+.badge-id-search[readonly] {
+ background: #eef2f7;
+ color: #5f6b7a;
+ cursor: not-allowed;
+}
+
+.badge-form-help,
+.badge-record-note {
+ color: #5f6b7a;
+ font-size: 0.95rem;
+ margin-bottom: 0;
+ margin-top: 0.75rem;
+}
+
+.badge-status-message {
+ color: #5f6b7a;
+ font-weight: 700;
+ margin-top: 1rem;
+}
+
+.badge-status-message-success {
+ color: #1f7a3a;
+}
+
+.badge-status-message-warning {
+ color: #946200;
+}
+
+.badge-status-message-error {
+ color: #9b1c1c;
+}
+
+.badge-record-header {
+ align-items: flex-start;
+ border-bottom: 1px solid #e4e8ef;
+ display: flex;
+ gap: 1rem;
+ justify-content: space-between;
+ margin-bottom: 1.25rem;
+ padding-bottom: 1rem;
+}
+
+.badge-record-eyebrow {
+ color: #5f6b7a;
+ font-family: Montserrat, sans-serif;
+ font-size: 0.8rem;
+ font-weight: 700;
+ letter-spacing: 0.04em;
+ margin-bottom: 0.25rem;
+ text-transform: uppercase;
+}
+
+.badge-record h3,
+.badge-registry-table-card h3,
+.badge-disclaimer h3 {
+ color: #12365a;
+ font-family: Montserrat, sans-serif;
+ font-weight: 700;
+}
+
+.badge-status-pill {
+ border-radius: 999px;
+ font-family: Montserrat, sans-serif;
+ font-size: 0.8rem;
+ font-weight: 700;
+ padding: 0.35rem 0.75rem;
+ text-transform: uppercase;
+ white-space: nowrap;
+}
+
+.badge-status-active {
+ background: #e7f5ec;
+ color: #1f7a3a;
+}
+
+.badge-status-corrected,
+.badge-status-retired {
+ background: #eef2f7;
+ color: #405268;
+}
+
+.badge-status-revoked {
+ background: #fbe9e9;
+ color: #9b1c1c;
+}
+
+.badge-status-neutral {
+ background: #eef2f7;
+ color: #405268;
+}
+
+.badge-record-body {
+ display: block;
+}
+
+.badge-record-details {
+ display: grid;
+ gap: 1rem;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ margin-bottom: 0;
+}
+
+.badge-record-details div {
+ border-bottom: 1px solid #e9edf3;
+ padding-bottom: 0.75rem;
+}
+
+.badge-record-details dt {
+ color: #5f6b7a;
+ font-family: Montserrat, sans-serif;
+ font-size: 0.78rem;
+ letter-spacing: 0.03em;
+ text-transform: uppercase;
+}
+
+.badge-record-details dd {
+ color: #212529;
+ font-size: 1rem;
+ margin-bottom: 0;
+ margin-top: 0.2rem;
+}
+
+.badge-disclaimer {
+ background: #f8f9fa;
+}
+
+.badge-registry-table-header {
+ align-items: flex-start;
+ border-bottom: 1px solid #e4e8ef;
+ display: flex;
+ gap: 1rem;
+ justify-content: space-between;
+ margin-bottom: 1rem;
+ padding-bottom: 0.75rem;
+}
+
+.badge-table-count {
+ color: #5f6b7a;
+ font-family: Montserrat, sans-serif;
+ font-size: 0.9rem;
+ font-weight: 700;
+ margin-bottom: 0;
+ margin-top: 0.25rem;
+ white-space: nowrap;
+}
+
+.badge-table-scroll {
+ border: 1px solid #d8dde6;
+ border-radius: 0.35rem;
+ margin-top: 1rem;
+ overflow-x: auto;
+}
+
+.badge-registry-table {
+ background: #ffffff;
+ border-collapse: collapse;
+ margin-bottom: 0;
+ min-width: 1040px;
+ width: 100%;
+}
+
+.badge-registry-table th,
+.badge-registry-table td {
+ border-bottom: 1px solid #e4e8ef;
+ color: #212529;
+ font-size: 0.95rem;
+ padding: 0.8rem 0.9rem;
+ vertical-align: top;
+}
+
+.badge-registry-table th {
+ background: #f2f4f7;
+ color: #12365a;
+ font-family: Montserrat, sans-serif;
+ font-size: 0.78rem;
+ letter-spacing: 0.03em;
+ text-transform: uppercase;
+ white-space: nowrap;
+}
+
+.badge-registry-table tbody tr:last-child td {
+ border-bottom: 0;
+}
+
+.badge-registry-table a {
+ color: #0052b8;
+ font-weight: 700;
+}
+
+.badge-row-highlight td {
+ background: #fff6dc;
+ box-shadow: inset 0 1px 0 #f2af0d, inset 0 -1px 0 #f2af0d;
+}
+
+.badge-row-highlight td:first-child {
+ box-shadow: inset 3px 0 0 #f2af0d, inset 0 1px 0 #f2af0d, inset 0 -1px 0 #f2af0d;
+}
+
+.badge-table-empty {
+ color: #946200;
+ font-weight: 700;
+ margin-bottom: 0;
+ margin-top: 1rem;
+}
+
+@media (max-width: 1199px) {
+ .badge-filter-grid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+}
+
+@media (max-width: 768px) {
+ .badge-verification-page {
+ padding-top: 8rem;
+ }
+
+ .badge-input-row,
+ .badge-filter-grid,
+ .badge-record-header,
+ .badge-registry-table-header {
+ display: block;
+ }
+
+ .badge-input-row button,
+ .badge-filter-actions button {
+ margin-top: 0.75rem;
+ width: 100%;
+ }
+
+ .badge-record-details {
+ grid-template-columns: 1fr;
+ }
+
+ .badge-status-pill {
+ display: inline-block;
+ margin-top: 0.75rem;
+ }
+}
diff --git a/assets/data/badges-public.json b/assets/data/badges-public.json
new file mode 100644
index 0000000..e917662
--- /dev/null
+++ b/assets/data/badges-public.json
@@ -0,0 +1,108 @@
+[
+ {
+ "badgeId": "PACIO-BDG-2025-0001",
+ "eventId": "2025-01-hl7-connectathon",
+ "status": "Active",
+ "recipientDisplayName": "Patient Centric Solutions",
+ "recipientType": "Organization",
+ "companyName": "Patient Centric Solutions",
+ "badgeCategory": "FHIR Implementer",
+ "eventName": "HL7 Connectathon",
+ "eventDateRange": "January 2025",
+ "keyContributors": "Nancy Lush",
+ "verificationUrl": "https://pacioproject.org/verification/?id=PACIO-BDG-2025-0001",
+ "lastUpdated": "2026-07-26"
+ },
+ {
+ "badgeId": "PACIO-BDG-2025-0002",
+ "eventId": "2025-07-cms-connectathon",
+ "status": "Active",
+ "recipientDisplayName": "Patient Centric Solutions",
+ "recipientType": "Organization",
+ "companyName": "Patient Centric Solutions",
+ "badgeCategory": "FHIR Implementer",
+ "eventName": "CMS Connectathon",
+ "eventDateRange": "July 2025",
+ "verificationUrl": "https://pacioproject.org/verification/?id=PACIO-BDG-2025-0002",
+ "lastUpdated": "2026-08-05"
+ },
+ {
+ "badgeId": "PACIO-BDG-2026-0001",
+ "eventId": "2026-07-cms-connectathon",
+ "status": "Active",
+ "recipientDisplayName": "MatrixCare",
+ "recipientType": "Organization",
+ "companyName": "MatrixCare",
+ "badgeCategory": "FHIR Implementer",
+ "eventName": "CMS Connectathon",
+ "eventDateRange": "July 2026",
+ "verificationUrl": "https://pacioproject.org/verification/?id=PACIO-BDG-2026-0001",
+ "lastUpdated": "2026-08-10"
+ },
+ {
+ "badgeId": "PACIO-BDG-2026-0002",
+ "eventId": "2026-07-cms-connectathon",
+ "status": "Active",
+ "recipientDisplayName": "NCQA",
+ "recipientType": "Organization",
+ "companyName": "NCQA",
+ "badgeCategory": "FHIR Implementer",
+ "eventName": "CMS Connectathon",
+ "eventDateRange": "July 2026",
+ "verificationUrl": "https://pacioproject.org/verification/?id=PACIO-BDG-2026-0002",
+ "lastUpdated": "2026-08-05"
+ },
+ {
+ "badgeId": "PACIO-BDG-2026-0003",
+ "eventId": "2026-07-cms-connectathon",
+ "status": "Active",
+ "recipientDisplayName": "Global Alliant",
+ "recipientType": "Organization",
+ "companyName": "Global Alliant",
+ "badgeCategory": "FHIR Implementer",
+ "eventName": "CMS Connectathon",
+ "eventDateRange": "July 2026",
+ "verificationUrl": "https://pacioproject.org/verification/?id=PACIO-BDG-2026-0003",
+ "lastUpdated": "2026-08-05"
+ },
+ {
+ "badgeId": "PACIO-BDG-2026-0004",
+ "eventId": "2026-07-cms-connectathon",
+ "status": "Active",
+ "recipientDisplayName": "Orbital Health Systems",
+ "recipientType": "Organization",
+ "companyName": "Orbital Health Systems",
+ "badgeCategory": "FHIR Implementer",
+ "eventName": "CMS Connectathon",
+ "eventDateRange": "July 2026",
+ "verificationUrl": "https://pacioproject.org/verification/?id=PACIO-BDG-2026-0004",
+ "lastUpdated": "2026-08-05"
+ },
+ {
+ "badgeId": "PACIO-BDG-2026-0005",
+ "eventId": "2026-07-cms-connectathon",
+ "status": "Active",
+ "recipientDisplayName": "Washington DOH",
+ "recipientType": "Organization",
+ "companyName": "Washington State DOH",
+ "badgeCategory": "FHIR Implementer",
+ "eventName": "CMS Connectathon",
+ "eventDateRange": "July 2026",
+ "verificationUrl": "https://pacioproject.org/verification/?id=PACIO-BDG-2026-0005",
+ "lastUpdated": "2026-08-05"
+ },
+ {
+ "badgeId": "PACIO-BDG-2026-0006",
+ "eventId": "2026-07-cms-connectathon",
+ "status": "Active",
+ "recipientDisplayName": "MyDirectives",
+ "recipientType": "Organization",
+ "companyName": "MyDirectives, Inc.",
+ "badgeCategory": "FHIR Implementer",
+ "eventName": "CMS Connectathon",
+ "eventDateRange": "July 2026",
+ "keyContributors": "Maria Moen and Lisa Nelson",
+ "verificationUrl": "https://pacioproject.org/verification/?id=PACIO-BDG-2026-0006",
+ "lastUpdated": "2026-08-05"
+ }
+]
diff --git a/assets/js/badge-verification.js b/assets/js/badge-verification.js
new file mode 100644
index 0000000..84775a4
--- /dev/null
+++ b/assets/js/badge-verification.js
@@ -0,0 +1,406 @@
+(function () {
+ "use strict";
+
+ const registryPath = "../assets/data/badges-public.json";
+ const statusClasses = {
+ active: "badge-status-active",
+ corrected: "badge-status-corrected",
+ revoked: "badge-status-revoked",
+ retired: "badge-status-retired"
+ };
+
+ const form = document.getElementById("badge-verification-form");
+ const input = document.getElementById("badge-id-input");
+ const message = document.getElementById("badge-status-message");
+ const record = document.getElementById("badge-record");
+ const tableBody = document.getElementById("badge-registry-table-body");
+ const tableCount = document.getElementById("badge-table-count");
+ const tableEmpty = document.getElementById("badge-table-empty");
+ const showAllButton = document.getElementById("badge-show-all");
+ const clearFiltersButton = document.getElementById("badge-clear-filters");
+ const eventFilter = document.getElementById("badge-event-filter");
+ const yearFilter = document.getElementById("badge-year-filter");
+ const categoryFilter = document.getElementById("badge-category-filter");
+ const companyFilter = document.getElementById("badge-company-filter");
+
+ let badgeRecords = [];
+ let activeHighlightId = "";
+
+ function normalizeFilterValue(value) {
+ return (value || "").trim().toUpperCase();
+ }
+
+ function extractBadgeId(value) {
+ const match = (value || "").toUpperCase().match(/PACIO-BDG-\d{4}-\d{4}/);
+ return match ? match[0] : "";
+ }
+
+ function setMessage(text, kind) {
+ message.textContent = text || "";
+ message.className = "badge-status-message";
+ if (kind) {
+ message.classList.add("badge-status-message-" + kind);
+ }
+ }
+
+ function setText(id, value) {
+ const element = document.getElementById(id);
+ if (element) {
+ element.textContent = value || "Not provided";
+ }
+ }
+
+ function setBadgeLink(id, badgeId) {
+ const element = document.getElementById(id);
+ if (!element) {
+ return;
+ }
+ element.textContent = "";
+ if (!badgeId) {
+ element.textContent = "Not provided";
+ return;
+ }
+ const link = document.createElement("a");
+ link.href = makeLocalVerificationHref(badgeId);
+ link.textContent = badgeId;
+ link.addEventListener("click", function (event) {
+ event.preventDefault();
+ input.value = badgeId;
+ verifyBadgeId(badgeId, true);
+ });
+ element.appendChild(link);
+ }
+
+ function displayValue(value) {
+ return (value || "").toString().trim() || "Not provided";
+ }
+
+ function companyName(item) {
+ return displayValue(item.companyName || item.recipientDisplayName);
+ }
+
+ function eventLabel(item) {
+ const eventName = displayValue(item.eventName);
+ const eventDate = displayValue(item.eventDateRange || item.eventMonthYear);
+ return eventDate === "Not provided" ? eventName : eventName + " - " + eventDate;
+ }
+
+ function recordYear(item) {
+ const eventId = item.eventId || "";
+ const eventIdMatch = eventId.match(/^(20\d{2})-/);
+ if (eventIdMatch) {
+ return eventIdMatch[1];
+ }
+ const text = [item.eventDateRange, item.eventMonthYear, item.lastUpdated, item.badgeId].join(" ");
+ const match = text.match(/\b(20\d{2})\b/);
+ return match ? match[1] : "";
+ }
+
+ function selectedFilterValue(element) {
+ return element ? normalizeFilterValue(element.value) : "";
+ }
+
+ function selectedTextFilterValue(element) {
+ return element ? (element.value || "").trim().toLowerCase() : "";
+ }
+
+ function resetRecord() {
+ record.hidden = true;
+ }
+
+ function makeLocalVerificationHref(badgeId) {
+ return "../verification/?id=" + encodeURIComponent(badgeId);
+ }
+
+ function statusClass(status) {
+ return statusClasses[(status || "").toLowerCase()] || "badge-status-neutral";
+ }
+
+ function displayRecord(item) {
+ const status = item.status || "Active";
+ const statusPill = document.getElementById("badge-record-status");
+
+ document.getElementById("badge-record-title").textContent = item.recipientDisplayName || item.badgeId;
+ statusPill.textContent = status;
+ statusPill.className = "badge-status-pill " + statusClass(status);
+
+ setText("record-badge-id", item.badgeId);
+ setText("record-event-id", item.eventId);
+ setText("record-recipient", item.recipientDisplayName);
+ setText("record-company", item.companyName || item.recipientDisplayName);
+ setText("record-recipient-type", item.recipientType);
+ setText("record-category", item.badgeCategory);
+ setText("record-event", item.eventName);
+ setText("record-event-date", item.eventDateRange || item.eventMonthYear);
+ setText("record-key-contributors", item.keyContributors);
+ setBadgeLink("record-supersedes", item.supersedesBadgeId);
+ setBadgeLink("record-superseded-by", item.supersededByBadgeId);
+ setText("record-updated", item.lastUpdated);
+
+ const note = document.getElementById("record-note");
+ note.textContent = item.publicNote || "";
+ note.hidden = !item.publicNote;
+
+ record.hidden = false;
+ }
+
+ function addTableCell(row, text) {
+ const cell = document.createElement("td");
+ cell.textContent = displayValue(text);
+ row.appendChild(cell);
+ return cell;
+ }
+
+ function addBadgeIdCell(row, item) {
+ const cell = document.createElement("td");
+ const link = document.createElement("a");
+ link.href = makeLocalVerificationHref(item.badgeId);
+ link.textContent = displayValue(item.badgeId);
+ link.addEventListener("click", function (event) {
+ event.preventDefault();
+ input.value = item.badgeId;
+ verifyBadgeId(item.badgeId, true);
+ });
+ cell.appendChild(link);
+ row.appendChild(cell);
+ }
+
+ function renderRegistryTable(filterValue, highlightValue) {
+ const filter = extractBadgeId(filterValue) || normalizeFilterValue(filterValue);
+ const highlight = normalizeFilterValue(highlightValue);
+ const selectedEvent = selectedFilterValue(eventFilter);
+ const selectedYear = selectedFilterValue(yearFilter);
+ const selectedCategory = selectedFilterValue(categoryFilter);
+ const selectedCompany = selectedTextFilterValue(companyFilter);
+ const rows = badgeRecords.filter(function (item) {
+ const badgeId = normalizeFilterValue(item.badgeId);
+ const itemEvent = normalizeFilterValue(item.eventId);
+ const itemCategory = normalizeFilterValue(item.badgeCategory);
+ const itemYear = normalizeFilterValue(recordYear(item));
+ const itemCompany = companyName(item).toLowerCase();
+ return (!filter || badgeId.indexOf(filter) !== -1) &&
+ (!selectedEvent || itemEvent === selectedEvent) &&
+ (!selectedYear || itemYear === selectedYear) &&
+ (!selectedCategory || itemCategory === selectedCategory) &&
+ (!selectedCompany || itemCompany.indexOf(selectedCompany) !== -1);
+ });
+
+ tableBody.textContent = "";
+ rows.forEach(function (item) {
+ const row = document.createElement("tr");
+ if (highlight && normalizeFilterValue(item.badgeId) === highlight) {
+ row.className = "badge-row-highlight";
+ row.setAttribute("aria-current", "true");
+ }
+ addBadgeIdCell(row, item);
+ addTableCell(row, item.eventName);
+ addTableCell(row, item.eventDateRange || item.eventMonthYear);
+ addTableCell(row, item.badgeCategory);
+ addTableCell(row, companyName(item));
+ addTableCell(row, item.keyContributors);
+ addTableCell(row, item.status);
+ tableBody.appendChild(row);
+ });
+
+ tableEmpty.hidden = rows.length !== 0;
+ tableCount.textContent = rows.length + " public badge record" + (rows.length === 1 ? "" : "s");
+ }
+
+ function optionElement(value, label) {
+ const option = document.createElement("option");
+ option.value = value;
+ option.textContent = label;
+ return option;
+ }
+
+ function replaceOptions(select, firstLabel, options) {
+ select.textContent = "";
+ select.appendChild(optionElement("", firstLabel));
+ options.forEach(function (item) {
+ select.appendChild(optionElement(item.value, item.label));
+ });
+ }
+
+ function uniqueSorted(values) {
+ return Array.from(new Set(values.filter(Boolean))).sort();
+ }
+
+ function populateFilters() {
+ const eventsById = {};
+ badgeRecords.forEach(function (item) {
+ if (item.eventId && !eventsById[item.eventId]) {
+ eventsById[item.eventId] = eventLabel(item);
+ }
+ });
+ const eventOptions = Object.keys(eventsById).sort().map(function (eventId) {
+ return { value: eventId, label: eventsById[eventId] };
+ });
+ const yearOptions = uniqueSorted(badgeRecords.map(recordYear)).map(function (year) {
+ return { value: year, label: year };
+ });
+ const categoryOptions = uniqueSorted(badgeRecords.map(function (item) {
+ return item.badgeCategory || "";
+ })).map(function (category) {
+ return { value: category, label: category };
+ });
+
+ replaceOptions(eventFilter, "All events", eventOptions);
+ replaceOptions(yearFilter, "All years", yearOptions);
+ replaceOptions(categoryFilter, "All categories", categoryOptions);
+ }
+
+ function setSelectValue(select, value) {
+ const normalizedValue = normalizeFilterValue(value);
+ const option = Array.prototype.find.call(select.options, function (item) {
+ return normalizeFilterValue(item.value) === normalizedValue;
+ });
+ select.value = option ? option.value : "";
+ }
+
+ function syncFiltersToRecord(item) {
+ setSelectValue(eventFilter, item.eventId);
+ setSelectValue(yearFilter, recordYear(item));
+ setSelectValue(categoryFilter, item.badgeCategory);
+ companyFilter.value = "";
+ }
+
+ function clearFilters() {
+ eventFilter.value = "";
+ yearFilter.value = "";
+ categoryFilter.value = "";
+ companyFilter.value = "";
+ }
+
+ function verifyBadgeId(rawBadgeId, updateUrl) {
+ const badgeId = extractBadgeId(rawBadgeId) || normalizeFilterValue(rawBadgeId);
+ resetRecord();
+
+ if (!badgeId) {
+ activeHighlightId = "";
+ input.value = "";
+ setMessage("Showing all public PACIO badge records.", "neutral");
+ renderRegistryTable("", "");
+ if (updateUrl) {
+ const url = new URL(window.location.href);
+ url.searchParams.delete("id");
+ window.history.replaceState({}, "", url.toString());
+ }
+ return;
+ }
+
+ const match = badgeRecords.find(function (item) {
+ return normalizeFilterValue(item.badgeId) === badgeId;
+ });
+
+ if (!match) {
+ activeHighlightId = "";
+ setMessage("No public PACIO badge record was found for " + badgeId + ".", "warning");
+ renderRegistryTable(badgeId, "");
+ if (updateUrl) {
+ const url = new URL(window.location.href);
+ url.searchParams.set("id", badgeId);
+ window.history.replaceState({}, "", url.toString());
+ }
+ return;
+ }
+
+ activeHighlightId = match.badgeId;
+ input.value = match.badgeId;
+ syncFiltersToRecord(match);
+ displayRecord(match);
+ renderRegistryTable(match.badgeId, match.badgeId);
+ setMessage("Badge record found.", "success");
+
+ if (updateUrl) {
+ const url = new URL(window.location.href);
+ url.searchParams.set("id", match.badgeId);
+ window.history.replaceState({}, "", url.toString());
+ }
+ }
+
+ function loadInitialBadgeId() {
+ const params = new URLSearchParams(window.location.search);
+ const badgeId = params.get("id");
+ if (badgeId) {
+ input.value = badgeId;
+ verifyBadgeId(badgeId, false);
+ } else {
+ activeHighlightId = "";
+ renderRegistryTable("", "");
+ }
+ }
+
+ function loadRegistry() {
+ setMessage("Loading badge registry...", "neutral");
+ return fetch(registryPath, { cache: "no-store" })
+ .then(function (response) {
+ if (!response.ok) {
+ throw new Error("Registry request failed with status " + response.status);
+ }
+ return response.json();
+ })
+ .then(function (data) {
+ badgeRecords = Array.isArray(data) ? data : [];
+ populateFilters();
+ setMessage("Enter a badge ID to verify.", "neutral");
+ input.disabled = false;
+ input.readOnly = false;
+ loadInitialBadgeId();
+ })
+ .catch(function () {
+ setMessage("The badge registry could not be loaded. Please try again later.", "error");
+ });
+ }
+
+ form.addEventListener("submit", function (event) {
+ event.preventDefault();
+ verifyBadgeId(input.value, true);
+ });
+
+ input.addEventListener("input", function () {
+ activeHighlightId = "";
+ resetRecord();
+ renderRegistryTable(input.value, "");
+ setMessage(input.value ? "Filtering badge records as you type." : "Showing all public PACIO badge records.", "neutral");
+ });
+
+ showAllButton.addEventListener("click", function () {
+ activeHighlightId = "";
+ input.value = "";
+ clearFilters();
+ resetRecord();
+ renderRegistryTable("", "");
+ setMessage("Showing all public PACIO badge records.", "neutral");
+ const url = new URL(window.location.href);
+ url.searchParams.delete("id");
+ window.history.replaceState({}, "", url.toString());
+ input.focus();
+ });
+
+ [eventFilter, yearFilter, categoryFilter].forEach(function (control) {
+ control.addEventListener("change", function () {
+ activeHighlightId = "";
+ resetRecord();
+ renderRegistryTable(input.value, "");
+ setMessage("Filtering badge records.", "neutral");
+ });
+ });
+
+ companyFilter.addEventListener("input", function () {
+ activeHighlightId = "";
+ resetRecord();
+ renderRegistryTable(input.value, "");
+ setMessage("Filtering badge records.", "neutral");
+ });
+
+ clearFiltersButton.addEventListener("click", function () {
+ activeHighlightId = "";
+ clearFilters();
+ resetRecord();
+ renderRegistryTable(input.value, "");
+ setMessage(input.value ? "Showing records that match the Badge ID field." : "Showing all public PACIO badge records.", "neutral");
+ input.focus();
+ });
+
+ loadRegistry();
+})();
diff --git a/cognitive-status.html b/cognitive-status.html
index c0d1f77..448b65e 100644
--- a/cognitive-status.html
+++ b/cognitive-status.html
@@ -40,6 +40,7 @@