/**
 * @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));