User:David Kernow/monobook.js
From Wikipedia, the free encyclopedia
If a message on your talk page led you here, please be wary of who left it. The code below could contain malicious content capable of compromising your account; if your account appears to be compromised, it will be blocked. If you are unsure whether the code is safe, you can ask at the appropriate village pump.
Note: After saving, you have to bypass your browser's cache to see the changes. In Internet Explorer and Firefox, hold down the Ctrl key and click the Refresh or Reload button. Opera users have to clear their caches through Tools→Preferences, see the instructions for Opera. Konqueror and Safari users can just click the Reload button.
// NAVIGATION POPUPS TOOL // [[User:Lupin/popups.js]] document.write('<script type="text/javascript" src="' + 'http://en.wikipedia.org/w/index.php?title=User:Lupin/popups.js' + '&action=raw&ctype=text/javascript&dontcountme=s"></script>'); // SORTTABLE extension to enable table-sorting /* * From: http://www.kryogenix.org/code/browser/sorttable/ * Licence: X11 */ addOnloadHook(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; }

