/**
* @file table_sorter.js
* @date 2025-09-27
* @author Gernot Walzl
*/
let lastClickedTableHeader = null;
let lastTableHeaderOrder = "asc";
function getTableBodyContent(table) {
let tableData = [];
const tableBody = table.getElementsByTagName("tbody")[0];
const rows = tableBody.rows;
for (let r=0; r<rows.length; r++) {
let rowData = [];
const cells = rows[r].cells;
for (let c=0; c<cells.length; c++) {
let cellData = cells[c].innerHTML;
if (cellData.trim().length > 0 && !isNaN(cellData)) {
cellData = Number(cellData);
}
rowData.push(cellData);
}
tableData.push(rowData);
}
return tableData;
}
function setTableBodyContent(table, data) {
const tableBody = table.getElementsByTagName("tbody")[0];
const rows = tableBody.rows;
for (let r=0; r<rows.length; r++) {
const cells = rows[r].cells;
for (let c=0; c<cells.length; c++) {
cells[c].innerHTML = data[r][c];
}
}
}
function onTableHeaderClick(event) {
const header = event.target;
let order = "asc";
if (lastClickedTableHeader === header && lastTableHeaderOrder === "asc") {
order = "desc";
}
const colIdx = header.cellIndex;
const table = header.parentElement.parentElement.parentElement;
let data = getTableBodyContent(table);
data.sort((a, b) => {
if (a[colIdx] > b[colIdx]) {
return order === "asc" ? 1 : -1;
} else if (a[colIdx] < b[colIdx]) {
return order === "asc" ? -1 : 1;
} else {
return 0;
}
});
setTableBodyContent(table, data);
lastClickedTableHeader = header;
lastTableHeaderOrder = order;
}
const sortableTableHeaders = document.querySelectorAll("th.sortable");
sortableTableHeaders.forEach(th => th.addEventListener("click", onTableHeaderClick));