MediaWiki:Common.js

/* Any JavaScript here will be loaded for all users on every page load. */ /** Import module ************************************************************* * *  Description: Includes a raw wiki page as javascript or CSS, *              used for including user made modules. * Maintainers: wikipedia:User:AzaToth */ importedScripts = {}; // object keeping track of included scripts, so a script ain't included twice function importScript( page ) { if( importedScripts[page] ) { return; }    importedScripts[page] = true; var url = wgScriptPath + '/index.php?title=' + encodeURIComponent( page.replace( / /g, '_' ) ) + '&action=raw&ctype=text/javascript'; var scriptElem = document.createElement( 'script' ); scriptElem.setAttribute( 'src', url ); scriptElem.setAttribute( 'type', 'text/javascript' ); document.getElementsByTagName( 'head' )[0].appendChild( scriptElem ); } function importStylesheet( page ) { var sheet = '@import "'              + wgScriptPath               + '/index.php?title='               + encodeURIComponent( page.replace( / /g, '_' ) )               + '&action=raw&ctype=text/css";' var styleElem = document.createElement( 'style' ); styleElem.setAttribute( 'type', 'text/css' ); styleElem.appendChild( document.createTextNode( sheet ) ); document.getElementsByTagName( 'head' )[0].appendChild( styleElem ); }

/* Test if an element has a certain class ************************************** * * Description: Uses regular expressions and caching for better performance. * Maintainers: wikipedia:User:Mike Dillon, wikipedia:User:R. Koot, wikipedia:User:SG */ var hasClass = (function {     var reCache = {};     return function (element, className) {         return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);    }; });

/** Internet Explorer bug fix ************************************************** * *  Description: Fixes IE horizontal scrollbar bug * Maintainers: wikipedia:User:Tom-? */ if (navigator.appName == "Microsoft Internet Explorer" && document.compatMode == "CSS1Compat") {  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); attachEvent("onresize", fixIEScroll); }

/** Collapsible tables ********************************************************* * *  Description: Allows tables to be collapsed, showing only the header. See *              NavFrame. * Maintainers: wikipedia:User:R. Koot */ var autoCollapse = 2; var collapseCaption = "hide"; var expandCaption = "show"; function collapseTable( tableIndex ) {    var Button = document.getElementById( "collapseButton" + tableIndex ); var Table = document.getElementById( "collapsibleTable" + tableIndex ); if ( !Table || !Button ) { return false; }    var Rows = Table.rows; 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" ) ) { /* only add button and increment count if there is a header row to work with */ var HeaderRow = Tables[i].getElementsByTagName( "tr" )[0]; if (!HeaderRow) continue; var Header = HeaderRow.getElementsByTagName( "th" )[0]; 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 ); }    } } addOnloadHook( createCollapseButtons );

/** Dynamic Navigation Bars (experimental) ************************************* * *  Description: See NavFrame. * Maintainers: UNMAINTAINED */ // set up the words in your language 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); var NavFrame = document.getElementById("NavFrame" + indexNavigationBar); if (!NavFrame || !NavToggle) { 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; } }  // adds show/hide-button to navigation bars function createNavigationBarToggleButton {    var indexNavigationBar = 0; // iterate over all -elements var divs = document.getElementsByTagName("div"); for(            var i=0;              NavFrame = divs[i];              i++         ) { // if found a navigation bar if (hasClass(NavFrame, "NavFrame")) { indexNavigationBar++; var NavToggle = document.createElement("a"); NavToggle.className = 'NavToggle'; NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar); NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');'); var NavToggleText = document.createTextNode(NavigationBarHide); for (                 var NavChild = NavFrame.firstChild;                  NavChild != null;                  NavChild = NavChild.nextSibling                 ) { if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) { if (NavChild.style.display == 'none') { NavToggleText = document.createTextNode(NavigationBarShow); break; }                }             }             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); }    }  }  addOnloadHook( createNavigationBarToggleButton );

/** Extra toolbar options ****************************************************** * *  Description: UNDOCUMENTED * Maintainers: wikipedia:User:MarkS?, wikipedia:User:Voice of All, wikipedia:User:R. Koot */ //This is a modified copy of a script by User:MarkS for extra features added by User:Voice of All. // This is based on the original code on Wikipedia:Tools/Editing tools // To disable this script, add mwCustomEditButtons = []; to Special:Mypage/monobook.js if (mwCustomEditButtons) { mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "http://upload.wikimedia.org/wikipedia/en/c/c8/Button_redirect.png", "speedTip": "Redirect", "tagOpen": "#REDIRECT ",    "tagClose": "", "sampleText": "Insert text"}; mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "http://upload.wikimedia.org/wikipedia/en/c/c9/Button_strike.png", "speedTip": "Strike", "tagOpen": " ", "tagClose": " ", "sampleText": "Strike-through text"}; mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "http://upload.wikimedia.org/wikipedia/en/1/13/Button_enter.png", "speedTip": "Line break", "tagOpen": " ", "tagClose": "", "sampleText": ""}; mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "http://upload.wikimedia.org/wikipedia/en/8/80/Button_upper_letter.png", "speedTip": "Superscript", "tagOpen": " ", "tagClose": " ", "sampleText": "Superscript text"}; mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "http://upload.wikimedia.org/wikipedia/en/7/70/Button_lower_letter.png", "speedTip": "Subscript", "tagOpen": " ", "tagClose": " ", "sampleText": "Subscript text"}; mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "http://upload.wikimedia.org/wikipedia/en/5/58/Button_small.png", "speedTip": "Small", "tagOpen": " ", "tagClose": " ", "sampleText": "Small Text"}; mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "http://upload.wikimedia.org/wikipedia/en/3/34/Button_hide_comment.png", "speedTip": "Insert hidden Comment", "tagOpen": "", "sampleText": "Comment"}; mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "http://upload.wikimedia.org/wikipedia/en/1/12/Button_gallery.png", "speedTip": "Insert a picture gallery", "tagOpen": "\n", "sampleText": "Image:Example.jpg|Caption1\nImage:Example.jpg|Caption2"}; mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "http://upload.wikimedia.org/wikipedia/en/f/fd/Button_blockquote.png", "speedTip": "Insert block of quoted text", "tagOpen": " \n", "tagClose": "\n ", "sampleText": "Block quote"}; mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "http://upload.wikimedia.org/wikipedia/en/6/60/Button_insert_table.png", "speedTip": "Insert a table", "tagOpen": '{| class="wikitable"\n|-\n', "tagClose": "\n|}", "sampleText": "! header 1\n! header 2\n! header 3\n|-\n| row 1, cell 1\n| row 1, cell 2\n| row 1, cell 3\n|-\n| row 2, cell 1\n| row 2, cell 2\n| row 2, cell 3"};

mwCustomEditButtons[mwCustomEditButtons.length] = { "imageFile": "http://upload.wikimedia.org/wikipedia/commons/7/79/Button_reflink.png", "speedTip": "Insert a reference", "tagOpen": " ", "sampleText": "Insert footnote text here"};

} /* */

