maps page

This commit is contained in:
John Hess 2024-06-07 14:38:54 -05:00
parent 7b91e1aed0
commit f602b282d5
13 changed files with 651 additions and 18 deletions

12
_includes/filerow.html Normal file
View file

@ -0,0 +1,12 @@
<a class="filerow" href="{{ include.href }}">
<div class="logo-filerow">
<img src="{{ site.baseurl}}/assets/images/{{ include.icon_filename }}" alt="file extension icon">
</div>
<div class="text-filerow">
<div class="upper-text">{{ include.display_name }}</div>
<div class="lower-text">{{ include.file_name }}</div>
</div>
<div class="empty-block">
<img src="{{ site.baseurl}}/assets/images/download-icon.svg" alt="download">
</div>
</a>

View file

@ -0,0 +1,9 @@
---
layout: basic
---
< {{ page.breadcrumb }} <hr />
<div class="informational-container">
{{ content }}
</div>

View file

@ -2,7 +2,7 @@
// Body Styles
// -------------------------
body {
background-color: #FFFCEC;
background-color: #F9F9F9;
min-height: 100vh;
}
@ -136,6 +136,113 @@ a:active {
object-fit: cover;
}
// --------------------------------
// Informational Layout Styles
// --------------------------------
.informational-container {
width: 100%;
max-width: 680px;
margin: 0 auto;
padding: 10px;
img.hero {
width: 100%;
}
img.app-tile {
width: 66px;
height: 66px;
// center within container
display: block;
margin: auto;
// float higher to overlap previous element
position: relative;
top: -33px;
}
h1 {
font-size: 28px;
font-weight: 700;
margin-bottom: 10px;
text-align: center;
}
p.subtitle {
font-size: 16px;
font-weight: 400;
margin: 0 auto 10px auto;
max-width: 340px;
text-align: center;
}
h2 {
font-size: 18px;
font-weight: 500;
margin: 20px 0 10px 0;
}
p {
font-size: 14px;
font-weight: 400;
margin: 10px 0;
}
.filelist {
background-color: white;
border-radius: 20px;
}
}
// ----------------------------------
// Copied from butter-dir-listing.css
// ----------------------------------
.filerow {
display: flex;
align-items: center;
height: 44px;
margin: 10px;
box-sizing: border-box;
font-family: "Poppins", sans-serif;
}
.logo-filerow {
display: flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
}
.logo-filerow img {
width: 32px;
height: 32px;
}
.text-filerow {
display: flex;
flex-direction: column;
justify-content: center;
flex-grow: 1;
padding: 0 10px;
box-sizing: border-box;
}
.text-filerow .upper-text {
font-size: 14px;
line-height: 18px;
padding: 2px;
color: black;
}
.text-filerow .lower-text {
font-size: 12px;
padding: 2px;
color: gray;
}
.empty-block {
display: flex;
justify-content: center;
align-items: center;
width: 30px;
height: 30px;
}
// -------------------------
// Button Styles
// -------------------------

View file

