(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 `
`;
}
return `
${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.
`;
}
});
})();