Difference between revisions of "MediaWiki:Common.js"
Jump to navigation
Jump to search
Line 17: | Line 17: | ||
addOnloadHook(rewriteTitle, false); | addOnloadHook(rewriteTitle, false); | ||
+ | |||
+ | /*<source lang="javascript">*/ | ||
+ | //Overrides the function with the same name in http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/skins/common/wikibits.js | ||
+ | //Removes spaces. See [[Help:Sorting]]. | ||
+ | function ts_parseFloat(num) { | ||
+ | if (!num) return 0; | ||
+ | num = removeSpaces(num); | ||
+ | num = parseFloat(num.replace(/,/g, "")); | ||
+ | return (isNaN(num) ? 0 : num); | ||
+ | } | ||
+ | |||
+ | //Keep spaces in "currency" mode, to sort a range "70 to 80" at 70, not 7080 | ||
+ | function ts_parseFloat_ks(num) { | ||
+ | if (!num) return 0; | ||
+ | num = parseFloat(num.replace(/,/g, "")); | ||
+ | return (isNaN(num) ? 0 : num); | ||
+ | } | ||
+ | |||
+ | //Auxiliary function for function ts_resortTable(lnk) | ||
+ | function removeSpaces(string) { | ||
+ | var tstring = ""; | ||
+ | string = '' + string; | ||
+ | splitstring = string.split(" "); | ||
+ | for(i = 0; i < splitstring.length; i++) | ||
+ | tstring += splitstring[i]; | ||
+ | return tstring; | ||
+ | } | ||
+ | |||
+ | //Overrides the function with the same name in http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/skins/common/wikibits.js | ||
+ | //Changes the criteria for various sorting modes, see [[Help:Sorting]]. | ||
+ | //For easy maintenance the difference with wikibits.js is kept limited to a few lines. | ||
+ | function ts_resortTable(lnk) { | ||
+ | // get the span | ||
+ | var span = lnk.getElementsByTagName('span')[0]; | ||
+ | |||
+ | var td = lnk.parentNode; | ||
+ | var tr = td.parentNode; | ||
+ | var column = td.cellIndex; | ||
+ | |||
+ | var table = tr.parentNode; | ||
+ | while (table && !(table.tagName && table.tagName.toLowerCase() == 'table')) | ||
+ | table = table.parentNode; | ||
+ | if (!table) return; | ||
+ | |||
+ | // Work out a type for the column | ||
+ | if (table.rows.length <= 1) return; | ||
+ | |||
+ | // Skip the first row if that's where the headings are | ||
+ | var rowStart = (table.tHead && table.tHead.rows.length > 0 ? 0 : 1); | ||
+ | |||
+ | var itm = ""; | ||
+ | for (var i = rowStart; i < table.rows.length; i++) { | ||
+ | if (table.rows[i].cells.length > column) { | ||
+ | itm = ts_getInnerText(table.rows[i].cells[column]); | ||
+ | itm = itm.replace(/^[\s\xa0]+/, "").replace(/[\s\xa0]+$/, ""); | ||
+ | if (itm != "") break; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | sortfn = ts_sort_caseinsensitive; | ||
+ | itmns = removeSpaces(itm); | ||
+ | if (itmns.match(/^[\d\.\,\-\+]+\%?$/)) sortfn = ts_sort_numeric; | ||
+ | if (itmns.match(/^[\d\.\,\-\+]+[eE][\d\-\+]+\%?$/)) sortfn = ts_sort_numeric; | ||
+ | if (itmns.match(/^[\d\.\,\-\+]+e[\d\-\+]+\u00d710[\d\-\+]+\%?$/)) sortfn = ts_sort_numeric; | ||
+ | if (itm.match(/^\d\d[\/. -][a-zA-Z]{3}[\/. -]\d\d\d\d$/)) | ||
+ | sortfn = ts_sort_date; | ||
+ | if (itm.match(/^\d\d[\/.-]\d\d[\/.-]\d\d\d\d$/)) | ||
+ | sortfn = ts_sort_date; | ||
+ | if (itm.match(/^\d\d[\/.-]\d\d[\/.-]\d\d$/)) | ||
+ | sortfn = ts_sort_date; | ||
+ | if (itm.match(/^[\u00a3$\u20ac\u00a5]/)) // pound dollar euro yen | ||
+ | sortfn = ts_sort_currency; | ||
+ | if (itm.match(/sm=c$/)) sortfn = ts_sort_currency; | ||
+ | if (itm.match(/sm=d$/)) sortfn = ts_sort_date; | ||
+ | if (itm.match(/sm=n$/)) sortfn = ts_sort_numeric; | ||
+ | |||
+ | var reverse = (span.getAttribute("sortdir") == 'down'); | ||
+ | |||
+ | var newRows = new Array(); | ||
+ | for (var j = rowStart; j < table.rows.length; j++) { | ||
+ | var row = table.rows[j]; | ||
+ | var keyText = ts_getInnerText(row.cells[column]); | ||
+ | var oldIndex = (reverse ? -j : j); | ||
+ | |||
+ | newRows[newRows.length] = new Array(row, keyText, oldIndex); | ||
+ | } | ||
+ | |||
+ | newRows.sort(sortfn); | ||
+ | |||
+ | var arrowHTML; | ||
+ | if (reverse) { | ||
+ | arrowHTML = '<img src="'+ ts_image_path + ts_image_down + '" alt="↓"/>'; | ||
+ | newRows.reverse(); | ||
+ | span.setAttribute('sortdir','up'); | ||
+ | } else { | ||
+ | arrowHTML = '<img src="'+ ts_image_path + ts_image_up + '" alt="↑"/>'; | ||
+ | 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 (var i = 0; i < newRows.length; i++) { | ||
+ | if ((" "+newRows[i][0].className+" ").indexOf(" sortbottom ") == -1) | ||
+ | table.tBodies[0].appendChild(newRows[i][0]); | ||
+ | } | ||
+ | // do sortbottom rows only | ||
+ | for (var i = 0; i < newRows.length; i++) { | ||
+ | if ((" "+newRows[i][0].className+" ").indexOf(" sortbottom ") != -1) | ||
+ | table.tBodies[0].appendChild(newRows[i][0]); | ||
+ | } | ||
+ | |||
+ | // Delete any other arrows there may be showing | ||
+ | var spans = getElementsByClassName(tr, "span", "sortarrow"); | ||
+ | for (var i = 0; i < spans.length; i++) { | ||
+ | spans[i].innerHTML = '<img src="'+ ts_image_path + ts_image_none + '" alt="↓"/>'; | ||
+ | } | ||
+ | span.innerHTML = arrowHTML; | ||
+ | |||
+ | ts_alternate(table); | ||
+ | } | ||
+ | |||
+ | function ts_dateToSortKey(date) { | ||
+ | // y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX | ||
+ | if (date.length > 10) { | ||
+ | switch (date.substr(3,3).toLowerCase()) { | ||
+ | case "jan": var month = "01"; break; | ||
+ | case "feb": var month = "02"; break; | ||
+ | case "mar": var month = "03"; break; | ||
+ | case "apr": var month = "04"; break; | ||
+ | case "may": var month = "05"; break; | ||
+ | case "jun": var month = "06"; break; | ||
+ | case "jul": var month = "07"; break; | ||
+ | case "aug": var month = "08"; break; | ||
+ | case "sep": var month = "09"; break; | ||
+ | case "oct": var month = "10"; break; | ||
+ | case "nov": var month = "11"; break; | ||
+ | case "dec": var month = "12"; break; | ||
+ | // default: var month = "00"; | ||
+ | } | ||
+ | return date.substr(7,4)+month+date.substr(0,2); | ||
+ | } else if (date.length == 10) { | ||
+ | return date.substr(6,4)+date.substr(3,2)+date.substr(0,2); | ||
+ | } else if (date.length == 8) { | ||
+ | yr = date.substr(6,2); | ||
+ | if (parseInt(yr) < 50) { | ||
+ | yr = '20'+yr; | ||
+ | } else { | ||
+ | yr = '19'+yr; | ||
+ | } | ||
+ | return yr+date.substr(3,2)+date.substr(0,2); | ||
+ | } | ||
+ | return "00000000"; | ||
+ | } | ||
+ | |||
+ | function ts_sort_currency(a,b) { | ||
+ | var aa = ts_parseFloat_ks(a[1].replace(/[\u00a3$\u20ac\u00a5a-zA-Z]/g,'')); | ||
+ | var bb = ts_parseFloat_ks(b[1].replace(/[\u00a3$\u20ac\u00a5a-zA-Z]/g,'')); | ||
+ | return (aa != bb ? aa - bb : a[2] - b[2]); |
Latest revision as of 19:24, 13 August 2008
/* Any JavaScript here will be loaded for all users on every page load. */ function rewriteTitle() { if(typeof(SKIP_TITLE_REWRITE) != 'undefined' && SKIP_TITLE_REWRITE) return; var titleDiv = document.getElementById('title-meta'); if(titleDiv == null || titleDiv == undefined) return; var cloneNode = titleDiv.cloneNode(true); var firstHeading = document.getElementById('content').getElementsByTagName('h1')[0]; var node = firstHeading.childNodes[0]; firstHeading.replaceChild(cloneNode, node); cloneNode.style.display = "inline"; var titleAlign = document.getElementById('title-align'); firstHeading.style.textAlign = titleAlign.childNodes[0].nodeValue; } addOnloadHook(rewriteTitle, false); /*<source lang="javascript">*/ //Overrides the function with the same name in http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/skins/common/wikibits.js //Removes spaces. See [[Help:Sorting]]. function ts_parseFloat(num) { if (!num) return 0; num = removeSpaces(num); num = parseFloat(num.replace(/,/g, "")); return (isNaN(num) ? 0 : num); } //Keep spaces in "currency" mode, to sort a range "70 to 80" at 70, not 7080 function ts_parseFloat_ks(num) { if (!num) return 0; num = parseFloat(num.replace(/,/g, "")); return (isNaN(num) ? 0 : num); } //Auxiliary function for function ts_resortTable(lnk) function removeSpaces(string) { var tstring = ""; string = '' + string; splitstring = string.split(" "); for(i = 0; i < splitstring.length; i++) tstring += splitstring[i]; return tstring; } //Overrides the function with the same name in http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/skins/common/wikibits.js //Changes the criteria for various sorting modes, see [[Help:Sorting]]. //For easy maintenance the difference with wikibits.js is kept limited to a few lines. function ts_resortTable(lnk) { // get the span var span = lnk.getElementsByTagName('span')[0]; var td = lnk.parentNode; var tr = td.parentNode; var column = td.cellIndex; var table = tr.parentNode; while (table && !(table.tagName && table.tagName.toLowerCase() == 'table')) table = table.parentNode; if (!table) return; // Work out a type for the column if (table.rows.length <= 1) return; // Skip the first row if that's where the headings are var rowStart = (table.tHead && table.tHead.rows.length > 0 ? 0 : 1); var itm = ""; for (var i = rowStart; i < table.rows.length; i++) { if (table.rows[i].cells.length > column) { itm = ts_getInnerText(table.rows[i].cells[column]); itm = itm.replace(/^[\s\xa0]+/, "").replace(/[\s\xa0]+$/, ""); if (itm != "") break; } } sortfn = ts_sort_caseinsensitive; itmns = removeSpaces(itm); if (itmns.match(/^[\d\.\,\-\+]+\%?$/)) sortfn = ts_sort_numeric; if (itmns.match(/^[\d\.\,\-\+]+[eE][\d\-\+]+\%?$/)) sortfn = ts_sort_numeric; if (itmns.match(/^[\d\.\,\-\+]+e[\d\-\+]+\u00d710[\d\-\+]+\%?$/)) sortfn = ts_sort_numeric; if (itm.match(/^\d\d[\/. -][a-zA-Z]{3}[\/. -]\d\d\d\d$/)) sortfn = ts_sort_date; if (itm.match(/^\d\d[\/.-]\d\d[\/.-]\d\d\d\d$/)) sortfn = ts_sort_date; if (itm.match(/^\d\d[\/.-]\d\d[\/.-]\d\d$/)) sortfn = ts_sort_date; if (itm.match(/^[\u00a3$\u20ac\u00a5]/)) // pound dollar euro yen sortfn = ts_sort_currency; if (itm.match(/sm=c$/)) sortfn = ts_sort_currency; if (itm.match(/sm=d$/)) sortfn = ts_sort_date; if (itm.match(/sm=n$/)) sortfn = ts_sort_numeric; var reverse = (span.getAttribute("sortdir") == 'down'); var newRows = new Array(); for (var j = rowStart; j < table.rows.length; j++) { var row = table.rows[j]; var keyText = ts_getInnerText(row.cells[column]); var oldIndex = (reverse ? -j : j); newRows[newRows.length] = new Array(row, keyText, oldIndex); } newRows.sort(sortfn); var arrowHTML; if (reverse) { arrowHTML = '<img src="'+ ts_image_path + ts_image_down + '" alt="↓"/>'; newRows.reverse(); span.setAttribute('sortdir','up'); } else { arrowHTML = '<img src="'+ ts_image_path + ts_image_up + '" alt="↑"/>'; 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 (var i = 0; i < newRows.length; i++) { if ((" "+newRows[i][0].className+" ").indexOf(" sortbottom ") == -1) table.tBodies[0].appendChild(newRows[i][0]); } // do sortbottom rows only for (var i = 0; i < newRows.length; i++) { if ((" "+newRows[i][0].className+" ").indexOf(" sortbottom ") != -1) table.tBodies[0].appendChild(newRows[i][0]); } // Delete any other arrows there may be showing var spans = getElementsByClassName(tr, "span", "sortarrow"); for (var i = 0; i < spans.length; i++) { spans[i].innerHTML = '<img src="'+ ts_image_path + ts_image_none + '" alt="↓"/>'; } span.innerHTML = arrowHTML; ts_alternate(table); } function ts_dateToSortKey(date) { // y2k notes: two digit years less than 50 are treated as 20XX, greater than 50 are treated as 19XX if (date.length > 10) { switch (date.substr(3,3).toLowerCase()) { case "jan": var month = "01"; break; case "feb": var month = "02"; break; case "mar": var month = "03"; break; case "apr": var month = "04"; break; case "may": var month = "05"; break; case "jun": var month = "06"; break; case "jul": var month = "07"; break; case "aug": var month = "08"; break; case "sep": var month = "09"; break; case "oct": var month = "10"; break; case "nov": var month = "11"; break; case "dec": var month = "12"; break; // default: var month = "00"; } return date.substr(7,4)+month+date.substr(0,2); } else if (date.length == 10) { return date.substr(6,4)+date.substr(3,2)+date.substr(0,2); } else if (date.length == 8) { yr = date.substr(6,2); if (parseInt(yr) < 50) { yr = '20'+yr; } else { yr = '19'+yr; } return yr+date.substr(3,2)+date.substr(0,2); } return "00000000"; } function ts_sort_currency(a,b) { var aa = ts_parseFloat_ks(a[1].replace(/[\u00a3$\u20ac\u00a5a-zA-Z]/g,'')); var bb = ts_parseFloat_ks(b[1].replace(/[\u00a3$\u20ac\u00a5a-zA-Z]/g,'')); return (aa != bb ? aa - bb : a[2] - b[2]);