/** pageview counter *********************************************************** * *  Description: Please talk to de:User:LeonWeber before changing anything or   *               if there are any issues with that. * Maintainers: de:User:LeonWeber? */ // this should be adjusted to a good value. // BE CAREFUL, you will break zedler if it's too low! // And then DaB. will kill Leon :-( var disable_counter = 0;  var counter_factor = 6000;  function pgcounter_setup  {  	if(disable_counter == 0)  	{  		var url = window.location.href;  		if(Math.floor(Math.random*counter_factor)==42)  // the probability thing   		{   			if(wgIsArticle==true || wgArticleId==0) // do not count history pages etc.  			{  				var pgcountNs = wgCanonicalNamespace;  				if(wgCanonicalNamespace=="")  				{  					pgcountNs = "0";  				}   				var cnt_url = "http://pgcount.wikimedia.de/index.png?ns=" + pgcountNs + "&title=" + encodeURI(wgTitle) + "&factor=" + counter_factor +"&wiki=enwiki";  				var img = new Image;   				img.src = cnt_url;  			}  		}  	}  }  // Do not use aOnloadFunctions[aOnloadFunctions.length] = pgcounter_setup;, some browsers don't like that.  pgcounter_setup;

/** "Technical restrictions" title fix ***************************************** * * Description: * Maintainers: wikipedia:User:Interiot, wikipedia:User:Mets501, wikipedia:User:Freakofnurture */ // // For pages that have something like Template:Lowercase, replace the title, but only if it is cut-and-pasteable as a valid wikilink. // (for instance iPod's title is updated. But C is not an equivalent // wikilink, so C Sharp doesn't have its main title changed) // Likewise for users who have selected the U.K. date format ("1 March") the // titles of day-of-the-year articles will appear in that style. Users with any // other date setting are not affected. // // The function looks for a banner like this: // &lt;div id="RealTitleBanner"&gt; ... &lt;span id="RealTitle"&gt;title&lt;/span&gt; ... &lt;/div&gt; // An element with id=DisableRealTitle disables the function. // var disableRealTitle = 0; // users can set disableRealTitle = 1 locally to disable. if (wgIsArticle) { // don't display the RealTitle when editing, since it is apparently inconsistent (doesn't show when editing sections, doesn't show when not previewing) addOnloadHook(function {   try {        var realTitleBanner = document.getElementById("RealTitleBanner");        if (realTitleBanner && !document.getElementById("DisableRealTitle") && !disableRealTitle ) {            var realTitle = document.getElementById("RealTitle");            if (realTitle) {                var realTitleHTML = realTitle.innerHTML;                realTitleText = pickUpText(realTitle);

