109 lines
3.3 KiB
JavaScript
109 lines
3.3 KiB
JavaScript
"use strict";
|
|
|
|
// error handler for mobile devices
|
|
function hcroak(msg) {
|
|
document.body.innerHTML = msg;
|
|
window.onerror = undefined;
|
|
throw 'fatal_err';
|
|
}
|
|
function croak(msg) {
|
|
document.body.textContent = msg;
|
|
window.onerror = undefined;
|
|
throw msg;
|
|
}
|
|
function esc(txt) {
|
|
return txt.replace(/[&"<>]/g, function (c) {
|
|
return {
|
|
'&': '&',
|
|
'"': '"',
|
|
'<': '<',
|
|
'>': '>'
|
|
}[c];
|
|
});
|
|
}
|
|
function vis_exh(msg, url, lineNo, columnNo, error) {
|
|
window.onerror = undefined;
|
|
var html = ['<h1>you hit a bug!</h1><p>please screenshot this error and send me a copy arigathanks gozaimuch (ed/irc.rizon.net or ed#2644)</p><p>',
|
|
esc(String(msg)), '</p><p>', esc(url + ' @' + lineNo + ':' + columnNo), '</p>'];
|
|
|
|
if (error) {
|
|
var find = ['desc', 'stack', 'trace'];
|
|
for (var a = 0; a < find.length; a++)
|
|
if (String(error[find[a]]) !== 'undefined')
|
|
html.push('<h2>' + find[a] + '</h2>' +
|
|
esc(String(error[find[a]])).replace(/\n/g, '<br />\n'));
|
|
}
|
|
document.body.style.fontSize = '0.8em';
|
|
document.body.style.padding = '0 1em 1em 1em';
|
|
hcroak(html.join('\n'));
|
|
};
|
|
|
|
|
|
function ebi(id) {
|
|
return document.getElementById(id);
|
|
}
|
|
|
|
|
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith
|
|
if (!String.prototype.endsWith) {
|
|
String.prototype.endsWith = function (search, this_len) {
|
|
if (this_len === undefined || this_len > this.length) {
|
|
this_len = this.length;
|
|
}
|
|
return this.substring(this_len - search.length, this_len) === search;
|
|
};
|
|
}
|
|
if (!String.startsWith) {
|
|
String.prototype.startsWith = function (s, i) {
|
|
i = i > 0 ? i | 0 : 0;
|
|
return this.substring(i, i + s.length) === s;
|
|
};
|
|
}
|
|
|
|
|
|
// https://stackoverflow.com/a/950146
|
|
function import_js(url, cb) {
|
|
var head = document.head || document.getElementsByTagName('head')[0];
|
|
var script = document.createElement('script');
|
|
script.type = 'text/javascript';
|
|
script.src = url;
|
|
|
|
script.onreadystatechange = cb;
|
|
script.onload = cb;
|
|
|
|
head.appendChild(script);
|
|
}
|
|
|
|
|
|
function sortTable(table, col) {
|
|
var tb = table.tBodies[0], // use `<tbody>` to ignore `<thead>` and `<tfoot>` rows
|
|
th = table.tHead.rows[0].cells,
|
|
tr = Array.prototype.slice.call(tb.rows, 0),
|
|
i, reverse = th[col].className == 'sort1' ? -1 : 1;
|
|
for (var a = 0, thl = th.length; a < thl; a++)
|
|
th[a].className = '';
|
|
th[col].className = 'sort' + reverse;
|
|
var stype = th[col].getAttribute('sort');
|
|
tr = tr.sort(function (a, b) {
|
|
var v1 = a.cells[col].textContent.trim();
|
|
var v2 = b.cells[col].textContent.trim();
|
|
if (stype == 'int') {
|
|
v1 = parseInt(v1.replace(/,/g, ''));
|
|
v2 = parseInt(v2.replace(/,/g, ''));
|
|
return reverse * (v1 - v2);
|
|
}
|
|
return reverse * (v1.localeCompare(v2));
|
|
});
|
|
for (i = 0; i < tr.length; ++i) tb.appendChild(tr[i]);
|
|
}
|
|
function makeSortable(table) {
|
|
var th = table.tHead, i;
|
|
th && (th = th.rows[0]) && (th = th.cells);
|
|
if (th) i = th.length;
|
|
else return; // if no `<thead>` then do nothing
|
|
while (--i >= 0) (function (i) {
|
|
th[i].onclick = function () {
|
|
sortTable(table, i);
|
|
};
|
|
}(i));
|
|
} |