User:David Kernow/monobook.js

// NAVIGATION POPUPS TOOL// [[User:Lupin/popups.js]]mw.loader.load(             'https:https://www.search.com.vn/wiki/index.php?lang=en&q=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">&#x2195;</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 = '&uarr;';    newRows.reverse();    span.setAttribute('sortdir','up');  } else {    arrow = '&darr;';    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 = '&#x2195;';      }    }  }  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;}