(function () { const CSV_URL = "https://docs.google.com/spreadsheets/d/e/2PACX-1vSRr68pfVTkj6T7JmLbiykdHBmY42kYVp6-xrQY1LoPWqsJi7yW9pA45LCBBadkG84KxIs1Je_AkKvI/pub?output=csv"; const LETTER_GROUPS = [ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J-K", "L", "M", "N", "O", "P-Q", "R", "S", "T", "U-V", "W-Z" ]; const output = document.getElementById("buildingAccordionOutput"); function clean(value) { return (value || "").toString().trim(); } function escapeHTML(value) { return clean(value) .replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """) .replace(/'/g, "'"); } function slug(value) { return clean(value) .toLowerCase() .replace(/[^a-z0-9]+/g, "-") .replace(/^-+|-+$/g, ""); } function isUnavailable(value) { return clean(value) === "#"; } function isTextOnly(row) { return ( clean(row.eap_url).toLowerCase() === "text only" || clean(row.quiz_url).toLowerCase() === "text only" ); } function getLetterGroup(value) { const first = clean(value).charAt(0).toUpperCase(); if (first === "J" || first === "K") return "J-K"; if (first === "P" || first === "Q") return "P-Q"; if (first === "U" || first === "V") return "U-V"; if (["W", "X", "Y", "Z"].includes(first)) return "W-Z"; if (/^[A-Z]$/.test(first)) return first; return "A"; } function renderEAPButton(url) { if (isUnavailable(url) || !clean(url)) { return '

EAP is not available

'; } return ` EAP `; } function renderQuizButton(url) { if (isUnavailable(url) || !clean(url)) { return '

Quiz is not available

'; } return ` Quiz `; } function renderBuildingRow(row) { const buildingName = escapeHTML(row.building_name); if (isTextOnly(row)) { return `

${buildingName}

`; } return `

${buildingName}

${renderEAPButton(row.eap_url)}
${renderQuizButton(row.quiz_url)}
`; } function renderCampusAccordion(letterGroup, campusUnit, rows, index) { const campusId = `campus-${slug(letterGroup)}-${slug(campusUnit)}-${index}`; const headingId = `${campusId}-heading`; const collapseId = `${campusId}-collapse`; return `

${rows.map(renderBuildingRow).join("")}
`; } function renderLetterAccordion(groupName, rows, index) { const letterId = `letter-${slug(groupName)}-${index}`; const headingId = `${letterId}-heading`; const collapseId = `${letterId}-collapse`; const regularRows = rows.filter(row => !clean(row.campus_unit)); const campusRows = rows.filter(row => clean(row.campus_unit)); const campusGroups = {}; campusRows.forEach(row => { const unit = clean(row.campus_unit); if (!campusGroups[unit]) campusGroups[unit] = []; campusGroups[unit].push(row); }); const campusHTML = Object.keys(campusGroups) .sort() .map((unit, i) => renderCampusAccordion(groupName, unit, campusGroups[unit], i)) .join(""); return `

${regularRows.map(renderBuildingRow).join("")} ${campusHTML}
`; } function buildAccordions(rows) { const grouped = {}; LETTER_GROUPS.forEach(group => { grouped[group] = []; }); rows.forEach(row => { const groupSource = clean(row.campus_unit) || clean(row.building_name); const group = getLetterGroup(groupSource); grouped[group].push(row); }); Object.keys(grouped).forEach(group => { grouped[group].sort((a, b) => { const aSort = clean(a.campus_unit) || clean(a.building_name); const bSort = clean(b.campus_unit) || clean(b.building_name); return aSort.localeCompare(bSort); }); }); const activeGroups = LETTER_GROUPS.filter(group => grouped[group].length); const midpoint = Math.ceil(activeGroups.length / 2); const leftGroups = activeGroups.slice(0, midpoint); const rightGroups = activeGroups.slice(midpoint); output.innerHTML = `
${leftGroups.map((group, i) => renderLetterAccordion(group, grouped[group], i)).join("")}
${rightGroups.map((group, i) => renderLetterAccordion(group, grouped[group], i + midpoint)).join("")}
`; } Papa.parse(CSV_URL, { download: true, header: true, skipEmptyLines: true, complete: function (results) { const rows = results.data .map(row => ({ building_name: clean(row.building_name), eap_url: clean(row.eap_url), quiz_url: clean(row.quiz_url), campus_unit: clean(row.campus_unit) })) .filter(row => row.building_name); buildAccordions(rows); }, error: function () { output.innerHTML = `
Building information could not be loaded. Check that the Google Sheet is published as CSV.
`; } }); })();