1<!DOCTYPE html> 2 3<html dir="$i18n{textdirection}" lang="$i18n{language}"> 4 5<head> 6<meta charset="utf-8"> 7<meta name="color-scheme" content="light dark"> 8<meta name="google" value="notranslate"> 9 10<script> 11function addRow(name, url, isdir, 12 size, size_string, date_modified, date_modified_string) { 13 if (name == "." || name == "..") 14 return; 15 16 var root = document.location.pathname; 17 if (root.substr(-1) !== "/") 18 root += "/"; 19 20 var tbody = document.getElementById("tbody"); 21 var row = document.createElement("tr"); 22 var file_cell = document.createElement("td"); 23 var link = document.createElement("a"); 24 25 link.className = isdir ? "icon dir" : "icon file"; 26 27 if (isdir) { 28 name = name + "/"; 29 url = url + "/"; 30 size = 0; 31 size_string = ""; 32 } else { 33 link.draggable = "true"; 34 link.addEventListener("dragstart", onDragStart, false); 35 } 36 link.innerText = name; 37 link.href = root + url; 38 39 file_cell.dataset.value = name; 40 file_cell.appendChild(link); 41 42 row.appendChild(file_cell); 43 row.appendChild(createCell(size, size_string)); 44 row.appendChild(createCell(date_modified, date_modified_string)); 45 46 tbody.appendChild(row); 47} 48 49function onDragStart(e) { 50 var el = e.srcElement; 51 var name = el.innerText.replace(":", ""); 52 var download_url_data = "application/octet-stream:" + name + ":" + el.href; 53 e.dataTransfer.setData("DownloadURL", download_url_data); 54 e.dataTransfer.effectAllowed = "copy"; 55} 56 57function createCell(value, text) { 58 var cell = document.createElement("td"); 59 cell.setAttribute("class", "detailsColumn"); 60 cell.dataset.value = value; 61 cell.innerText = text; 62 return cell; 63} 64 65function start(location) { 66 var header = document.getElementById("header"); 67 header.innerText = header.innerText.replace("LOCATION", location); 68 69 document.getElementById("title").innerText = header.innerText; 70} 71 72function onHasParentDirectory() { 73 var box = document.getElementById("parentDirLinkBox"); 74 box.style.display = "block"; 75 76 var root = document.location.pathname; 77 if (!root.endsWith("/")) 78 root += "/"; 79 80 var link = document.getElementById("parentDirLink"); 81 link.href = root + ".."; 82} 83 84function sortTable(column) { 85 var theader = document.getElementById("theader"); 86 var oldOrder = theader.cells[column].dataset.order || '1'; 87 oldOrder = parseInt(oldOrder, 10) 88 var newOrder = 0 - oldOrder; 89 theader.cells[column].dataset.order = newOrder; 90 91 var tbody = document.getElementById("tbody"); 92 var rows = tbody.rows; 93 var list = [], i; 94 for (i = 0; i < rows.length; i++) { 95 list.push(rows[i]); 96 } 97 98 list.sort(function(row1, row2) { 99 var a = row1.cells[column].dataset.value; 100 var b = row2.cells[column].dataset.value; 101 if (column) { 102 a = parseInt(a, 10); 103 b = parseInt(b, 10); 104 return a > b ? newOrder : a < b ? oldOrder : 0; 105 } 106 107 // Column 0 is text. 108 if (a > b) 109 return newOrder; 110 if (a < b) 111 return oldOrder; 112 return 0; 113 }); 114 115 // Appending an existing child again just moves it. 116 for (i = 0; i < list.length; i++) { 117 tbody.appendChild(list[i]); 118 } 119} 120 121// Add event handlers to column headers. 122function addHandlers(element, column) { 123 element.onclick = (e) => sortTable(column); 124 element.onkeydown = (e) => { 125 if (e.key == 'Enter' || e.key == ' ') { 126 sortTable(column); 127 e.preventDefault(); 128 } 129 }; 130} 131 132function onLoad() { 133 addHandlers(document.getElementById('nameColumnHeader'), 0); 134 addHandlers(document.getElementById('sizeColumnHeader'), 1); 135 addHandlers(document.getElementById('dateColumnHeader'), 2); 136} 137 138window.addEventListener('DOMContentLoaded', onLoad); 139</script> 140 141<style> 142 143 h1 { 144 border-bottom: 1px solid #c0c0c0; 145 margin-bottom: 10px; 146 padding-bottom: 10px; 147 white-space: nowrap; 148 } 149 150 table { 151 border-collapse: collapse; 152 } 153 154 th { 155 cursor: pointer; 156 } 157 158 td.detailsColumn { 159 padding-inline-start: 2em; 160 text-align: end; 161 white-space: nowrap; 162 } 163 164 a.icon { 165 padding-inline-start: 1.5em; 166 text-decoration: none; 167 user-select: auto; 168 } 169 170 a.icon:hover { 171 text-decoration: underline; 172 } 173 174 a.file { 175 background : url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMAAAAAAABupgeRAAABEElEQVR42nRRx3HDMBC846AHZ7sP54BmWAyrsP588qnwlhqw/k4v5ZwWxM1hzmGRgV1cYqrRarXoH2w2m6qqiqKIR6cPtzc3xMSML2Te7XZZlnW7Pe/91/dX47WRBHuA9oyGmRknzGDjab1ePzw8bLfb6WRalmW4ip9FDVpYSWZgOp12Oh3nXJ7nxoJSGEciteP9y+fH52q1euv38WosqA6T2gGOT44vry7BEQtJkMAMMpa6JagAMcUfWYa4hkkzAc7fFlSjwqCoOUYAF5RjHZPVCFBOtSBGfgUDji3c3jpibeEMQhIMh8NwshqyRsBJgvF4jMs/YlVR5KhgNpuBLzk0OcUiR3CMhcPaOzsZiAAA/AjmaB3WZIkAAAAASUVORK5CYII=") left top no-repeat; 176 } 177 178 a.dir { 179 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; 180 } 181 182 a.up { 183 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; 184 } 185 186 html[dir=rtl] a { 187 background-position-x: right; 188 } 189 190 #parentDirLinkBox { 191 margin-bottom: 10px; 192 padding-bottom: 10px; 193 } 194</style> 195 196<title id="title"></title> 197 198</head> 199 200<body> 201 202<h1 id="header">$i18n{header}</h1> 203 204<div id="parentDirLinkBox" style="display:none"> 205 <a id="parentDirLink" class="icon up"> 206 <span id="parentDirText">$i18n{parentDirText}</span> 207 </a> 208</div> 209 210<table> 211 <thead> 212 <tr class="header" id="theader"> 213 <th id="nameColumnHeader" tabindex=0 role="button">$i18n{headerName}</th> 214 <th id="sizeColumnHeader" class="detailsColumn" tabindex=0 role="button"> 215 $i18n{headerSize} 216 </th> 217 <th id="dateColumnHeader" class="detailsColumn" tabindex=0 role="button"> 218 $i18n{headerDateModified} 219 </th> 220 </tr> 221 </thead> 222 <tbody id="tbody"> 223 </tbody> 224</table> 225 226</body> 227 228</html> 229