@ -77,7 +77,7 @@ hr.full-width {
margin: 0;
}
.container {
.filerow {
display: flex;
align-items: center;
width: 100%;
@ -87,7 +87,7 @@ hr.full-width {
font-family: "Poppins", sans-serif;
}
.logo-container {
.logo-filerow {
display: flex;
align-items: center;
justify-content: center;
@ -95,12 +95,12 @@ hr.full-width {
height: 32px;
}
.logo-container img {
.logo-filerow img {
width: 32px;
height: 32px;
}
.text-container {
.text-filerow {
display: flex;
flex-direction: column;
justify-content: center;
@ -109,14 +109,14 @@ hr.full-width {
box-sizing: border-box;
}
.text-container .upper-text {
.text-filerow .upper-text {
font-size: 14px;
line-height: 18px;
padding: 2px;
color: black;
}
.text-container .lower-text {
.text-filerow .lower-text {
font-size: 12px;
padding: 2px;
color: gray;

View file

@ -0,0 +1,6 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7 9L12 14M12 14L17 9M12 14L12 5" stroke="black" stroke-width="2"
stroke-linecap="round" />
<path d="M5 16L5 17C5 18.1046 5.89543 19 7 19L17 19C18.1046 19 19 18.1046 19 17V16"
stroke="black" stroke-width="2" stroke-linecap="round" />
</svg>

After

Width:  |  Height:  |  Size: 369 B

15
assets/images/ext-pbf.svg Normal file
View file

@ -0,0 +1,15 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1788_1370)">
<rect width="32" height="32" rx="16" fill="#90EE90" />
<rect width="32" height="32" rx="16" fill="black" fill-opacity="0.2" />
<path
d="M24.5376 7.04002C23.8754 6.63815 23.0544 6.60074 22.3584 6.94085L18.3104 8.9792L14.8704 7.0144C14.2186 6.64971 13.4292 6.62816 12.7584 6.95679L7.63845 9.51679C7.26637 9.70284 6.95344 9.98877 6.73469 10.3425C6.51594 10.6964 6.4001 11.1041 6.4 11.52V23.04C6.39489 23.8216 6.7976 24.5492 7.4624 24.96C8.12458 25.3619 8.94562 25.3993 9.64157 25.0592L13.6896 23.0368L17.1296 25.0016C17.7815 25.3657 18.5707 25.3873 19.2415 25.0592L24.3615 22.4992C24.7361 22.312 25.0506 22.0236 25.2696 21.6667C25.4884 21.3098 25.6029 20.8987 25.6 20.48V8.96002C25.6051 8.17845 25.2024 7.45085 24.5376 7.04002ZM12.16 21.6384L8.784 23.3248C8.73941 23.3476 8.69014 23.3597 8.64004 23.36C8.57983 23.3615 8.52014 23.3472 8.46723 23.3184C8.37275 23.2578 8.31691 23.1522 8.32004 23.04V11.52C8.32046 11.3995 8.38848 11.2894 8.49608 11.2352L12.1601 9.40153L12.16 21.6384ZM17.92 23.2384L14.6432 21.3536C14.4677 21.254 14.2777 21.1828 14.08 21.1424V8.77437L17.3568 10.6463C17.5325 10.7448 17.7225 10.815 17.92 10.8544V23.2384ZM23.68 20.48C23.6796 20.6005 23.6116 20.7106 23.504 20.7648L19.84 22.5985V10.3617L23.216 8.6721C23.2607 8.65043 23.3101 8.63939 23.3599 8.64012C23.4201 8.63856 23.4798 8.65293 23.5327 8.68168C23.6272 8.74231 23.683 8.84793 23.6799 8.96011L23.68 20.48Z"
fill="white" />
</g>
<defs>
<clipPath id="clip0_1788_1370">
<rect width="32" height="32" rx="16" fill="white" />
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 856 KiB

BIN
assets/images/osm-tile.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -15,11 +15,11 @@ console.log("Inferred Base URL:", inferredBaseURL);
const getFolderDivHTML = (directory_name, number_of_items, href) => {
return `
<a class="container" href="${href}">
<div class="logo-container">
<a class="filerow" href="${href}">
<div class="logo-filerow">
<img src="${inferredBaseURL}assets/images/directory.svg" alt="directory">
</div>
<div class="text-container">
<div class="text-filerow">
<div class="upper-text">${directory_name}</div>
<div class="lower-text">${number_of_items} items</div>
</div>
@ -35,11 +35,11 @@ const getFileDivHTML = (file_name, size, date, href) => {
icon = "ext-" + extension + ".svg";
}
return `
<a class="container" href="${href}">
<div class="logo-container">
<a class="filerow" href="${href}">
<div class="logo-filerow">
<img src="${inferredBaseURL}assets/images/${icon}" alt="directory">
</div>
<div class="text-container">
<div class="text-filerow">
<div class="upper-text">${file_name}</div>
<div class="lower-text">${size} | ${date}</div>
</div>

View file

@ -25,11 +25,12 @@ layout: default
{% t app_store %}
</div>
</a>
<!-- Hidden until we have a design ready to implement. -->
<div class="card" style="display: none;">
<img src="{{ site.baseurl }}/assets/images/maps-icon.png" alt="Maps Icon" class="card-icon">
{% t offline_maps %}
</div>
<a href="{{ site.baseurl }}/maps">
<div class="card">
<img src="{{ site.baseurl }}/assets/images/maps-icon.png" alt="Maps Icon" class="card-icon">
{% t offline_maps %}
</div>
</a>
</div>
</div>

23
maps.html Normal file
View file

@ -0,0 +1,23 @@
---
layout: informational
breadcrumb: "Offline Maps"
---
<img src="{{ site.baseurl }}/assets/images/maps-header.png" alt="Maps Header" class="hero">
<img src="{{ site.baseurl }}/assets/images/osm-tile.png" alt="OpenStreetMaps Tile" class="app-tile">
<h1>Navigating Offline</h1>
<p class="subtitle">OsmAnd is an offline world map application based on OpenStreetMap</p>
[Button goes here]
<h2>About OsmAnd</h2>
<p>OsmAnd allows you to navigate taking into account the preferred roads and vehicle dimensions. Plan routes based on inclines and record GPX tracks without an internet connection. OsmAnd is an open source app. It does not collect user data and you decide what data the app will have access to.</p>
<h2>Map Files</h2>
<p>Download map files for your region. To import a map file into OsmAnd, locate the file in your device downloads. Then open it with the OsmAnd app.</p>
<!-- TODO: Determine these automatically with JS. -->
<div class="filelist">
{% include filerow.html display_name="Zimbabwe" file_name="zim.zip" icon_filename="ext-pbf.svg" href="/" %}
</div>

234
usb-butter/index.html Normal file
View file

@ -0,0 +1,234 @@
---
layout: empty
---
<!-- This simulates a drive being plugged in. CI moves this into place as /usb-butter. You can too. -->
<!-- Mostly, this is a copy paste of the real dirlisting. We modify the JS and CSS links to load ones from this repo. -->
<!DOCTYPE html>
<html>
<head>
<title>Index of /usb-butter/</title>
<meta name="viewport" content="initial-scale=1">
<link rel="stylesheet" type="text/css" href="{{ site.baseurl }}/assets/css/butter-dir-listing.css">
<script src="{{ site.baseurl }}/assets/js/butter-dir-listing.js"></script>
</head>
<body>
<h2>Index of /usb-butter/</h2>
<div class="list">
<table summary="Directory Listing" cellpadding="0" cellspacing="0">
<thead>
<tr>
<th class="n">Name</th>
<th class="m">Last Modified</th>
<th class="s">Size</th>
<th class="t">Type</th>
</tr>
</thead>
<tbody>
<tr class="d"><td class="n"><a href="../">..</a>/</td><td class="m">&nbsp;</td><td class="s">- &nbsp;</td><td class="t">Directory</td></tr>
<tr class="d"><td class="n"><a href="John%27s%20Folder/">John&#x27;s Folder</a>/</td><td class="m">2024-Jun-05 12:29:30</td><td class="s">- &nbsp;</td><td class="t">Directory</td></tr>
<tr class="d"><td class="n"><a href="johns_folder/">johns_folder</a>/</td><td class="m">2024-May-01 15:39:05</td><td class="s">- &nbsp;</td><td class="t">Directory</td></tr>
<tr class="d"><td class="n"><a href="ocw/">ocw</a>/</td><td class="m">2024-Mar-29 20:42:52</td><td class="s">- &nbsp;</td><td class="t">Directory</td></tr>
<tr><td class="n"><a href="some_file.txt">some_file.txt</a></td><td class="m">2024-Jun-05 11:54:57</td><td class="s">0.0K</td><td class="t">text/plain;charset=utf-8</td></tr>
</tbody>
</table>
</div>
<div class="foot">lighttpd/1.4.69</div>
<script type="text/javascript">
// <!--
var click_column;
var name_column = 0;
var date_column = 1;
var size_column = 2;
var type_column = 3;
var prev_span = null;
if (typeof (String.prototype.localeCompare) === 'undefined') {
String.prototype.localeCompare = function (str, locale, options) {
return ((this == str) ? 0 : ((this > str) ? 1 : -1));
};
}
if (typeof (String.prototype.toLocaleUpperCase) === 'undefined') {
String.prototype.toLocaleUpperCase = function () {
return this.toUpperCase();
};
}
function get_inner_text(el) {
if ((typeof el == 'string') || (typeof el == 'undefined'))
return el;
if (el.innerText)
return el.innerText;
else {
var str = "";
var cs = el.childNodes;
var l = cs.length;
for (var i = 0; i < l; i++) {
if (cs[i].nodeType == 1) str += get_inner_text(cs[i]);
else if (cs[i].nodeType == 3) str += cs[i].nodeValue;
}
}
return str;
}
function isdigit(c) {
return (c >= '0' && c <= '9');
}
function unit_multiplier(unit) {
return (unit == 'K') ? 1000
: (unit == 'M') ? 1000000
: (unit == 'G') ? 1000000000
: (unit == 'T') ? 1000000000000
: (unit == 'P') ? 1000000000000000
: (unit == 'E') ? 1000000000000000000 : 1;
}
var li_date_regex = /(\d{4})-(\w{3})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/;
var li_mon = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
function li_mon_num(mon) {
var i; for (i = 0; i < 12 && mon != li_mon[i]; ++i); return i;
}
function li_date_cmp(s1, s2) {
var dp1 = li_date_regex.exec(s1)
var dp2 = li_date_regex.exec(s2)
for (var i = 1; i < 7; ++i) {
var cmp = (2 != i)
? parseInt(dp1[i]) - parseInt(dp2[i])
: li_mon_num(dp1[2]) - li_mon_num(dp2[2]);
if (0 != cmp) return cmp;
}
return 0;
}
function sortfn_then_by_name(a, b, sort_column) {
if (sort_column == name_column || sort_column == type_column) {
var ad = (a.cells[type_column].innerHTML === 'Directory');
var bd = (b.cells[type_column].innerHTML === 'Directory');
if (ad != bd) return (ad ? -1 : 1);
}
var at = get_inner_text(a.cells[sort_column]);
var bt = get_inner_text(b.cells[sort_column]);
var cmp;
if (sort_column == name_column) {
if (at == '../') return -1;
if (bt == '../') return 1;
}
if (a.cells[sort_column].className == 'int') {
cmp = parseInt(at) - parseInt(bt);
} else if (sort_column == date_column) {
var ad = isdigit(at.substr(0, 1));
var bd = isdigit(bt.substr(0, 1));
if (ad != bd) return (!ad ? -1 : 1);
cmp = li_date_cmp(at, bt);
} else if (sort_column == size_column) {
var ai = parseInt(at, 10) * unit_multiplier(at.substr(-1, 1));
var bi = parseInt(bt, 10) * unit_multiplier(bt.substr(-1, 1));
if (at.substr(0, 1) == '-') ai = -1;
if (bt.substr(0, 1) == '-') bi = -1;
cmp = ai - bi;
} else {
cmp = at.toLocaleUpperCase().localeCompare(bt.toLocaleUpperCase());
if (0 != cmp) return cmp;
cmp = at.localeCompare(bt);
}
if (0 != cmp || sort_column == name_column) return cmp;
return sortfn_then_by_name(a, b, name_column);
}
function sortfn(a, b) {
return sortfn_then_by_name(a, b, click_column);
}
function resort(lnk) {
var span = lnk.childNodes[1];
var table = lnk.parentNode.parentNode.parentNode.parentNode;
var rows = new Array();
for (var j = 1; j < table.rows.length; j++)
rows[j - 1] = table.rows[j];
click_column = lnk.parentNode.cellIndex;
rows.sort(sortfn);
if (prev_span != null) prev_span.innerHTML = '';
if (span.getAttribute('sortdir') == 'down') {
span.innerHTML = '&uarr;';
span.setAttribute('sortdir', 'up');
rows.reverse();
} else {
span.innerHTML = '&darr;';
span.setAttribute('sortdir', 'down');
}
for (var i = 0; i < rows.length; i++)
table.tBodies[0].appendChild(rows[i]);
prev_span = span;
}
function init_sort(init_sort_column, ascending) {
var tables = document.getElementsByTagName("table");
for (var i = 0; i < tables.length; i++) {
var table = tables[i];
//var c = table.getAttribute("class")
//if (-1 != c.split(" ").indexOf("sort")) {
var row = table.rows[0].cells;
for (var j = 0; j < row.length; j++) {
var n = row[j];
if (n.childNodes.length == 1 && n.childNodes[0].nodeType == 3) {
var link = document.createElement("a");
var title = n.childNodes[0].nodeValue.replace(/:$/, "");
link.appendChild(document.createTextNode(title));
link.setAttribute("href", "#");
link.setAttribute("class", "sortheader");
link.setAttribute("onclick", "resort(this);return false;");
var arrow = document.createElement("span");
arrow.setAttribute("class", "sortarrow");
arrow.appendChild(document.createTextNode(":"));
link.appendChild(arrow)
n.replaceChild(link, n.firstChild);
}
}
var lnk = row[init_sort_column].firstChild;
if (ascending) {
var span = lnk.childNodes[1];
span.setAttribute('sortdir', 'down');
}
resort(lnk);
//}
}
}
function init_sort_from_query() {
var urlParams = new URLSearchParams(location.search);
var c = 0;
var o = 0;
switch (urlParams.get('C')) {
case "N": c = 0; break;
case "M": c = 1; break;
case "S": c = 2; break;
case "T":
case "D": c = 3; break;
}
switch (urlParams.get('O')) {
case "A": o = 1; break;
case "D": o = 0; break;
}
init_sort(c, o);
}
init_sort_from_query();
// -->
</script>
</body>
</html>

View file

@ -0,0 +1,226 @@
---
layout: empty
---
<!-- This simulates a drive being plugged in. CI moves this into place as /usb-butter. You can too. -->
<!-- Mostly, this is a copy paste of the real dirlisting. We modify the JS and CSS links to load ones from this repo. -->
<!DOCTYPE html>
<html>
<head>
<title>Index of /usb-butter/johns_folder/</title>
<meta name="viewport" content="initial-scale=1">
<link rel="stylesheet" type="text/css" href="{{ site.baseurl }}/assets/css/butter-dir-listing.css">
<script src="{{ site.baseurl }}/assets/js/butter-dir-listing.js"></script>
</head>
<body>
<h2>Index of /usb-butter/johns_folder/</h2>
<div class="list">
<table summary="Directory Listing" cellpadding="0" cellspacing="0">
<thead><tr><th class="n">Name</th><th class="m">Last Modified</th><th class="s">Size</th><th class="t">Type</th></tr></thead>
<tbody>
<tr class="d"><td class="n"><a href="../">..</a>/</td><td class="m">&nbsp;</td><td class="s">- &nbsp;</td><td class="t">Directory</td></tr>
<tr class="d"><td class="n"><a href="johns_subfolder1/">johns_subfolder1</a>/</td><td class="m">2024-Apr-30 17:11:52</td><td class="s">- &nbsp;</td><td class="t">Directory</td></tr>
<tr class="d"><td class="n"><a href="johns_subfolder2/">johns_subfolder2</a>/</td><td class="m">2024-Apr-30 17:11:54</td><td class="s">- &nbsp;</td><td class="t">Directory</td></tr>
<tr><td class="n"><a href="lub.pdf">lub.pdf</a></td><td class="m">2024-May-01 15:38:22</td><td class="s">30.3M</td><td class="t">application/zip</td></tr>
<tr><td class="n"><a href="test.apk">test.apk</a></td><td class="m">2024-Mar-07 14:55:59</td><td class="s">0.0K</td><td class="t">text/plain;charset=utf-8</td></tr>
<tr><td class="n"><a href="foo.img">foo.img</a></td><td class="m">2024-Mar-07 14:55:59</td><td class="s">0.0K</td><td class="t">text/plain;charset=utf-8</td></tr>
</tbody>
</table>
</div>
<div class="foot">lighttpd/1.4.69</div>
<script type="text/javascript">
// <!--
var click_column;
var name_column = 0;
var date_column = 1;
var size_column = 2;
var type_column = 3;
var prev_span = null;
if (typeof(String.prototype.localeCompare) === 'undefined') {
String.prototype.localeCompare = function(str, locale, options) {
return ((this == str) ? 0 : ((this > str) ? 1 : -1));
};
}
if (typeof(String.prototype.toLocaleUpperCase) === 'undefined') {
String.prototype.toLocaleUpperCase = function() {
return this.toUpperCase();
};
}
function get_inner_text(el) {
if((typeof el == 'string')||(typeof el == 'undefined'))
return el;
if(el.innerText)
return el.innerText;
else {
var str = "";
var cs = el.childNodes;
var l = cs.length;
for (var i=0;i<l;i++) {
if (cs[i].nodeType==1) str += get_inner_text(cs[i]);
else if (cs[i].nodeType==3) str += cs[i].nodeValue;
}
}
return str;
}
function isdigit(c) {
return (c >= '0' && c <= '9');
}
function unit_multiplier(unit) {
return (unit=='K') ? 1000
: (unit=='M') ? 1000000
: (unit=='G') ? 1000000000
: (unit=='T') ? 1000000000000
: (unit=='P') ? 1000000000000000
: (unit=='E') ? 1000000000000000000 : 1;
}
var li_date_regex=/(\d{4})-(\w{3})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/;
var li_mon = ['Jan','Feb','Mar','Apr','May','Jun',
'Jul','Aug','Sep','Oct','Nov','Dec'];
function li_mon_num(mon) {
var i; for (i = 0; i < 12 && mon != li_mon[i]; ++i); return i;
}
function li_date_cmp(s1, s2) {
var dp1 = li_date_regex.exec(s1)
var dp2 = li_date_regex.exec(s2)
for (var i = 1; i < 7; ++i) {
var cmp = (2 != i)
? parseInt(dp1[i]) - parseInt(dp2[i])
: li_mon_num(dp1[2]) - li_mon_num(dp2[2]);
if (0 != cmp) return cmp;
}
return 0;
}
function sortfn_then_by_name(a,b,sort_column) {
if (sort_column == name_column || sort_column == type_column) {
var ad = (a.cells[type_column].innerHTML === 'Directory');
var bd = (b.cells[type_column].innerHTML === 'Directory');
if (ad != bd) return (ad ? -1 : 1);
}
var at = get_inner_text(a.cells[sort_column]);
var bt = get_inner_text(b.cells[sort_column]);
var cmp;
if (sort_column == name_column) {
if (at == '../') return -1;
if (bt == '../') return 1;
}
if (a.cells[sort_column].className == 'int') {
cmp = parseInt(at)-parseInt(bt);
} else if (sort_column == date_column) {
var ad = isdigit(at.substr(0,1));
var bd = isdigit(bt.substr(0,1));
if (ad != bd) return (!ad ? -1 : 1);
cmp = li_date_cmp(at,bt);
} else if (sort_column == size_column) {
var ai = parseInt(at, 10) * unit_multiplier(at.substr(-1,1));
var bi = parseInt(bt, 10) * unit_multiplier(bt.substr(-1,1));
if (at.substr(0,1) == '-') ai = -1;
if (bt.substr(0,1) == '-') bi = -1;
cmp = ai - bi;
} else {
cmp = at.toLocaleUpperCase().localeCompare(bt.toLocaleUpperCase());
if (0 != cmp) return cmp;
cmp = at.localeCompare(bt);
}
if (0 != cmp || sort_column == name_column) return cmp;
return sortfn_then_by_name(a,b,name_column);
}
function sortfn(a,b) {
return sortfn_then_by_name(a,b,click_column);
}
function resort(lnk) {
var span = lnk.childNodes[1];
var table = lnk.parentNode.parentNode.parentNode.parentNode;
var rows = new Array();
for (var j=1;j<table.rows.length;j++)
rows[j-1] = table.rows[j];
click_column = lnk.parentNode.cellIndex;
rows.sort(sortfn);
if (prev_span != null) prev_span.innerHTML = '';
if (span.getAttribute('sortdir')=='down') {
span.innerHTML = '&uarr;';
span.setAttribute('sortdir','up');
rows.reverse();
} else {
span.innerHTML = '&darr;';
span.setAttribute('sortdir','down');
}
for (var i=0;i<rows.length;i++)
table.tBodies[0].appendChild(rows[i]);
prev_span = span;
}
function init_sort(init_sort_column, ascending) {
var tables = document.getElementsByTagName("table");
for (var i = 0; i < tables.length; i++) {
var table = tables[i];
//var c = table.getAttribute("class")
//if (-1 != c.split(" ").indexOf("sort")) {
var row = table.rows[0].cells;
for (var j = 0; j < row.length; j++) {
var n = row[j];
if (n.childNodes.length == 1 && n.childNodes[0].nodeType == 3) {
var link = document.createElement("a");
var title = n.childNodes[0].nodeValue.replace(/:$/, "");
link.appendChild(document.createTextNode(title));
link.setAttribute("href", "#");
link.setAttribute("class", "sortheader");
link.setAttribute("onclick", "resort(this);return false;");
var arrow = document.createElement("span");
arrow.setAttribute("class", "sortarrow");
arrow.appendChild(document.createTextNode(":"));
link.appendChild(arrow)
n.replaceChild(link, n.firstChild);
}
}
var lnk = row[init_sort_column].firstChild;
if (ascending) {
var span = lnk.childNodes[1];
span.setAttribute('sortdir','down');
}
resort(lnk);
//}
}
}
function init_sort_from_query() {
var urlParams = new URLSearchParams(location.search);
var c = 0;
var o = 0;
switch (urlParams.get('C')) {
case "N": c=0; break;
case "M": c=1; break;
case "S": c=2; break;
case "T":
case "D": c=3; break;
}
switch (urlParams.get('O')) {
case "A": o=1; break;
case "D": o=0; break;
}
init_sort(c,o);
}
init_sort_from_query();
// -->
</script>
</body>
</html>