User:David Kernow/monobook.js
Appearance
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
The accompanying .css page for this skin is at User:David Kernow/monobook.css. |
// NAVIGATION POPUPS TOOL
// [[User:Lupin/popups.js]]
mw.loader.load(
'https://en.wikipedia.org/w/index.php?title=User:Lupin/popups.js'
+ '&action=raw&ctype=text/javascript&dontcountme=s');
// SORTTABLE extension to enable table-sorting
/*
* From: http://www.kryogenix.org/code/browser/sorttable/
* Licence: X11
*/
$(sortables_init);
var SORT_COLUMN_INDEX;
function sortables_init() {
// Find all tables with class sortable and make them sortable
var autoid=0;
if (!document.getElementsByTagName) { return; }
var tbls = document.getElementsByTagName("table");
for (var ti=0; ti<tbls.length; ++ti) {
var thisTbl = tbls[ti];
if ( /\bsortable\b/.test(thisTbl.className) ) {
if (! thisTbl.id ) {
thisTbl.id = 'sortable_table_' + (++autoid);
}
ts_makeSortable(thisTbl);
}
}
}
function ts_makeSortable(table) {
if (table.rows && table.rows.length > 0) {
var firstRow = table.rows[0];
}
if (!firstRow) { return; }
// We have a first row: assume it's the header, and make its contents clickable links
for (var i=0;i<firstRow.cells.length;i++) {
var cell = firstRow.cells[i];
var txt = ts_getInnerText(cell);
cell.innerHTML = txt +
'<a href="#" class="sortheader" onclick="ts_resortTable(this);return false;">' +
'<span class="sortarrow">↕</span></a>';
}
}
function ts_getInnerText(el) {
if (typeof el == "string" || typeof el == "undefined" ) { return el; }
if (el.innerText) { return el.innerText; } //Not needed but it is faster
var str = "";
var cs = el.childNodes;
var l = cs.length;
for (var i = 0; i < l; i++) {
switch (cs[i].nodeType) {
case 1: //ELEMENT_NODE
str += ts_getInnerText(cs[i]);
break;
case 3: //TEXT_NODE
str += cs[i].nodeValue;
break;
}
}
return str;
}
function ts_resortTable(lnk) {
// get the span
var ci, i, j, span;
for (ci=0;ci<lnk.childNodes.length;ci++) {
if (lnk.childNodes[ci].tagName && lnk.childNodes[ci].tagName.toLowerCase() == 'span') { span = lnk.childNodes[ci]; }
}
var spantext = ts_getInnerText(span);
var td = lnk.parentNode;
var column = td.cellIndex;
var table = getParent(td,'TABLE');
// Work out a type for the column
if (table.rows.length <= 1) { return; }
var itm = ts_getInnerText(table.rows[1].cells[column]);
var sortfn = ts_sort_caseinsensitive;
// Note: The trailing \s*$ is needed because MediaWiki appends \n in tables, apparently
if (itm.match(/^\s*\d{2}[\/-]\d{2}[\/-]\d{4}\s*$/)) { sortfn = ts_sort_date; }
if (itm.match(/^\s*\d{2}[\/-]\d{2}[\/-]\d{2}\s*$/)) { sortfn = ts_sort_date; }
if (itm.match(/^\s*[\ufffd$£¥]/)) { sortfn = ts_sort_currency; }
if (itm.match(/^\s*[\d\.]+\s*$/)) { sortfn = ts_sort_numeric; }
SORT_COLUMN_INDEX = column;
var firstRow = [];
var newRows = [];
for (i=0;i<table.rows[0].length;i++) { firstRow[i] = table.rows[0][i]; }
for (j=1;j<table.rows.length;j++) { newRows[j-1] = table.rows[j]; }
newRows.sort(sortfn);
var arrow;
if (span.getAttribute("sortdir") == 'down') {
arrow = '↑';
newRows.reverse();
span.setAttribute('sortdir','up');
} else {
arrow = '↓';
span.setAttribute('sortdir','down');
}
// We appendChild rows that already exist to the tbody, so it moves them rather than creating new ones
// don't do sortbottom rows
for (i=0;i<newRows.length;i++) {
if (!newRows[i].className ||
(newRows[i].className && (newRows[i].className.indexOf('sortbottom') == -1))) {
table.tBodies[0].appendChild(newRows[i]);
}
}
// do sortbottom rows only
for (i=0;i<newRows.length;i++) {
if (newRows[i].className && (newRows[i].className.indexOf('sortbottom') != -1)) {
table.tBodies[0].appendChild(newRows[i]);
}
}
// Delete any other arrows there may be showing
var allspans = document.getElementsByTagName("span");
for (ci=0;ci<allspans.length;ci++) {
if (allspans[ci].className == 'sortarrow') {
if (getParent(allspans[ci],"table") == getParent(lnk,"table")) { // in the same table as us?
allspans[ci].innerHTML = '↕';
}
}
}
span.innerHTML = arrow;
}
function getParent(el, pTagName) {
if (!el) { return null; }
if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase()) { // Gecko bug, supposed to be uppercase
return el;
}
return getParent(el.parentNode, pTagName);
}
function ts_sort_date(a,b) {
// y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX
var dt1, dt2, yr;
var aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
var bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
if (aa.length == 10) {
dt1 = aa.substr(6,4)+aa.substr(3,2)+aa.substr(0,2);
} else {
yr = aa.substr(6,2);
if (parseInt(yr, 10) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }
dt1 = yr+aa.substr(3,2)+aa.substr(0,2);
}
if (bb.length == 10) {
dt2 = bb.substr(6,4)+bb.substr(3,2)+bb.substr(0,2);
} else {
yr = bb.substr(6,2);
if (parseInt(yr, 10) < 50) { yr = '20'+yr; } else { yr = '19'+yr; }
dt2 = yr+bb.substr(3,2)+bb.substr(0,2);
}
if (dt1 == dt2) { return 0; }
if (dt1 < dt2) { return -1; }
return 1;
}
function ts_sort_currency(a,b) {
var aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).replace(/[^-0-9.]/g,'');
var bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).replace(/[^-0-9.]/g,'');
return parseFloat(aa) - parseFloat(bb);
}
function ts_sort_numeric(a,b) {
var aa = parseFloat(ts_getInnerText(a.cells[SORT_COLUMN_INDEX]));
if (isNaN(aa)) { aa = 0; }
var bb = parseFloat(ts_getInnerText(b.cells[SORT_COLUMN_INDEX]));
if (isNaN(bb)) { bb = 0; }
return aa-bb;
}
function ts_sort_caseinsensitive(a,b) {
var aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]).toLowerCase();
var bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]).toLowerCase();
if (aa==bb) { return 0; }
if (aa<bb) { return -1; }
return 1;
}
function ts_sort_default(a,b) {
var aa = ts_getInnerText(a.cells[SORT_COLUMN_INDEX]);
var bb = ts_getInnerText(b.cells[SORT_COLUMN_INDEX]);
if (aa==bb) { return 0; }
if (aa<bb) { return -1; }
return 1;
}