|
This page you are viewing is part of the SEVA Wiki Archive, Please visit the new Official Website! |
|
Difference between revisions of "MediaWiki:Common.js"
Jump to navigation
Jump to search
(forcePreview) |
(full update from http://meta.wikimedia.org/wiki/MediaWiki:Common.js Plus forcePreview function with exception for sysop group) |
||
| Line 1: | Line 1: | ||
/* Any JavaScript here will be loaded for all users on every page load. */ | /* Any JavaScript here will be loaded for all users on every page load. */ | ||
| − | / | + | |
| + | /*<source lang="javascript">*/ | ||
/* per http://www.mediawiki.org/wiki/Manual:Force_preview */ | /* per http://www.mediawiki.org/wiki/Manual:Force_preview */ | ||
function forcePreview() { | function forcePreview() { | ||
| − | if (wgUserGroups == " | + | if (wgUserGroups == "sysop" || wgAction != "edit") return; |
saveButton = document.getElementById("wpSave"); | saveButton = document.getElementById("wpSave"); | ||
if (!saveButton) return; | if (!saveButton) return; | ||
| Line 14: | Line 15: | ||
addOnloadHook(forcePreview); | addOnloadHook(forcePreview); | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | //Overrides the function with the same name in http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/skins/common/wikibits.js | |
| − | + | //Fixes a bug: for the sorting order, takes the whole number, not the number before the second comma. | |
| − | + | //Also, 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]); | |
| − | + | } | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
/** Collapsible tables ********************************************************* | /** Collapsible tables ********************************************************* | ||
| Line 138: | Line 179: | ||
* Description: Allows tables to be collapsed, showing only the header. See | * Description: Allows tables to be collapsed, showing only the header. See | ||
* [[Wikipedia:NavFrame]]. | * [[Wikipedia:NavFrame]]. | ||
| − | * | + | * Maintainer on Wikipedia: [[User:R. Koot]] |
*/ | */ | ||
| Line 145: | Line 186: | ||
var expandCaption = "show"; | var expandCaption = "show"; | ||
| + | function hasClass( element, className ) { | ||
| + | var Classes = element.className.split( " " ); | ||
| + | for ( var i = 0; i < Classes.length; i++ ) { | ||
| + | if ( Classes[i] == className ) { | ||
| + | return ( true ); | ||
| + | } | ||
| + | } | ||
| + | return ( false ); | ||
| + | } | ||
| + | |||
function collapseTable( tableIndex ) | function collapseTable( tableIndex ) | ||
{ | { | ||
| Line 216: | Line 267: | ||
addOnloadHook( createCollapseButtons ); | addOnloadHook( createCollapseButtons ); | ||
| − | + | //Shuffle for election candidates | |
| − | + | function dshuf(){ | |
| − | + | var shufsets=new Object() | |
| − | + | var rx=new RegExp('dshuf'+'\\s+(dshufset\\d+)', 'i') | |
| − | + | var divs=document.getElementsByTagName("div") | |
| − | + | for (var i=0; i<divs.length; i++){ | |
| − | + | if (rx.test(divs[i].className)){ | |
| − | + | if (typeof shufsets[RegExp.$1]=="undefined"){ | |
| − | + | shufsets[RegExp.$1]=new Object() | |
| − | + | shufsets[RegExp.$1].inner=[] | |
| − | + | shufsets[RegExp.$1].member=[] | |
| − | + | } | |
| − | + | shufsets[RegExp.$1].inner.push(divs[i].innerHTML) | |
| − | + | shufsets[RegExp.$1].member.push(divs[i]) | |
| − | + | } | |
| − | + | } | |
| − | + | for (shufset in shufsets){ | |
| − | + | shufsets[shufset].inner.sort(function() {return 0.5 - Math.random()}) | |
| − | + | for (var i=0; i<shufsets[shufset].member.length; i++){ | |
| − | + | shufsets[shufset].member[i].innerHTML=shufsets[shufset].inner[i] | |
| − | + | shufsets[shufset].member[i].style.display="block" | |
| − | + | } | |
| − | + | } | |
| − | + | ||
| − | + | } | |
| − | + | ||
| − | + | addOnloadHook(dshuf); | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | /************* | |
| − | + | *** AJAX transclusion table <http://meta.wikimedia.org/wiki/User:Pathoschild/Scripts/AJAX_transclusion_table> | |
| − | + | *** by [[m:user:Pathoschild]] | |
| − | + | *************/ | |
| − | + | function attLoader() { | |
| − | + | if(getElementsByClassName(document.getElementsByTagName('body')[0],'table','attable').length) { | |
| − | + | document.write('<script type="text/javascript" src="' | |
| − | + | + 'http://meta.wikimedia.org/w/index.php?title=User:Pathoschild/Scripts/AJAX_transclusion_table.js' | |
| − | + | + '&action=raw&ctype=text/javascript&dontcountme=s"></script>'); | |
| − | + | } | |
| − | + | } | |
| − | + | addOnloadHook(attLoader); | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | /** JSconfig ************ | |
| − | + | * Global configuration options to enable/disable and configure | |
| − | + | * specific script features from [[MediaWiki:Common.js]] and | |
| − | + | * [[MediaWiki:Monobook.js]] | |
| − | + | * This framework adds config options (saved as cookies) to [[Special:Preferences]] | |
| + | * For a more permanent change you can override the default settings in your | ||
| + | * [[Special:Mypage/monobook.js]] | ||
| + | * for Example: JSconfig.keys[loadAutoInformationTemplate] = false; | ||
| + | * | ||
| + | * Maintainer: [[User:Dschwen]] | ||
| + | */ | ||
| − | + | var JSconfig = | |
| − | + | { | |
| − | + | prefix : 'jsconfig_', | |
| + | keys : {}, | ||
| + | meta : {}, | ||
| − | + | // | |
| − | + | // Register a new configuration item | |
| − | + | // * name : String, internal name | |
| − | + | // * default_value : String or Boolean (type determines configuration widget) | |
| − | + | // * description : String, text appearing next to the widget in the preferences | |
| − | + | // * prefpage : Integer (optional), section in the preferences to insert the widget: | |
| − | + | // 0 : User profile | |
| + | // 1 : Skin | ||
| + | // 2 : Math | ||
| + | // 3 : Files | ||
| + | // 4 : Date and time | ||
| + | // 5 : Editing | ||
| + | // 6 : Recent changes | ||
| + | // 7 : Watchlist | ||
| + | // 8 : Search | ||
| + | // 9 : Misc | ||
| + | // | ||
| + | // Access keys through JSconfig.keys[name] | ||
| + | // | ||
| + | registerKey : function( name, default_value, description, prefpage ) | ||
| + | { | ||
| + | if( typeof(JSconfig.keys[name]) == 'undefined' ) | ||
| + | JSconfig.keys[name] = default_value; | ||
| + | else { | ||
| − | + | // all cookies are read as strings, | |
| − | + | // convert to the type of the default value | |
| − | + | switch( typeof(default_value) ) | |
| − | + | { | |
| − | + | case 'boolean' : JSconfig.keys[name] = ( JSconfig.keys[name] == 'true' ); break; | |
| − | + | case 'number' : JSconfig.keys[name] = JSconfig.keys[name]/1; break; | |
| + | } | ||
| − | + | } | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | JSconfig.meta[name] = { 'description' : description, 'page' : prefpage || 0, 'default_value' : default_value }; | |
| − | + | }, | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | readCookies : function() | |
| − | + | { | |
| − | + | var cookies = document.cookie.split("; "); | |
| − | + | var p =JSconfig.prefix.length; | |
| − | + | var i; | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | for( var key in cookies ) | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
{ | { | ||
| − | + | if( cookies[key].substring(0,p) == JSconfig.prefix ) | |
| − | + | { | |
| − | + | i = cookies[key].indexOf('='); | |
| − | + | //alert( cookies[key] + ',' + key + ',' + cookies[key].substring(p,i) ); | |
| − | + | JSconfig.keys[cookies[key].substring(p,i)] = cookies[key].substring(i+1); | |
| − | + | } | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
} | } | ||
| − | + | }, | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | function | + | writeCookies : function() |
| − | + | { | |
| − | + | for( var key in JSconfig.keys ) | |
| + | document.cookie = JSconfig.prefix + key + '=' + JSconfig.keys[key] + '; path=/; expires=Thu, 2 Aug 2009 10:10:10 UTC'; | ||
| + | }, | ||
| − | + | evaluateForm : function() | |
| − | + | { | |
| + | var w_ctrl,wt; | ||
| + | //alert('about to save JSconfig'); | ||
| + | for( var key in JSconfig.meta ) { | ||
| + | w_ctrl = document.getElementById( JSconfig.prefix + key ) | ||
| + | if( w_ctrl ) | ||
| + | { | ||
| + | wt = typeof( JSconfig.meta[key].default_value ); | ||
| + | switch( wt ) { | ||
| + | case 'boolean' : JSconfig.keys[key] = w_ctrl.checked; break; | ||
| + | case 'string' : JSconfig.keys[key] = w_ctrl.value; break; | ||
} | } | ||
| + | } | ||
| + | } | ||
| − | + | JSconfig.writeCookies(); | |
| − | + | return true; | |
| − | + | }, | |
| − | + | setUpForm : function() | |
| − | + | { | |
| − | + | var prefChild = document.getElementById('preferences'); | |
| − | + | if( !prefChild ) return; | |
| + | prefChild = prefChild.childNodes; | ||
| − | + | // | |
| − | + | // make a list of all preferences sections | |
| − | + | // | |
| − | + | var tabs = new Array; | |
| − | + | var len = prefChild.length; | |
| − | + | for( var key = 0; key < len; key++ ) { | |
| + | if( prefChild[key].tagName && | ||
| + | prefChild[key].tagName.toLowerCase() == 'fieldset' ) | ||
| + | tabs.push(prefChild[key]); | ||
| + | } | ||
| − | + | // | |
| − | + | // Create Widgets for all registered config keys | |
| − | + | // | |
| − | + | var w_div, w_label, w_ctrl, wt; | |
| − | + | for( var key in JSconfig.meta ) { | |
| − | + | w_div = document.createElement( 'DIV' ); | |
| − | |||
| − | + | w_label = document.createElement( 'LABEL' ); | |
| − | + | w_label.appendChild( document.createTextNode( JSconfig.meta[key].description ) ) | |
| − | + | w_label.htmlFor = JSconfig.prefix + key; | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | wt = typeof( JSconfig.meta[key].default_value ); | |
| − | |||
| − | + | w_ctrl = document.createElement( 'INPUT' ); | |
| − | + | w_ctrl.id = JSconfig.prefix + key; | |
| − | + | // before insertion into the DOM tree | |
| − | + | switch( wt ) { | |
| − | + | case 'boolean' : w_ctrl.type = 'checkbox'; break; | |
| − | + | case 'string' : w_ctrl.type = 'text'; break; | |
| − | + | } | |
| − | + | w_div.appendChild( w_label ); | |
| − | + | w_div.appendChild( w_ctrl ); | |
| − | + | tabs[JSconfig.meta[key].page].appendChild( w_div ); | |
| − | + | // after insertion into the DOM tree | |
| − | + | switch( wt ) { | |
| − | + | case 'boolean' : w_ctrl.defaultChecked = w_ctrl.checked = JSconfig.keys[key]; break; | |
| − | + | case 'string' : w_ctrl.defaultValue = w_ctrl.value = JSconfig.keys[key]; break; | |
| − | |||
| − | |||
| − | |||
} | } | ||
| + | |||
| + | } | ||
| + | addHandler(document.getElementById('preferences').parentNode, 'submit', JSconfig.evaluateForm ); | ||
} | } | ||
| + | } | ||
| − | + | JSconfig.readCookies(); | |
| + | addOnloadHook(JSconfig.setUpForm); | ||
| − | + | // ability to pull [[MediaWiki:Gadget-rtl.css]] on individual page loads by [[testwiki:User:Splarka]] and [[wm2008:User:Mr.Z-man]] | |
| − | + | function importStylesheet(page) { | |
| − | + | if (page.indexOf('http://') == -1 && page.indexOf('https://') == -1 && page.indexOf('file:///') == -1) | |
| − | + | page = wgScript + '?action=raw&ctype=text/css&smaxage=0&title=' | |
| − | + | + encodeURIComponent(page.replace(/ /g,'_')) | |
| + | return document.createStyleSheet ? document.createStyleSheet(page) : appendCSS('@import "' + page + '";') | ||
| + | } | ||
| + | |||
| + | function appendCSS(text){ | ||
| + | var s = document.createElement('style') | ||
| + | s.setAttribute('type', 'text/css') | ||
| + | if (s.styleSheet) s.styleSheet.cssText = text //IE | ||
| + | else s.appendChild(document.createTextNode(text)) | ||
| + | document.getElementsByTagName('head')[0].appendChild(s) | ||
| + | return s | ||
| + | } | ||
| − | + | if(document.URL.indexOf('rtl=1') != -1) importStylesheet('http://meta.wikimedia.org/w/index.php?title=MediaWiki:Gadget-rtl.css&action=raw&ctype=text/css'); | |
| − | |||
| − | |||
| − | + | //import module | |
| − | + | importedScripts = {} | |
| − | + | function importScript(page, lang) { | |
| − | + | page = '?title=' + encodeURIComponent(page.replace(' ','_')) | |
| − | + | if (lang) page = 'http://' + lang + '.wikipedia.org/w/index.php' + page | |
| − | + | else page = wgScript + page | |
| − | + | if (importedScripts[page]) return | |
| − | + | importedScripts[page] = true | |
| − | + | var s = document.createElement('script') | |
| − | + | s.type = 'text/javascript' | |
| − | + | s.src = page + '&action=raw&ctype=text/javascript' | |
| − | + | document.getElementsByTagName('head')[0].appendChild(s) | |
| − | + | } | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
Revision as of 02:26, 31 May 2008
/* Any JavaScript here will be loaded for all users on every page load. */
/*<source lang="javascript">*/
/* per http://www.mediawiki.org/wiki/Manual:Force_preview */
function forcePreview() {
if (wgUserGroups == "sysop" || wgAction != "edit") return;
saveButton = document.getElementById("wpSave");
if (!saveButton) return;
saveButton.disabled = true;
saveButton.value = "Save page (use preview first)";
saveButton.style.fontWeight = "normal";
document.getElementById("wpPreview").style.fontWeight = "bold";
}
addOnloadHook(forcePreview);
//Overrides the function with the same name in http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/skins/common/wikibits.js
//Fixes a bug: for the sorting order, takes the whole number, not the number before the second comma.
//Also, 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]);
}
/** Collapsible tables *********************************************************
*
* Description: Allows tables to be collapsed, showing only the header. See
* [[Wikipedia:NavFrame]].
* Maintainer on Wikipedia: [[User:R. Koot]]
*/
var autoCollapse = 2;
var collapseCaption = "hide";
var expandCaption = "show";
function hasClass( element, className ) {
var Classes = element.className.split( " " );
for ( var i = 0; i < Classes.length; i++ ) {
if ( Classes[i] == className ) {
return ( true );
}
}
return ( false );
}
function collapseTable( tableIndex )
{
var Button = document.getElementById( "collapseButton" + tableIndex );
var Table = document.getElementById( "collapsibleTable" + tableIndex );
if ( !Table || !Button ) {
return false;
}
var Rows = Table.getElementsByTagName( "tr" );
if ( Button.firstChild.data == collapseCaption ) {
for ( var i = 1; i < Rows.length; i++ ) {
Rows[i].style.display = "none";
}
Button.firstChild.data = expandCaption;
} else {
for ( var i = 1; i < Rows.length; i++ ) {
Rows[i].style.display = Rows[0].style.display;
}
Button.firstChild.data = collapseCaption;
}
}
function createCollapseButtons()
{
var tableIndex = 0;
var NavigationBoxes = new Object();
var Tables = document.getElementsByTagName( "table" );
for ( var i = 0; i < Tables.length; i++ ) {
if ( hasClass( Tables[i], "collapsible" ) ) {
NavigationBoxes[ tableIndex ] = Tables[i];
Tables[i].setAttribute( "id", "collapsibleTable" + tableIndex );
var Button = document.createElement( "span" );
var ButtonLink = document.createElement( "a" );
var ButtonText = document.createTextNode( collapseCaption );
Button.style.styleFloat = "right";
Button.style.cssFloat = "right";
Button.style.fontWeight = "normal";
Button.style.textAlign = "right";
Button.style.width = "6em";
ButtonLink.setAttribute( "id", "collapseButton" + tableIndex );
ButtonLink.setAttribute( "href", "javascript:collapseTable(" + tableIndex + ");" );
ButtonLink.appendChild( ButtonText );
Button.appendChild( document.createTextNode( "[" ) );
Button.appendChild( ButtonLink );
Button.appendChild( document.createTextNode( "]" ) );
var Header = Tables[i].getElementsByTagName( "tr" )[0].getElementsByTagName( "th" )[0];
/* only add button and increment count if there is a header row to work with */
if (Header) {
Header.insertBefore( Button, Header.childNodes[0] );
tableIndex++;
}
}
}
for ( var i = 0; i < tableIndex; i++ ) {
if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) {
collapseTable( i );
}
}
}
addOnloadHook( createCollapseButtons );
//Shuffle for election candidates
function dshuf(){
var shufsets=new Object()
var rx=new RegExp('dshuf'+'\\s+(dshufset\\d+)', 'i')
var divs=document.getElementsByTagName("div")
for (var i=0; i<divs.length; i++){
if (rx.test(divs[i].className)){
if (typeof shufsets[RegExp.$1]=="undefined"){
shufsets[RegExp.$1]=new Object()
shufsets[RegExp.$1].inner=[]
shufsets[RegExp.$1].member=[]
}
shufsets[RegExp.$1].inner.push(divs[i].innerHTML)
shufsets[RegExp.$1].member.push(divs[i])
}
}
for (shufset in shufsets){
shufsets[shufset].inner.sort(function() {return 0.5 - Math.random()})
for (var i=0; i<shufsets[shufset].member.length; i++){
shufsets[shufset].member[i].innerHTML=shufsets[shufset].inner[i]
shufsets[shufset].member[i].style.display="block"
}
}
}
addOnloadHook(dshuf);
/*************
*** AJAX transclusion table <http://meta.wikimedia.org/wiki/User:Pathoschild/Scripts/AJAX_transclusion_table>
*** by [[m:user:Pathoschild]]
*************/
function attLoader() {
if(getElementsByClassName(document.getElementsByTagName('body')[0],'table','attable').length) {
document.write('<script type="text/javascript" src="'
+ 'http://meta.wikimedia.org/w/index.php?title=User:Pathoschild/Scripts/AJAX_transclusion_table.js'
+ '&action=raw&ctype=text/javascript&dontcountme=s"></script>');
}
}
addOnloadHook(attLoader);
/** JSconfig ************
* Global configuration options to enable/disable and configure
* specific script features from [[MediaWiki:Common.js]] and
* [[MediaWiki:Monobook.js]]
* This framework adds config options (saved as cookies) to [[Special:Preferences]]
* For a more permanent change you can override the default settings in your
* [[Special:Mypage/monobook.js]]
* for Example: JSconfig.keys[loadAutoInformationTemplate] = false;
*
* Maintainer: [[User:Dschwen]]
*/
var JSconfig =
{
prefix : 'jsconfig_',
keys : {},
meta : {},
//
// Register a new configuration item
// * name : String, internal name
// * default_value : String or Boolean (type determines configuration widget)
// * description : String, text appearing next to the widget in the preferences
// * prefpage : Integer (optional), section in the preferences to insert the widget:
// 0 : User profile
// 1 : Skin
// 2 : Math
// 3 : Files
// 4 : Date and time
// 5 : Editing
// 6 : Recent changes
// 7 : Watchlist
// 8 : Search
// 9 : Misc
//
// Access keys through JSconfig.keys[name]
//
registerKey : function( name, default_value, description, prefpage )
{
if( typeof(JSconfig.keys[name]) == 'undefined' )
JSconfig.keys[name] = default_value;
else {
// all cookies are read as strings,
// convert to the type of the default value
switch( typeof(default_value) )
{
case 'boolean' : JSconfig.keys[name] = ( JSconfig.keys[name] == 'true' ); break;
case 'number' : JSconfig.keys[name] = JSconfig.keys[name]/1; break;
}
}
JSconfig.meta[name] = { 'description' : description, 'page' : prefpage || 0, 'default_value' : default_value };
},
readCookies : function()
{
var cookies = document.cookie.split("; ");
var p =JSconfig.prefix.length;
var i;
for( var key in cookies )
{
if( cookies[key].substring(0,p) == JSconfig.prefix )
{
i = cookies[key].indexOf('=');
//alert( cookies[key] + ',' + key + ',' + cookies[key].substring(p,i) );
JSconfig.keys[cookies[key].substring(p,i)] = cookies[key].substring(i+1);
}
}
},
writeCookies : function()
{
for( var key in JSconfig.keys )
document.cookie = JSconfig.prefix + key + '=' + JSconfig.keys[key] + '; path=/; expires=Thu, 2 Aug 2009 10:10:10 UTC';
},
evaluateForm : function()
{
var w_ctrl,wt;
//alert('about to save JSconfig');
for( var key in JSconfig.meta ) {
w_ctrl = document.getElementById( JSconfig.prefix + key )
if( w_ctrl )
{
wt = typeof( JSconfig.meta[key].default_value );
switch( wt ) {
case 'boolean' : JSconfig.keys[key] = w_ctrl.checked; break;
case 'string' : JSconfig.keys[key] = w_ctrl.value; break;
}
}
}
JSconfig.writeCookies();
return true;
},
setUpForm : function()
{
var prefChild = document.getElementById('preferences');
if( !prefChild ) return;
prefChild = prefChild.childNodes;
//
// make a list of all preferences sections
//
var tabs = new Array;
var len = prefChild.length;
for( var key = 0; key < len; key++ ) {
if( prefChild[key].tagName &&
prefChild[key].tagName.toLowerCase() == 'fieldset' )
tabs.push(prefChild[key]);
}
//
// Create Widgets for all registered config keys
//
var w_div, w_label, w_ctrl, wt;
for( var key in JSconfig.meta ) {
w_div = document.createElement( 'DIV' );
w_label = document.createElement( 'LABEL' );
w_label.appendChild( document.createTextNode( JSconfig.meta[key].description ) )
w_label.htmlFor = JSconfig.prefix + key;
wt = typeof( JSconfig.meta[key].default_value );
w_ctrl = document.createElement( 'INPUT' );
w_ctrl.id = JSconfig.prefix + key;
// before insertion into the DOM tree
switch( wt ) {
case 'boolean' : w_ctrl.type = 'checkbox'; break;
case 'string' : w_ctrl.type = 'text'; break;
}
w_div.appendChild( w_label );
w_div.appendChild( w_ctrl );
tabs[JSconfig.meta[key].page].appendChild( w_div );
// after insertion into the DOM tree
switch( wt ) {
case 'boolean' : w_ctrl.defaultChecked = w_ctrl.checked = JSconfig.keys[key]; break;
case 'string' : w_ctrl.defaultValue = w_ctrl.value = JSconfig.keys[key]; break;
}
}
addHandler(document.getElementById('preferences').parentNode, 'submit', JSconfig.evaluateForm );
}
}
JSconfig.readCookies();
addOnloadHook(JSconfig.setUpForm);
// ability to pull [[MediaWiki:Gadget-rtl.css]] on individual page loads by [[testwiki:User:Splarka]] and [[wm2008:User:Mr.Z-man]]
function importStylesheet(page) {
if (page.indexOf('http://') == -1 && page.indexOf('https://') == -1 && page.indexOf('file:///') == -1)
page = wgScript + '?action=raw&ctype=text/css&smaxage=0&title='
+ encodeURIComponent(page.replace(/ /g,'_'))
return document.createStyleSheet ? document.createStyleSheet(page) : appendCSS('@import "' + page + '";')
}
function appendCSS(text){
var s = document.createElement('style')
s.setAttribute('type', 'text/css')
if (s.styleSheet) s.styleSheet.cssText = text //IE
else s.appendChild(document.createTextNode(text))
document.getElementsByTagName('head')[0].appendChild(s)
return s
}
if(document.URL.indexOf('rtl=1') != -1) importStylesheet('http://meta.wikimedia.org/w/index.php?title=MediaWiki:Gadget-rtl.css&action=raw&ctype=text/css');
//import module
importedScripts = {}
function importScript(page, lang) {
page = '?title=' + encodeURIComponent(page.replace(' ','_'))
if (lang) page = 'http://' + lang + '.wikipedia.org/w/index.php' + page
else page = wgScript + page
if (importedScripts[page]) return
importedScripts[page] = true
var s = document.createElement('script')
s.type = 'text/javascript'
s.src = page + '&action=raw&ctype=text/javascript'
document.getElementsByTagName('head')[0].appendChild(s)
}