|
| 1 | +(() => { |
| 2 | + // see https://dxr.mozilla.org/mozilla-central/rev/d03b538b6b417ba892d0a92fd693945b741246e1/netwerk/streamconv/converters/nsIndexedToHTML.cpp#381 |
| 3 | + 'use strict'; |
| 4 | + var gTable, gOrderBy, gTBody, gRows, gUI_showHidden; |
| 5 | + document.addEventListener("DOMContentLoaded", function() { |
| 6 | + if ("gUI_showHidden" in window.wrappedJSObject || // scripts are enabled |
| 7 | + !(document.scripts[0] && |
| 8 | + /\bgUI_showHidden\b/.test(document.scripts[0].textContent)) // not a FTP dir listing |
| 9 | + ) { |
| 10 | + return; |
| 11 | + } |
| 12 | + |
| 13 | + gTable = document.getElementsByTagName("table")[0]; |
| 14 | + gTBody = gTable.tBodies[0]; |
| 15 | + if (gTBody.rows.length < 2) |
| 16 | + return; |
| 17 | + gUI_showHidden = document.getElementById("UI_showHidden") |
| 18 | + var headCells = gTable.tHead.rows[0].cells, |
| 19 | + hiddenObjects = false; |
| 20 | + function rowAction(i) { |
| 21 | + return function(event) { |
| 22 | + event.preventDefault(); |
| 23 | + orderBy(i); |
| 24 | + } |
| 25 | + } |
| 26 | + for (var i = headCells.length - 1; i >= 0; i--) { |
| 27 | + var anchor = document.createElement("a"); |
| 28 | + anchor.href = ""; |
| 29 | + anchor.appendChild(headCells[i].firstChild); |
| 30 | + headCells[i].appendChild(anchor); |
| 31 | + headCells[i].addEventListener("click", rowAction(i), true); |
| 32 | + } |
| 33 | + if (gUI_showHidden) { |
| 34 | + gRows = Array.slice(gTBody.rows); |
| 35 | + hiddenObjects = gRows.some(row => row.className == "hidden-object"); |
| 36 | + } |
| 37 | + gTable.setAttribute("order", ""); |
| 38 | + if (hiddenObjects) { |
| 39 | + gUI_showHidden.style.display = "block"; |
| 40 | + updateHidden(); |
| 41 | + } |
| 42 | + }, "false"); |
| 43 | + function compareRows(rowA, rowB) { |
| 44 | + var a = rowA.cells[gOrderBy].getAttribute("sortable-data") || ""; |
| 45 | + var b = rowB.cells[gOrderBy].getAttribute("sortable-data") || ""; |
| 46 | + var intA = +a; |
| 47 | + var intB = +b; |
| 48 | + if (a == intA && b == intB) { |
| 49 | + a = intA; |
| 50 | + b = intB; |
| 51 | + } else { |
| 52 | + a = a.toLowerCase(); |
| 53 | + b = b.toLowerCase(); |
| 54 | + } |
| 55 | + if (a < b) |
| 56 | + return -1; |
| 57 | + if (a > b) |
| 58 | + return 1; |
| 59 | + return 0; |
| 60 | + } |
| 61 | + function orderBy(column) { |
| 62 | + if (!gRows) |
| 63 | + gRows = Array.slice(gTBody.rows); |
| 64 | + var order; |
| 65 | + if (gOrderBy == column) { |
| 66 | + order = gTable.getAttribute("order") == "asc" ? "desc" : "asc"; |
| 67 | + } else { |
| 68 | + order = "asc"; |
| 69 | + gOrderBy = column; |
| 70 | + gTable.setAttribute("order-by", column); |
| 71 | + gRows.sort(compareRows); |
| 72 | + } |
| 73 | + gTable.removeChild(gTBody); |
| 74 | + gTable.setAttribute("order", order); |
| 75 | + if (order == "asc") |
| 76 | + for (var i = 0; i < gRows.length; i++) |
| 77 | + gTBody.appendChild(gRows[i]); |
| 78 | + else |
| 79 | + for (var i = gRows.length - 1; i >= 0; i--) |
| 80 | + gTBody.appendChild(gRows[i]); |
| 81 | + gTable.appendChild(gTBody); |
| 82 | + } |
| 83 | + function updateHidden() { |
| 84 | + gTable.className = gUI_showHidden.getElementsByTagName("input")[0].checked ? |
| 85 | + "" : |
| 86 | + "remove-hidden"; |
| 87 | + } |
| 88 | +})(); |
0 commit comments