|
|
| (102 intermediate revisions by the same user not shown) |
| Line 1: |
Line 1: |
| /* <pre><nowiki> */ | | /* JavaScript brought over from Wikipedia appears first. JS code written for our wiki comes second, under the heading CUSTOM ONI WIKI ADDITIONS. */ |
|
| |
|
| //<source lang="javascript"> | | /* WIKIPEDIA CARRY-OVERS */ |
| | /* The original code on Wikipedia's Common.js page should be checked once in a while for updates to, or removal of, this code */ |
|
| |
|
| /* Import more specific scripts if necessary */ | | /** extract a URL parameter from the current URL ********** |
| | | * From [[en:User:Lupin/autoedit.js]] |
| if (wgAction == "edit" || wgAction == "submit" || wgPageName == "Special:Upload") //scripts specific to editing pages
| | * |
| | * paramName : the name of the parameter to extract |
| | */ |
| | function getURLParamValue(paramName, url) |
| { | | { |
| importScript("MediaWiki:Common.js/edit.js") | | if (typeof (url) == 'undefined' || url === null) |
| | url = document.location.href; |
| | var cmdRe = RegExp('[&?]' + paramName + '=([^&#]*)'); // Stop at hash |
| | var m = cmdRe.exec(url); |
| | if (m && m.length > 1) |
| | return decodeURIComponent(m[1]); |
| | return null; |
| } | | } |
| else if (wgPageName == "Special:Watchlist") //watchlist scripts
| | |
| | /** &withJS= URL parameter ******* |
| | * Allow to try custom scripts from MediaWiki space |
| | * without editing [[Special:Mypage/monobook.js]] |
| | */ |
| | var extraJS = getURLParamValue("withJS"); |
| | if (extraJS && extraJS.match("^MediaWiki:[^&<>=%]*\.js$")) |
| { | | { |
| importScript("MediaWiki:Common.js/watchlist.js") | | mw.loader.load('/w/index.php?title=' + extraJS + '&action=raw&ctype=text/javascript'); |
| } | | } |
| else if (wgPageName == "Special:Search") //scripts specific to Special:Search
| | |
| | // TODO: Get this working again |
| | /* If we're on the Search page, load the script that augments that page */ |
| | if (mw.config.get('wgPageName') === 'Special:Search') |
| { | | { |
| importScript("MediaWiki:Common.js/search.js") | | mw.loader.load('/w/index.php?title=MediaWiki:Common.js/search.js&action=raw&ctype=text/javascript'); |
| } | | } |
|
| |
|
| | /** |
| | * Collapsible tables; reimplemented with mw-collapsible |
| | * Styling is also in place to avoid FOUC |
| | * |
| | * Allows tables to be collapsed, showing only the header. See [[Help:Collapsing]]. |
| | * @version 3.0.0 (2018-05-20) |
| | * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js |
| | * @author [[User:R. Koot]] |
| | * @author [[User:Krinkle]] |
| | * @author [[User:TheDJ]] |
| | * @deprecated Since MediaWiki 1.20: Use class="mw-collapsible" instead which |
| | * is supported in MediaWiki core. Shimmable since MediaWiki 1.32 |
| | * |
| | * @param {jQuery} $content |
| | */ |
| | function makeCollapsibleMwCollapsible( $content ) { |
| | var $tables = $content |
| | .find( 'table.collapsible:not(.mw-collapsible)' ) |
| | .addClass( 'mw-collapsible' ); |
|
| |
|
| /** Sysop Javascript ******************************************************* | | $.each( $tables, function ( index, table ) { |
| *
| | // mw.log.warn( 'This page is using the deprecated class collapsible. Please replace it with mw-collapsible.'); |
| * Description: Allows for sysop-specific Javascript at [[MediaWiki:Sysop.js]].
| | if ( $( table ).hasClass( 'collapsed' ) ) { |
| */
| | $( table ).addClass( 'mw-collapsed' ); |
| function sysopFunctions() {
| | // mw.log.warn( 'This page is using the deprecated class collapsed. Please replace it with mw-collapsed.'); |
| if ( wgUserGroups && !window.disableSysopJS ) {
| | } |
| for ( var g = 0; g < wgUserGroups.length; ++g ) {
| | } ); |
| if ( wgUserGroups[g] == "sysop" ) {
| | if ( $tables.length > 0 ) { |
| importScript( "MediaWiki:Sysop.js" );
| | mw.loader.using( 'jquery.makeCollapsible' ).then( function () { |
| break;
| | $tables.makeCollapsible(); |
| }
| | } ); |
| }
| | } |
| }
| |
| } | | } |
| | mw.hook( 'wikipage.content' ).add( makeCollapsibleMwCollapsible ); |
|
| |
|
| addOnloadHook( sysopFunctions );
| | /** |
| | | * Add support to mw-collapsible for autocollapse, innercollapse and outercollapse |
| | | * |
| /** WikiMiniAtlas ******************************************************* | | * Maintainers: TheDJ |
| *
| | */ |
| * Description: WikiMiniAtlas is a popup click and drag world map.
| | function mwCollapsibleSetup( $collapsibleContent ) { |
| * This script causes all of our coordinate links to display the WikiMiniAtlas popup button.
| | var $element, |
| * The script itself is located on meta because it is used by many projects.
| | $toggle, |
| * See [[Meta:WikiMiniAtlas]] for more information.
| | autoCollapseThreshold = 2; |
| * Maintainers: [[User:Dschwen]]
| | $.each( $collapsibleContent, function ( index, element ) { |
| */
| | $element = $( element ); |
| | | if ( $element.hasClass( 'collapsible' ) ) { |
| if (wgServer == "https://secure.wikimedia.org") { | | $element.find( 'tr:first > th:first' ).prepend( $element.find( 'tr:first > * > .mw-collapsible-toggle' ) ); |
| var metaBase = "https://secure.wikimedia.org/wikipedia/meta";
| | } |
| } else {
| | if ( $collapsibleContent.length >= autoCollapseThreshold && $element.hasClass( 'autocollapse' ) ) { |
| var metaBase = "http://meta.wikimedia.org";
| | $element.data( 'mw-collapsible' ).collapse(); |
| | } else if ( $element.hasClass( 'innercollapse' ) ) { |
| | if ( $element.parents( '.outercollapse' ).length > 0 ) { |
| | $element.data( 'mw-collapsible' ).collapse(); |
| | } |
| | } |
| | // because of colored backgrounds, style the link in the text color |
| | // to ensure accessible contrast |
| | $toggle = $element.find( '.mw-collapsible-toggle' ); |
| | if ( $toggle.length ) { |
| | // Make the toggle inherit text color (Updated for T333357 2023-04-29) |
| | if ( $toggle.parent()[ 0 ].style.color ) { |
| | $toggle.css( 'color', 'inherit' ); |
| | $toggle.find( '.mw-collapsible-text' ).css( 'color', 'inherit' ); |
| | } |
| | } |
| | } ); |
| } | | } |
| importScriptURI(metaBase+"/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript&smaxage=21600&maxage=86400")
| |
|
| |
|
| | mw.hook( 'wikipage.collapsibleContent' ).add( mwCollapsibleSetup ); |
|
| |
|
| /* Scripts specific to Internet Explorer */ | | /* CUSTOM ONI WIKI ADDITIONS */ |
|
| |
|
| if (navigator.appName == "Microsoft Internet Explorer") | | /* Focus us on the Search box if we're on the Main Page, so we can immediately start typing */ |
| | if (mw.config.get('wgIsMainPage')) |
| { | | { |
| /** Internet Explorer bug fix ************************************************** | | $(function() |
| *
| |
| * Description: Fixes IE horizontal scrollbar bug
| |
| * Maintainers: [[User:Tom-]]?
| |
| */
| |
|
| |
| var oldWidth;
| |
| var docEl = document.documentElement;
| |
|
| |
| function fixIEScroll()
| |
| {
| |
| if (!oldWidth || docEl.clientWidth > oldWidth)
| |
| doFixIEScroll();
| |
| else
| |
| setTimeout(doFixIEScroll, 1);
| |
|
| |
| oldWidth = docEl.clientWidth;
| |
| }
| |
|
| |
| function doFixIEScroll() {
| |
| docEl.style.overflowX = (docEl.scrollWidth - docEl.clientWidth < 4) ? "hidden" : "";
| |
| }
| |
|
| |
| document.attachEvent("onreadystatechange", fixIEScroll);
| |
| document.attachEvent("onresize", fixIEScroll);
| |
|
| |
|
| |
| /**
| |
| * Remove need for CSS hacks regarding MSIE and IPA.
| |
| */
| |
|
| |
| if (document.createStyleSheet) {
| |
| document.createStyleSheet().addRule('.IPA', 'font-family: "Doulos SIL", "Charis SIL", Gentium, "DejaVu Sans", Code2000, "TITUS Cyberbit Basic", "Arial Unicode MS", "Lucida Sans Unicode", "Chrysanthi Unicode";');
| |
| }
| |
|
| |
|
| |
| //Import scripts specific to Internet Explorer 6
| |
| if (navigator.appVersion.substr(22, 1) == "6")
| |
| { | | { |
| importScript("MediaWiki:Common.js/IE60Fixes.js") | | $('#searchInput').focus(); |
| } | | }); |
| } | | } |
|
| |
|
| | | /** Hover tables ********************************************************* |
| /* Test if an element has a certain class ************************************** | |
| * | | * |
| * Description: Uses regular expressions and caching for better performance. | | * Description: Allows tables to use mouse-over to provide explanation of |
| * Maintainers: [[User:Mike Dillon]], [[User:R. Koot]], [[User:SG]] | | * the pointed-to content. |
| | * Maintainers: [[User:Iritscen]] |
| */ | | */ |
| | function showDescrip(typeID, show_or_not) |
| | { |
| | var DescripPanel = document.getElementsByClassName("hovertable_descrip")[0]; /* only get 1st one on page to keep things simple */ |
| | var Descrips = DescripPanel.getElementsByTagName("span"); |
|
| |
|
| var hasClass = (function () {
| | if (!DescripPanel || !Descrips) |
| var reCache = {};
| | return false; |
| return function (element, className) { | |
| return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className); | |
| };
| |
| })();
| |
|
| |
|
| | for (var i = 0; i < Descrips.length; i++) |
| | { |
| | if (Descrips[i].id == typeID) |
| | { |
| | if (show_or_not) |
| | Descrips[i].style.display = "block"; |
| | else |
| | Descrips[i].style.display = "none"; |
| | } |
| | } |
| | } |
| | function initHoverTables() |
| | { |
| | var Tables = document.getElementsByClassName("hovertable"); |
| | if (!Tables) |
| | return false; |
|
| |
|
| /** Interwiki links to featured articles ***************************************
| | for (var i = 0; i < Tables.length; i++) |
| *
| | { |
| * Description: Highlights interwiki links to featured articles (or
| | var Cells = Tables[i].getElementsByTagName("td"); |
| * equivalents) by changing the bullet before the interwiki link
| | if (!Cells) continue; |
| * into a star.
| |
| * Maintainers: [[User:R. Koot]]
| |
| */
| |
|
| |
|
| function LinkFA()
| | for (var j = 0; j < Cells.length; j++) |
| {
| | { |
| if ( document.getElementById( "p-lang" ) ) {
| | if ($(Cells[j]).hasClass("hovercell")) |
| var InterwikiLinks = document.getElementById( "p-lang" ).getElementsByTagName( "li" );
| | { |
| | | $(Cells[j]).mouseover(new Function("evt", "showDescrip(this.id, true);")); |
| for ( var i = 0; i < InterwikiLinks.length; i++ ) { | | $(Cells[j]).mouseout(new Function("evt", "showDescrip(this.id, false);")); |
| if ( document.getElementById( InterwikiLinks[i].className + "-fa" ) ) { | |
| InterwikiLinks[i].className += " FA" | |
| InterwikiLinks[i].title = "This is a featured article in another language."; | |
| } | | } |
| } | | } |
| } | | } |
| } | | } |
| | $(initHoverTables); |
|
| |
|
| addOnloadHook( LinkFA );
| | /** Hover GIFs ********************************************************* |
| | |
| | |
| /** Collapsible tables ********************************************************* | |
| * | | * |
| * Description: Allows tables to be collapsed, showing only the header. See | | * Description: Allows GIFs to only animate upon mouse-over. |
| * [[Wikipedia:NavFrame]]. | | * |
| * Maintainers: [[User:R. Koot]] | | * Maintainers: [[User:Iritscen]] |
| */ | | */ |
| | | function swapImage(gifID, show_gif) |
| var autoCollapse = 2;
| |
| var collapseCaption = "hide";
| |
| var expandCaption = "show";
| |
| | |
| function collapseTable( tableIndex ) | |
| { | | { |
| var Button = document.getElementById( "collapseButton" + tableIndex ); | | var gif_span = document.getElementById(gifID); |
| var Table = document.getElementById( "collapsibleTable" + tableIndex ); | | var gif_image = gif_span.getElementsByClassName("image")[0]; |
| | var gif_img = gif_image.getElementsByTagName("img")[0]; |
| | var gif_src = gif_img.src; |
|
| |
|
| if ( !Table || !Button ) { | | if (!gif_img) |
| return false; | | return false; |
| }
| |
|
| |
|
| var Rows = Table.rows;
| | if (show_gif) |
| | | gif_img.src = gif_src.replace('.jpg', '.gif'); |
| if ( Button.firstChild.data == collapseCaption ) { | | else |
| for ( var i = 1; i < Rows.length; i++ ) { | | gif_img.src = gif_src.replace('.gif', '.jpg'); |
| 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 initHoverGIFs() |
| function createCollapseButtons() | |
| { | | { |
| var tableIndex = 0; | | var gifs = document.getElementsByClassName("hovergif"); |
| var NavigationBoxes = new Object();
| |
| var Tables = document.getElementsByTagName( "table" );
| |
|
| |
|
| for ( var i = 0; i < Tables.length; i++ ) { | | if (!gifs) |
| if ( hasClass( Tables[i], "collapsible" ) ) { | | return false; |
|
| |
|
| /* only add button and increment count if there is a header row to work with */
| | for (var i = 0; i < gifs.length; i++) |
| var HeaderRow = Tables[i].getElementsByTagName( "tr" )[0];
| | { |
| if (!HeaderRow) continue;
| | $(gifs[i]).mouseover(swapImage(this.id, true)); |
| var Header = HeaderRow.getElementsByTagName( "th" )[0];
| | $(gifs[i]).mouseout(swapImage(this.id, false)); |
| if (!Header) continue;
| |
| | |
| 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.style.color = Header.style.color;
| |
| 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( "]" ) );
| |
| | |
| 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 );
| |
| } | |
| else if ( hasClass( NavigationBoxes[i], "innercollapse" ) ) {
| |
| var element = NavigationBoxes[i];
| |
| while (element = element.parentNode) {
| |
| if ( hasClass( element, "outercollapse" ) ) {
| |
| collapseTable ( i );
| |
| break;
| |
| }
| |
| }
| |
| }
| |
| } | | } |
| } | | } |
| | $(initHoverGIFs); |
|
| |
|
| addOnloadHook( createCollapseButtons );
| | /***** Auto-sorting tables ******** |
| | | * Auto-sorts sortable tables by a given column (why is this not built-in?!) |
| | | * You must opt into this feature by placing "autosort" in the list of |
| /** Dynamic Navigation Bars (experimental) ************************************* | | * the table's classes along with "sortable" |
| * | | * |
| * Description: See [[Wikipedia:NavFrame]]. | | * Maintainers: [[User:Iritscen]] |
| * Maintainers: UNMAINTAINED
| |
| */ | | */ |
| | | // For some reason, the arrow buttons and headerSort classes are not attached to sortable tables immediately upon the "load" event, and we need those, so we wait a bit before trying to sort |
| // set up the words in your language | | function sortTimer() |
| var NavigationBarHide = '[' + collapseCaption + ']';
| |
| var NavigationBarShow = '[' + expandCaption + ']';
| |
| | |
| // shows and hides content and picture (if available) of navigation bars
| |
| // Parameters:
| |
| // indexNavigationBar: the index of navigation bar to be toggled
| |
| function toggleNavigationBar(indexNavigationBar) | |
| { | | { |
| var NavToggle = document.getElementById("NavToggle" + indexNavigationBar); | | setTimeout(function() |
| var NavFrame = document.getElementById("NavFrame" + indexNavigationBar);
| | { |
| | | sortSortableTables(); |
| if (!NavFrame || !NavToggle) { | | }, (1 * 1000)); |
| return false; | |
| }
| |
| | |
| // if shown now
| |
| if (NavToggle.firstChild.data == NavigationBarHide) {
| |
| for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
| |
| if ( hasClass( NavChild, 'NavPic' ) ) {
| |
| NavChild.style.display = 'none';
| |
| }
| |
| if ( hasClass( NavChild, 'NavContent') ) {
| |
| NavChild.style.display = 'none';
| |
| }
| |
| }
| |
| NavToggle.firstChild.data = NavigationBarShow;
| |
| | |
| // if hidden now
| |
| } else if (NavToggle.firstChild.data == NavigationBarShow) { | |
| for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
| |
| if (hasClass(NavChild, 'NavPic')) {
| |
| NavChild.style.display = 'block';
| |
| }
| |
| if (hasClass(NavChild, 'NavContent')) {
| |
| NavChild.style.display = 'block';
| |
| }
| |
| }
| |
| NavToggle.firstChild.data = NavigationBarHide;
| |
| }
| |
| } | | } |
| | | function sortSortableTables() |
| // adds show/hide-button to navigation bars
| |
| function createNavigationBarToggleButton() | |
| { | | { |
| var indexNavigationBar = 0; | | console.log("Sorting the autosort tables."); |
| // iterate over all < div >-elements | | // Iterate over all <div> elements |
| var divs = document.getElementsByTagName("div"); | | var divs = document.getElementsByTagName("div"); |
| for (var i = 0; NavFrame = divs[i]; i++) { | | if (!divs) return; |
| // if found a navigation bar
| | for (var i = 0; i < divs.length; i++) |
| if (hasClass(NavFrame, "NavFrame")) {
| | { |
| | var theDiv = divs[i]; |
| | var tables = theDiv.getElementsByTagName("table"); |
| | if (!tables) continue; |
| | for (var j = 0; j < tables.length; j++) |
| | { |
| | var theTable = tables[j]; |
| | // If we found a sortable table that is asking for autosort... |
| | if ($(theTable).hasClass("sortable") && $(theTable).hasClass("autosort")) |
| | { |
| | var sortColumnNum = 1, curColumnNum = 0; |
|
| |
|
| indexNavigationBar++;
| | // First check if there is any by-column-x class at all, then take the time to figure out the value of x |
| var NavToggle = document.createElement("a");
| | var patt = /by-column/; |
| NavToggle.className = 'NavToggle';
| | if (patt.test(theTable.className)) |
| NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
| | { |
| NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');
| | for (var col = 1; col < 10; col++) |
| | { |
| | var colOption = "by-column-" + col; |
| | if ($(theTable).hasClass(colOption)) |
| | { |
| | //console.log("Table " + j + " wants to sort by column " + col); |
| | sortColumnNum = col; |
|
| |
|
| var isCollapsed = hasClass( NavFrame, "collapsed" );
| | // Now look for sort button and click it |
| /*
| | var allTHs = theTable.getElementsByTagName("th"); |
| * Check if any children are already hidden. This loop is here for backwards compatibility:
| | if (!allTHs) |
| * the old way of making NavFrames start out collapsed was to manually add style="display:none"
| | { |
| * to all the NavPic/NavContent elements. Since this was bad for accessibility (no way to make
| | console.log("Failed to get 'th' elements!"); |
| * the content visible without JavaScript support), the new recommended way is to add the class
| | continue; |
| * "collapsed" to the NavFrame itself, just like with collapsible tables.
| | } |
| */
| | for (var k = 0; k < allTHs.length; k++) |
| for (var NavChild = NavFrame.firstChild; NavChild != null && !isCollapsed; NavChild = NavChild.nextSibling) {
| | { |
| if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
| | //console.log("Class names for 'th' # " + k + " are " + allTHs[k].className); |
| if ( NavChild.style.display == 'none' ) {
| | if ($(allTHs[k]).hasClass("headerSort")) |
| isCollapsed = true; | | { |
| | curColumnNum++; |
| | if (curColumnNum == sortColumnNum) |
| | { |
| | console.log("Clicking sort button (ID " + k + ") for column " + sortColumnNum); |
| | $(allTHs[k]).trigger("click"); // use jQuery's trigger() to send click event to this arrow |
| | return; |
| | } |
| | } |
| | } |
| | } |
| } | | } |
| } | | } |
| } | | } |
| if (isCollapsed) {
| |
| for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
| |
| if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
| |
| NavChild.style.display = 'none';
| |
| }
| |
| }
| |
| }
| |
| var NavToggleText = document.createTextNode(isCollapsed ? NavigationBarShow : NavigationBarHide);
| |
| NavToggle.appendChild(NavToggleText);
| |
|
| |
| // Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)
| |
| for(var j=0; j < NavFrame.childNodes.length; j++) {
| |
| if (hasClass(NavFrame.childNodes[j], "NavHead")) {
| |
| NavFrame.childNodes[j].appendChild(NavToggle);
| |
| }
| |
| }
| |
| NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
| |
| } | | } |
| } | | } |
| } | | } |
| | $(sortTimer); |
|
| |
|
| addOnloadHook( createNavigationBarToggleButton );
| | /***** Auto-formatting dates ******** |
| | | * Re-formats a date placed by [[Template:LocaleDate]] to match the |
| | | * month/day order of the user's locale. |
| /** Main Page layout fixes ********************************************************* | |
| * | | * |
| * Description: Adds an additional link to the complete list of languages available.
| | * Maintainers: [[User:Iritscen]] |
| * Maintainers: [[User:AzaToth]], [[User:R. Koot]], [[User:Alex Smotrov]] | |
| */ | | */ |
| | | function getLang() |
| function mainPageAppendCompleteListLink() { | | { |
| addPortletLink('p-lang', 'http://meta.wikimedia.org/wiki/List_of_Wikipedias',
| | if (navigator.languages !== undefined) |
| 'Complete list', 'interwiki-completelist', 'Complete list of Wikipedias')
| | return navigator.languages[0]; |
| | return navigator.language; |
| } | | } |
| | | /* Because CSS variables didn't seem to work for changing the .date-[day/month]::before rules, |
| if ((wgTitle == 'Main Page' && wgNamespaceNumber == 0) || (wgTitle == 'Wikipedia' && wgNamespaceNumber == 100)) {
| | this function manually trawls the stylesheets until it finds those rules and changes them */ |
| addOnloadHook(mainPageAppendCompleteListLink);
| | function changeDateSeparator(component, separator) |
| addOnloadHook(dshuf);
| | { |
| }
| | const styleSheets = document.styleSheets; |
| | | var ruleIndex; |
| //Shuffle for election candidates.
| | |
| function dshuf() { | | for (var i = 0; i < styleSheets.length; i++) |
| var shufsets=new Object()
| | { |
| var rx=new RegExp('dshuf'+'\\s+(dshufset\\d+)', 'i')
| | const rules = styleSheets[i].cssRules || styleSheets[i].rules; |
| var divs=document.getElementsByTagName("div")
| | for (var j = 0; j < rules.length; j++) |
| for (var i=0; i<divs.length; i++) {
| | { |
| if (rx.test(divs[i].className)) {
| | if (rules[j].selectorText === '.mw-parser-output .date-'+component+'::before') |
| if (typeof shufsets[RegExp.$1]=="undefined") {
| | { |
| shufsets[RegExp.$1]=new Object()
| | ruleIndex = j; |
| shufsets[RegExp.$1].inner=[]
| | break; |
| shufsets[RegExp.$1].member=[]
| | } |
| }
| |
| shufsets[RegExp.$1].inner.push({key:Math.random(),html:divs[i].innerHTML})
| |
| shufsets[RegExp.$1].member.push(divs[i])
| |
| }
| |
| } | | } |
| for (shufset in shufsets) {
| |
| shufsets[shufset].inner.sort(function(a,b) {return a.key-b.key})
| |
| for (var i=0; i<shufsets[shufset].member.length; i++) {
| |
| shufsets[shufset].member[i].innerHTML=shufsets[shufset].inner[i].html
| |
| shufsets[shufset].member[i].style.display="block"
| |
| }
| |
| }
| |
| }
| |
|
| |
|
| | | if (ruleIndex !== undefined) |
| | |
| /** "Technical restrictions" title fix *****************************************
| |
| *
| |
| * Description: For pages that have something like Template:Wrongtitle, replace
| |
| * the title, but only if it is cut-and-pasteable as a valid
| |
| * wikilink. For instance, "NZR WB class" can be changed to
| |
| * "NZR W<sup>B</sup> class", but [[C#]] is not an equivalent wikilink,
| |
| * so [[C Sharp]] doesn't have its main title changed.
| |
| *
| |
| * The function looks for a banner like this:
| |
| * <div id="RealTitleBanner"> ... <span id="RealTitle">title</span> ... </div>
| |
| * An element with id=DisableRealTitle disables the function.
| |
| * Maintainers: Remember_the_dot
| |
| */
| |
| | |
| if (wgIsArticle) //prevents the "Editing " prefix from disappearing during preview
| |
| {
| |
| addOnloadHook(function()
| |
| { | | { |
| var realTitle = document.getElementById("RealTitle")
| | // Update the content of the existing rule |
|
| | styleSheets[i].deleteRule(ruleIndex); |
| if (realTitle)
| | styleSheets[i].insertRule('.date-'+component+'::before{content:"'+separator+'";}', ruleIndex); |
| {
| | break; |
| //normalizes a title or a namespace name (but not both)
| |
| //trims leading and trailing underscores and converts (possibly multiple) spaces and underscores to single underscores
| |
| function normalizeTitle(title)
| |
| {
| |
| return title.replace(/^_+/, "").replace(/_+$/, "").replace(/[\s_]+/g, "_")
| |
| }
| |
|
| |
| if (realTitle.textContent) //everyone but IE
| |
| {
| |
| var realTitleText = realTitle.textContent
| |
| }
| |
| else //IE
| |
| {
| |
| var realTitleText = realTitle.innerText
| |
| }
| |
|
| |
| var normalizedRealTitle
| |
| var normalizedPageTitle
| |
| var indexOfColon = realTitleText.indexOf(":")
| |
| var normalizedNamespaceName = normalizeTitle(realTitleText.substring(0, indexOfColon)).toLowerCase()
| |
|
| |
| //make namespace prefix lowercase and uppercase the first letter of the title
| |
| if (indexOfColon == -1 || wgCanonicalNamespace.toLowerCase() != normalizedNamespaceName) //no namespace prefix - either no colon or a nonsensical namespace prefix (for example, "Foo" in "Foo: The Story of My Life")
| |
| {
| |
| normalizedRealTitle = normalizeTitle(realTitleText)
| |
| normalizedRealTitle = normalizedRealTitle.charAt(0).toUpperCase() + normalizedRealTitle.substring(1)
| |
| normalizedPageTitle = wgPageName.charAt(0).toUpperCase() + wgPageName.substring(1)
| |
| }
| |
| else //using a namespace prefix
| |
| {
| |
| var normalizedRealPageTitle = normalizeTitle(realTitleText.substring(indexOfColon + 1))
| |
|
| |
| normalizedRealTitle = normalizedNamespaceName
| |
| if (normalizedNamespaceName != "") //namespace 0 is a special case where the leading colon should never be shown
| |
| {
| |
| normalizedRealTitle += ":"
| |
| }
| |
| normalizedRealTitle += normalizedRealPageTitle.charAt(0).toUpperCase() + normalizedRealPageTitle.substring(1)
| |
| normalizedPageTitle = wgPageName.substring(0, wgPageName.indexOf(":") + 1).toLowerCase() + wgPageName.substring(wgPageName.indexOf(":") + 1)
| |
| }
| |
|
| |
| if (normalizedRealTitle == normalizedPageTitle) //normalized titles match, so we can do full replacement
| |
| {
| |
| var h1 = document.getElementsByTagName("h1")[0]
| |
|
| |
| //remove all child nodes, including text
| |
| while (h1.firstChild)
| |
| {
| |
| h1.removeChild(h1.firstChild)
| |
| }
| |
|
| |
| //populate with nodes of real title
| |
| while (realTitle.firstChild) //the children are moved to a new parent element
| |
| {
| |
| h1.appendChild(realTitle.firstChild)
| |
| }
| |
|
| |
| //delete the real title banner since the problem is solved
| |
| var realTitleBanner = document.getElementById("RealTitleBanner")
| |
| realTitleBanner.parentNode.removeChild(realTitleBanner)
| |
| }
| |
|
| |
| //no matter what, correct the page title
| |
| document.title = realTitleText + " - Wikipedia, the free encyclopedia"
| |
| }
| |
| })
| |
| }
| |
| | |
| | |
| /** Table sorting fixes ************************************************
| |
| *
| |
| * Description: Disables code in table sorting routine to set classes on even/odd rows
| |
| * Maintainers: [[User:Random832]]
| |
| */
| |
| | |
| ts_alternate_row_colors = false;
| |
| | |
| | |
| /** Modernista referrer ************************************************
| |
| *
| |
| * Description: Adds a notice to pages viewed through modernista.com
| |
| * Maintainers: [[User:Random832]]
| |
| */
| |
| | |
| addOnloadHook(function(){
| |
| if(/modernista\.com/.test(document.referrer)) {
| |
| jsMsg('<table><tr><td><img src="http://upload.wikimedia.org/'
| |
| +'wikipedia/commons/thumb/d/dc/Nuvola_apps_important_yellow.svg/'
| |
| +'48px-Nuvola_apps_important_yellow.svg.png" /></td><td><br /><br />You '
| |
| +'appear to have come here from the Modernista website. They '
| |
| +'enclose Wikipedia’s content with a frame and overlay their '
| |
| +'own navigation banner on top. Wikipedia does not endorse '
| |
| +'Modernista and its appearance here should not be taken to '
| |
| +'imply this.</td></tr></table>');
| |
| }
| |
| });
| |
| | |
| /***** uploadwizard_newusers ********
| |
| * Switches in a message for non-autoconfirmed users at [[Wikipedia:Upload]]
| |
| *
| |
| * Maintainers: [[User:Krimpet]]
| |
| ****/
| |
| function uploadwizard_newusers() {
| |
| if (wgNamespaceNumber == 4 && wgTitle == "Upload" && wgAction == "view") {
| |
| var oldDiv = document.getElementById("autoconfirmedusers"),
| |
| newDiv = document.getElementById("newusers");
| |
| if (oldDiv && newDiv) {
| |
| if (typeof wgUserGroups == "object" && wgUserGroups) {
| |
| for (i = 0; i < wgUserGroups.length; i++) {
| |
| if (wgUserGroups[i] == "autoconfirmed") {
| |
| oldDiv.style.display = "block";
| |
| newDiv.style.display = "none";
| |
| return;
| |
| }
| |
| }
| |
| }
| |
| oldDiv.style.display = "none";
| |
| newDiv.style.display = "block";
| |
| return; | |
| } | | } |
| } | | } |
| } | | } |
| addOnloadHook(uploadwizard_newusers);
| | function localizeDates() |
| | { |
| | const lang = getLang(); |
| | const root = document.querySelector(':root'); |
|
| |
|
| | | if (root == undefined || lang == undefined) |
| /** IPv6 AAAA connectivity testing *******************************************************
| | return; |
| *
| | |
| * Description: Uses hidden images to measure the possible negative impact of IPv6
| | if (lang != "en-US") // Template:LocaleDate prints dates in U.S.-style by default |
| * enabling the Wikimedia sites.
| | { |
| * This works by adding a hidden div to the footer with several image tags.
| | root.style.setProperty('--month-order', '2'); |
| * The source addresses of the image tags are set to domainnames which have v4, v6 and
| | root.style.setProperty('--day-order', '1'); |
| * both address types set. The script times how long objects take to load.
| | changeDateSeparator('month', '/'); |
| * Results are sent back to the server. http://ipv6and4.labs.wikimedia.org/stats.html
| | changeDateSeparator('day', ''); |
| * Based on http://www.braintrust.co.nz/ipv6wwwtest/
| | } |
| * Contact: [[User:Gmaxwell]], [[User:Mark Bergsma]], [[User:Mindspillage]] | |
| */
| |
| | |
| var __ipv6wwwtest_factor = 100;
| |
| var __ipv6wwwtest_done = 0;
| |
| if ((wgServer != "https://secure.wikimedia.org") && (Math.floor(Math.random()*__ipv6wwwtest_factor)==42)) { | |
| var __ipv6wwwtest_timeoutMsec = 10000; // Timeout for 'final' result message in milliseconds
| |
| var __ipv6wwwtest_hostSuffix = ".labs.wikimedia.org"; // Suffix to go on the IMG hostnames
| |
| var __ipv6wwwtest_stopAtTimeout = true; // Whether to stop when the timeout is reached or not
| |
| | |
| var __ipv6wwwtest_pageLoadTime;
| |
| var __ipv6wwwtest_timeout = false;
| |
| var __ipv6wwwtest_ipv4LoadTime = false;
| |
| var __ipv6wwwtest_ipv4relLoadTime = false;
| |
| var __ipv6wwwtest_ipv6LoadTime = false;
| |
| var __ipv6wwwtest_ipv6bigLoadTime = false;
| |
| var __ipv6wwwtest_ipv6and4LoadTime = false;
| |
| var __ipv6wwwtest_id = Math.floor(Math.random()*Math.pow(2,31));
| |
| | |
| function __ipv6wwwtest_startTest() {
| |
| __ipv6wwwtest_pageLoadTime = new Date();
| |
| document.getElementById("__ipv6wwwtest_ipv4Img").src = "http://ipv4" + __ipv6wwwtest_hostSuffix +"/ipv4.gif?id=" + __ipv6wwwtest_id;
| |
| document.getElementById("__ipv6wwwtest_ipv4relImg").src = "//ipv4" + __ipv6wwwtest_hostSuffix +"/ipv4.gif?rel=1&id=" + __ipv6wwwtest_id;
| |
| document.getElementById("__ipv6wwwtest_ipv6Img").src = "http://ipv6" + __ipv6wwwtest_hostSuffix +"/ipv6.gif?id=" + __ipv6wwwtest_id;
| |
| document.getElementById("__ipv6wwwtest_ipv6and4Img").src = "http://ipv6and4" + __ipv6wwwtest_hostSuffix +"/ipv6and4.gif?id=" + __ipv6wwwtest_id;
| |
| document.getElementById("__ipv6wwwtest_ipv6bigImg").src = "http://ipv6" + __ipv6wwwtest_hostSuffix +"/ipv6big.gif?id=" + __ipv6wwwtest_id;
| |
| }
| |
| | |
| function __ipv6wwwtest_sendResults(stage) {
| |
| document.getElementById("__ipv6wwwtest_resultsImg").src = "http://results" + __ipv6wwwtest_hostSuffix +"/results.gif?id=" + __ipv6wwwtest_id + "&stage=" + stage + "&timeout=" + __ipv6wwwtest_timeoutMsec + "&stop_at_timeout=" + __ipv6wwwtest_stopAtTimeout + "&ipv4=" + __ipv6wwwtest_getLoadTime(__ipv6wwwtest_ipv4LoadTime) + "&ipv6=" + __ipv6wwwtest_getLoadTime(__ipv6wwwtest_ipv6LoadTime) + "&ipv6and4=" + __ipv6wwwtest_getLoadTime(__ipv6wwwtest_ipv6and4LoadTime) + "&ipv6big=" + __ipv6wwwtest_getLoadTime(__ipv6wwwtest_ipv6bigLoadTime) +"&ipv4rel="+ __ipv6wwwtest_getLoadTime(__ipv6wwwtest_ipv4relLoadTime) + "&rate=" + __ipv6wwwtest_factor;
| |
| };
| |
| | |
| function __ipv6wwwtest_getLoadTime(item) {
| |
| if (item == false) {
| |
| return "NaN";
| |
| } else {
| |
| return (item.getTime() - __ipv6wwwtest_pageLoadTime.getTime());
| |
| }
| |
| }
| |
| | |
| function __ipv6wwwtest_checkFinished() {
| |
| if ( (! __ipv6wwwtest_ipv6LoadTime) || (! __ipv6wwwtest_ipv4LoadTime) || (! __ipv6wwwtest_ipv6and4LoadTime) || (! __ipv6wwwtest_ipv6bigLoadTime) || (! __ipv6wwwtest_getLoadTime)) {
| |
| if (!__ipv6wwwtest_timeout) {
| |
| __ipv6wwwtest_timeout = window.setTimeout('__ipv6wwwtest_sendFinalResults()',__ipv6wwwtest_timeoutMsec);
| |
| }
| |
| __ipv6wwwtest_sendResults('partial');
| |
| } else {
| |
| __ipv6wwwtest_sendFinalResults();
| |
| }
| |
| }
| |
| | |
| function __ipv6wwwtest_sendFinalResults() {
| |
| if (__ipv6wwwtest_done==0) {
| |
| if (__ipv6wwwtest_timeout) {
| |
| window.clearTimeout(__ipv6wwwtest_timeout);
| |
| }
| |
| __ipv6wwwtest_sendResults('final');
| |
| | |
| if (__ipv6wwwtest_stopAtTimeout) {
| |
| document.getElementById("__ipv6wwwtest_ipv4Img").src = "";
| |
| document.getElementById("__ipv6wwwtest_ipv4relImg").src = "";
| |
| document.getElementById("__ipv6wwwtest_ipv6Img").src = "";
| |
| document.getElementById("__ipv6wwwtest_ipv6and4Img").src = "";
| |
| document.getElementById("__ipv6wwwtest_ipv6bigImg").src = "";
| |
| }
| |
| }
| |
| __ipv6wwwtest_done=1;
| |
| }
| |
| addOnloadHook(function() {
| |
| v6sub=document.getElementById("footer");
| |
| v6sub.innerHTML=v6sub.innerHTML+'<div style="visibility: hidden;"> <img height="1" width="1" src="" id="__ipv6wwwtest_ipv4Img" onload="__ipv6wwwtest_ipv4LoadTime = new Date(); __ipv6wwwtest_checkFinished();" /> <img height="1" width="1" src="" id="__ipv6wwwtest_ipv4relImg" onload="__ipv6wwwtest_ipv4relLoadTime = new Date(); __ipv6wwwtest_checkFinished();" /> <img height="1" width="1" src="" id="__ipv6wwwtest_ipv6and4Img" onload="__ipv6wwwtest_ipv6and4LoadTime = new Date(); __ipv6wwwtest_checkFinished();" /> <img height="1" width="1" src="" id="__ipv6wwwtest_ipv6Img" onload="__ipv6wwwtest_ipv6LoadTime = new Date(); __ipv6wwwtest_checkFinished();" /> <img height="1" width="1" src="" id="__ipv6wwwtest_ipv6bigImg" onload="__ipv6wwwtest_ipv6bigLoadTime = new Date(); __ipv6wwwtest_checkFinished();" /> <img height="1" width="1" src="" id="__ipv6wwwtest_resultsImg" /> </div>';
| |
| if (document.getElementById("__ipv6wwwtest_ipv4Img") && document.getElementById("__ipv6wwwtest_ipv6Img") && document.getElementById("__ipv6wwwtest_ipv6and4Img") && document.getElementById("__ipv6wwwtest_ipv6bigImg")) {
| |
| __ipv6wwwtest_startTest();
| |
| }
| |
| });
| |
| } | | } |
| | | $(localizeDates); |
| /** Disambig editintro ********************************************************
| |
| *
| |
| * Description: Adds an editintro on disambiguation pages. Original code
| |
| * located at [[User:RockMFR/disambigeditintro.js]].
| |
| *
| |
| * Maintainers: [[User:RockMFR]], [[User:Quiddity]]
| |
| */
| |
|
| |
| if (wgNamespaceNumber == 0) addOnloadHook(function(){
| |
| if (!document.getElementById('disambig')) return
| |
| var el = document.getElementById('ca-edit')
| |
| if (el) el = el.getElementsByTagName('a')[0]
| |
| if (el) el.href += '&editintro=Template:Disambig_editintro'
| |
| })
| |
| | |
| //</source>
| |
| /* </pre></nowiki> */
| |