1 2function filterTable() { 3 const filterText = document.getElementById("searchInput").value.toLowerCase(); 4 const rows = Array.from(document.getElementById("resultsTable").rows).slice(1); 5 6 let visibleRowsCount = 0; 7 8 rows.forEach(row => { 9 const [name, funder, targetGroupsCell, deadlineCell] = row.getElementsByTagName("td"); 10 11 const matchesText = !filterText || `${name.textContent} ${targetGroupsCell.textContent} ${targetGroupsCell.textContent.split(',').map(group => group.trim()).join(' ')} ${funder.textContent}`.toLowerCase().includes(filterText); 12 13 row.style.display = (matchesText) ? "" : "none"; 14 if (row.style.display !== "none") visibleRowsCount++; 15 }); 16 17 const sortOrder = deadlineSortAscending ? 1 : -1; 18 19 rows.sort((a, b) => { 20 const dateA = new Date(a.cells[3].textContent); 21 const dateB = new Date(b.cells[3].textContent); 22 return (dateA - dateB) * sortOrder; 23 }); 24 25 rows.forEach(row => row.parentNode.appendChild(row)); 26 27 document.getElementById("noResultsMessage").style.display = visibleRowsCount === 0 ? "block" : "none"; 28}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.