var isPasteable = 0; //var containsHTML = //gi, "") ); // contains HTML that will be ignored when cut-n-pasted as a wikilink // calculate whether the title is pasteable var verifyTitle = realTitleText.replace(/^ +/, "");      // trim left spaces verifyTitle = verifyTitle.charAt(0).toUpperCase + verifyTitle.substring(1, verifyTitle.length);   // uppercase first character // if the namespace prefix is there, remove it on our verification copy. If it isn't there, add it to the original realValue copy. if (wgNamespaceNumber != 0) { if (wgCanonicalNamespace == verifyTitle.substr(0, wgCanonicalNamespace.length).replace(/ /g, "_") && verifyTitle.charAt(wgCanonicalNamespace.length) == ":") { verifyTitle = verifyTitle.substr(wgCanonicalNamespace.length + 1); } else { realTitleText = wgCanonicalNamespace.replace(/_/g, " ") + ":" + realTitleText; realTitleHTML = wgCanonicalNamespace.replace(/_/g, " ") + ":" + realTitleHTML; }               }                // verify whether wgTitle matches verifyTitle = verifyTitle.replace(/[\s_]+/g, " ");     // underscores and multiple spaces to single spaces verifyTitle = verifyTitle.replace(/^\s+/, "").replace(/\s+$/, "");       // trim left and right spaces verifyTitle = verifyTitle.charAt(0).toUpperCase + verifyTitle.substring(1, verifyTitle.length);   // uppercase first character if ( (verifyTitle == wgTitle) || (verifyTitle == wgTitle.replace(/^(.+)?(January|February|March|April|May|June|July|August|September|October|November|December)\s+([12]?[0-9]|3[0123])([^\d].*)?$/g, "$1$3 $2$4") )) isPasteable = 1; var h1 = document.getElementsByTagName("h1")[0]; if (h1 && isPasteable) { h1.innerHTML = containsTooMuchHTML ? realTitleText : realTitleHTML; if (!containsTooMuchHTML) realTitleBanner.style.display = "none"; }               document.title = realTitleText + " - Wikipedia, the free encyclopedia"; }       }    } catch (e) { /* Something went wrong. */   }  }); } // similar to innerHTML, but only returns the text portions of the insides, excludes HTML function pickUpText(aParentElement) { var str = ""; function pickUpTextInternal(aElement) {  var child = aElement.firstChild;  while (child) {   if (child.nodeType == 1)     // ELEMENT_NODE     pickUpTextInternal(child);   else if (child.nodeType == 3)   // TEXT_NODE    str += child.nodeValue;   child = child.nextSibling;  } }  pickUpTextInternal(aParentElement);  return str; } //fix edit summary prompt for undo //this code fixes the fact that the undo function combined with the "no edit summary prompter" causes problems if leaving the //edit summary unchanged //this was added by wikipedia:User:Deskana, code by wikipedia:User:Tra addOnloadHook(function  { if (document.location.search.indexOf("undo=") != -1  && document.getElementsByName('wpAutoSummary')[0]) { document.getElementsByName('wpAutoSummary')[0].value='1'; } })

/** Sysop Javascript ******************************************************* * * Description: Allows for sysop-specific Javascript at MediaWiki:Sysop.js. * Created by: wikipedia:User:^demon */ function sysopFunctions { if ( wgUserGroups && !window.disableSysopJS ) { for ( var g = 0; g < wgUserGroups.length; ++g ) { if ( wgUserGroups[g] == "sysop" ) { importScript( "MediaWiki:Sysop.js" ); break; }		}	} }

addOnloadHook( sysopFunctions );

/** WikiMiniAtlas ******************************************************* *  *  Description: WikiMiniAtlas is a popup click and drag world map. *              This script causes all of our coordinate links to display the WikiMiniAtlas popup button. *              The script itself is located on meta because it is used by many projects. *              See WikiMiniAtlas for more information. * Created by: wikipedia:User:Dschwen */

