| <!DOCTYPE html> |
| |
| <html dir="$i18n{textdirection}" lang="$i18n{language}"> |
| |
| <head> |
| <meta charset="utf-8"> |
| <meta name="color-scheme" content="light dark"> |
| <meta name="google" value="notranslate"> |
| |
| <script> |
| function addRow(name, url, isdir, |
| size, size_string, date_modified, date_modified_string) { |
| if (name == "." || name == "..") |
| return; |
| |
| var root = document.location.pathname; |
| if (root.substr(-1) !== "/") |
| root += "/"; |
| |
| var tbody = document.getElementById("tbody"); |
| var row = document.createElement("tr"); |
| var file_cell = document.createElement("td"); |
| var link = document.createElement("a"); |
| |
| link.className = isdir ? "icon dir" : "icon file"; |
| |
| if (isdir) { |
| name = name + "/"; |
| url = url + "/"; |
| size = 0; |
| size_string = ""; |
| } else { |
| link.draggable = "true"; |
| link.addEventListener("dragstart", onDragStart, false); |
| } |
| link.innerText = name; |
| link.href = root + url; |
| |
| file_cell.dataset.value = name; |
| file_cell.appendChild(link); |
| |
| row.appendChild(file_cell); |
| row.appendChild(createCell(size, size_string)); |
| row.appendChild(createCell(date_modified, date_modified_string)); |
| |
| tbody.appendChild(row); |
| } |
| |
| function onDragStart(e) { |
| var el = e.srcElement; |
| var name = el.innerText.replace(":", ""); |
| var download_url_data = "application/octet-stream:" + name + ":" + el.href; |
| e.dataTransfer.setData("DownloadURL", download_url_data); |
| e.dataTransfer.effectAllowed = "copy"; |
| } |
| |
| function createCell(value, text) { |
| var cell = document.createElement("td"); |
| cell.setAttribute("class", "detailsColumn"); |
| cell.dataset.value = value; |
| cell.innerText = text; |
| return cell; |
| } |
| |
| function start(location) { |
| var header = document.getElementById("header"); |
| header.innerText = header.innerText.replace("LOCATION", location); |
| |
| document.getElementById("title").innerText = header.innerText; |
| } |
| |
| function onHasParentDirectory() { |
| var box = document.getElementById("parentDirLinkBox"); |
| box.style.display = "block"; |
| |
| var root = document.location.pathname; |
| if (!root.endsWith("/")) |
| root += "/"; |
| |
| var link = document.getElementById("parentDirLink"); |
| link.href = root + ".."; |
| } |
| |
| function sortTable(column) { |
| var theader = document.getElementById("theader"); |
| var oldOrder = theader.cells[column].dataset.order || '1'; |
| oldOrder = parseInt(oldOrder, 10) |
| var newOrder = 0 - oldOrder; |
| theader.cells[column].dataset.order = newOrder; |
| |
| var tbody = document.getElementById("tbody"); |
| var rows = tbody.rows; |
| var list = [], i; |
| for (i = 0; i < rows.length; i++) { |
| list.push(rows[i]); |
| } |
| |
| list.sort(function(row1, row2) { |
| var a = row1.cells[column].dataset.value; |
| var b = row2.cells[column].dataset.value; |
| if (column) { |
| a = parseInt(a, 10); |
| b = parseInt(b, 10); |
| return a > b ? newOrder : a < b ? oldOrder : 0; |
| } |
| |
| // Column 0 is text. |
| if (a > b) |
| return newOrder; |
| if (a < b) |
| return oldOrder; |
| return 0; |
| }); |
| |
| // Appending an existing child again just moves it. |
| for (i = 0; i < list.length; i++) { |
| tbody.appendChild(list[i]); |
| } |
| } |
| |
| // Add event handlers to column headers. |
| function addHandlers(element, column) { |
| element.onclick = (e) => sortTable(column); |
| element.onkeydown = (e) => { |
| if (e.key == 'Enter' || e.key == ' ') { |
| sortTable(column); |
| e.preventDefault(); |
| } |
| }; |
| } |
| |
| function onLoad() { |
| addHandlers(document.getElementById('nameColumnHeader'), 0); |
| addHandlers(document.getElementById('sizeColumnHeader'), 1); |
| addHandlers(document.getElementById('dateColumnHeader'), 2); |
| } |
| |
| window.addEventListener('DOMContentLoaded', onLoad); |
| </script> |
| |
| <style> |
| |
| h1 { |
| border-bottom: 1px solid #c0c0c0; |
| margin-bottom: 10px; |
| padding-bottom: 10px; |
| white-space: nowrap; |
| } |
| |
| table { |
| border-collapse: collapse; |
| } |
| |
| th { |
| cursor: pointer; |
| } |
| |
| td.detailsColumn { |
| padding-inline-start: 2em; |
| text-align: end; |
| white-space: nowrap; |
| } |
| |
| a.icon { |
| padding-inline-start: 1.5em; |
| text-decoration: none; |
| user-select: auto; |
| } |
| |
| a.icon:hover { |
| text-decoration: underline; |
| } |
| |
| a.file { |
| background : url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMAAAAAAABupgeRAAABEElEQVR42nRRx3HDMBC846AHZ7sP54BmWAyrsP588qnwlhqw/k4v5ZwWxM1hzmGRgV1cYqrRarXoH2w2m6qqiqKIR6cPtzc3xMSML2Te7XZZlnW7Pe/91/dX47WRBHuA9oyGmRknzGDjab1ePzw8bLfb6WRalmW4ip9FDVpYSWZgOp12Oh3nXJ7nxoJSGEciteP9y+fH52q1euv38WosqA6T2gGOT44vry7BEQtJkMAMMpa6JagAMcUfWYa4hkkzAc7fFlSjwqCoOUYAF5RjHZPVCFBOtSBGfgUDji3c3jpibeEMQhIMh8NwshqyRsBJgvF4jMs/YlVR5KhgNpuBLzk0OcUiR3CMhcPaOzsZiAAA/AjmaB3WZIkAAAAASUVORK5CYII=") left top no-repeat; |
| } |
| |
| a.dir { |
| background : url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABt0lEQVR42oxStZoWQRCs2cXdHTLcHZ6EjAwnQWIkJyQlRt4Cd3d3d1n5d7q7ju1zv/q+mh6taQsk8fn29kPDRo87SDMQcNAUJgIQkBjdAoRKdXjm2mOH0AqS+PlkP8sfp0h93iu/PDji9s2FzSSJVg5ykZqWgfGRr9rAAAQiDFoB1OfyESZEB7iAI0lHwLREQBcQQKqo8p+gNUCguwCNAAUQAcFOb0NNGjT+BbUC2YsHZpWLhC6/m0chqIoM1LKbQIIBwlTQE1xAo9QDGDPYf6rkTpPc92gCUYVJAZjhyZltJ95f3zuvLYRGWWCUNkDL2333McBh4kaLlxg+aTmyL7c2xTjkN4Bt7oE3DBP/3SRz65R/bkmBRPGzcRNHYuzMjaj+fdnaFoJUEdTSXfaHbe7XNnMPyqryPcmfY+zURaAB7SHk9cXSH4fQ5rojgCAVIuqCNWgRhLYLhJB4k3iZfIPtnQiCpjAzeBIRXMA6emAqoEbQSoDdGxFUrxS1AYcpaNbBgyQBGJEOnYOeENKR/iAd1npusI4C75/c3539+nbUjOgZV5CkAU27df40lH+agUdIuA/EAgDmZnwZlhDc0wAAAABJRU5ErkJggg==") left top no-repeat; |
| } |
| |
| a.up { |
| background : url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACM0lEQVR42myTA+w1RxRHz+zftmrbdlTbtq04qRGrCmvbDWp9tq3a7tPcub8mj9XZ3eHOGQdJAHw77/LbZuvnWy+c/CIAd+91CMf3bo+bgcBiBAGIZKXb19/zodsAkFT+3px+ssYfyHTQW5tr05dCOf3xN49KaVX9+2zy1dX4XMk+5JflN5MBPL30oVsvnvEyp+18Nt3ZAErQMSFOfelCFvw0HcUloDayljZkX+MmamTAMTe+d+ltZ+1wEaRAX/MAnkJdcujzZyErIiVSzCEvIiq4O83AG7LAkwsfIgAnbncag82jfPPdd9RQyhPkpNJvKJWQBKlYFmQA315n4YPNjwMAZYy0TgAweedLmLzTJSTLIxkWDaVCVfAbbiKjytgmm+EGpMBYW0WwwbZ7lL8anox/UxekaOW544HO0ANAshxuORT/RG5YSrjlwZ3lM955tlQqbtVMlWIhjwzkAVFB8Q9EAAA3AFJ+DR3DO/Pnd3NPi7H117rAzWjpEs8vfIqsGZpaweOfEAAFJKuM0v6kf2iC5pZ9+fmLSZfWBVaKfLLNOXj6lYY0V2lfyVCIsVzmcRV9Y0fx02eTaEwhl2PDrXcjFdYRAohQmS8QEFLCLKGYA0AeEakhCCFDXqxsE0AQACgAQp5w96o0lAXuNASeDKWIvADiHwigfBINpWKtAXJvCEKWgSJNbRvxf4SmrnKDpvZavePu1K/zu/due1X/6Nj90MBd/J2Cic7WjBp/jUdIuA8AUtd65M+PzXIAAAAASUVORK5CYII=") left top no-repeat; |
| } |
| |
| html[dir=rtl] a { |
| background-position-x: right; |
| } |
| |
| #parentDirLinkBox { |
| margin-bottom: 10px; |
| padding-bottom: 10px; |
| } |
| </style> |
| |
| <title id="title"></title> |
| |
| </head> |
| |
| <body> |
| |
| <h1 id="header">$i18n{header}</h1> |
| |
| <div id="parentDirLinkBox" style="display:none"> |
| <a id="parentDirLink" class="icon up"> |
| <span id="parentDirText">$i18n{parentDirText}</span> |
| </a> |
| </div> |
| |
| <table> |
| <thead> |
| <tr class="header" id="theader"> |
| <th id="nameColumnHeader" tabindex=0 role="button">$i18n{headerName}</th> |
| <th id="sizeColumnHeader" class="detailsColumn" tabindex=0 role="button"> |
| $i18n{headerSize} |
| </th> |
| <th id="dateColumnHeader" class="detailsColumn" tabindex=0 role="button"> |
| $i18n{headerDateModified} |
| </th> |
| </tr> |
| </thead> |
| <tbody id="tbody"> |
| </tbody> |
| </table> |
| |
| </body> |
| |
| </html> |