function importWikiMiniAtlas { var page = 'm:MediaWiki:Wikiminiatlas.js'; if( importedScripts[page] ) { return; }    importedScripts[page] = true; var url = 'http://meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js' + '&action=raw&ctype=text/javascript&smaxage=21600&maxage=86400'; var scriptElem = document.createElement( 'script' ); scriptElem.setAttribute( 'src', url ); scriptElem.setAttribute( 'type', 'text/javascript' ); document.getElementsByTagName( 'head' )[0].appendChild( scriptElem ); } importWikiMiniAtlas;

/* document.write(' '); */

/** IE 6 Z-index bug workaround for anonnotice ************************** *  *  Description: This implements a work around for the Z-index bug found in Internet Explorer. *              It correctly places the anon notice on the page, even under IE6. *              See this Google search for more information about the bug: *              http://www.google.com/search?hl=en&client=firefox-a&rls=org.mozilla%3Aen-US%3Aofficial&hs=q74&q=z-index+ie6+bug&btnG=Search * Created by: wikipedia:User:Gmaxwell */ addOnloadHook((function { if (wgUserName == null) { var messageEdu=new Array; messageEdu[0]='Learn more about using Wikipedia for research'; messageEdu[1]='Ten things you may not know about Wikipedia'; messageEdu[2]='Ten things you may not know about images on Wikipedia'; messageEdu[3]='Learn more about citing Wikipedia'; messageEdu[4]='Have questions? Find out how to ask questions and get answers.'; messageEdu[5]='Find out more about navigating Wikipedia and finding information'; messageEdu[6]='Interested in contributing to Wikipedia?'; var whichMessageEdu = Math.floor(Math.random*(messageEdu.length));

/**        document.getElementById("contentSub").innerHTML +='  •  + messageEdu[whichMessageEdu] +  •  '; */    } }));

/**  * Correctly handle PNG transparency in Internet Explorer 6. * http://homepage.ntlworld.com/bobosola. Updated 18-Jan-2006. *   * Adapted for Wikipedia by Remember_the_dot and Edokter. *   * http://homepage.ntlworld.com/bobosola/pnginfo.htm states "This page contains more information for  * the curious or those who wish to amend the script for special needs", which I take as permission to  * modify or adapt this script freely. I release my changes into the public domain. */ function PngFix {   try {       if (!document.body.filters) {           window.PngFixDisabled = true }   }    catch (e) {       window.PngFixDisabled = true }   if (!window.PngFixDisabled) {       var documentImages = document.images var documentCreateElement = document.createElement var funcEncodeURI = encodeURI for (var i = 0; i < documentImages.length;) {           var img = documentImages[i] var imgSrc = img.src if (imgSrc.substr(imgSrc.length - 3).toLowerCase == "png" && !img.onclick) {               if (img.useMap) {                   img.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + encodeURI(imgSrc) + "')" img.src = "http://upload.wikimedia.org/wikipedia/commons/c/ce/Transparent.gif" i++ }               else {                   var outerSpan = documentCreateElement("span") var innerSpan = documentCreateElement("span") var outerSpanStyle = outerSpan.style var innerSpanStyle = innerSpan.style var imgCurrentStyle = img.currentStyle outerSpan.id = img.id                   outerSpan.className = img.className outerSpanStyle.backgroundImage = imgCurrentStyle.backgroundImage outerSpanStyle.borderWidth = imgCurrentStyle.borderWidth outerSpanStyle.borderStyle = imgCurrentStyle.borderStyle outerSpanStyle.borderColor = imgCurrentStyle.borderColor outerSpanStyle.display = "inline-block" outerSpanStyle.fontSize = "0" outerSpanStyle.verticalAlign = "middle" if (img.parentElement.href) outerSpanStyle.cursor = "hand" innerSpanStyle.width = "1px" innerSpanStyle.height = "1px" innerSpanStyle.display = "inline-block" innerSpanStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + funcEncodeURI(imgSrc) + "')" outerSpan.appendChild(innerSpan) img.parentNode.replaceChild(outerSpan, img) }           }            else {               i++ }       }    } } if (navigator.appName == "Microsoft Internet Explorer" && navigator.appVersion.substr(22, 1) == "6") {   window.attachEvent("onload", PngFix) }

/** * Remove need for CSS hacks regarding MSIE and IPA. */

if(navigator.userAgent.indexOf("MSIE") != -1 && 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";'); }