MediaWiki:Common.js: Difference between revisions

Jump to navigation Jump to search
Updating code for new standards, fix deprecations, fix JS errors with latest mediawiki
(Testing google analytics)
(Updating code for new standards, fix deprecations, fix JS errors with latest mediawiki)
Line 1: Line 1:
// <pre><nowiki>
//<source lang="javascript">
//<source lang="javascript">
   
   
/* Import more specific scripts if necessary */
/**
  * WikiMiniAtlas is a popup click and drag world map.
if (wgAction == "edit" || wgAction == "submit" || wgPageName == "Special:Upload") //scripts specific to editing pages
* See [[meta:WikiMiniAtlas]] for more information.
{
* Maintainers: [[w:User:Dschwen]]
    importScript("MediaWiki:Common.js/edit.js")
*/
}
mw.loader.load('//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript');
else if (wgPageName == "Special:Watchlist") //watchlist scripts
{
    importScript("MediaWiki:Common.js/watchlist.js")
}
else if (wgPageName == "Special:Search") //scripts specific to Special:Search
{
    importScript("MediaWiki:Common.js/search.js")
}
/** Sysop Javascript *******************************************************
  *
  *  Description: Allows for sysop-specific Javascript at [[MediaWiki:Sysop.js]].
  */
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 [[Meta:WikiMiniAtlas]] for more information.  
  * Maintainers: [[User:Dschwen]]
  */
if (wgServer == "https://secure.wikimedia.org") {
  var metaBase = "https://secure.wikimedia.org/wikipedia/meta";
} else {
  var metaBase = "http://meta.wikimedia.org";
}
importScriptURI(metaBase+"/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript&smaxage=21600&maxage=86400")
   
   
/* Scripts specific to Internet Explorer */
/* Scripts specific to Internet Explorer */
   
   
if (navigator.appName == "Microsoft Internet Explorer")
if (navigator.appName == "Microsoft Internet Explorer") {
{
    /** Internet Explorer bug fix **************************************************
    *
    *  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.
     * Remove need for CSS hacks regarding MSIE and IPA.
     */
     */
     if (document.createStyleSheet) {
     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";');
         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")
     }
     }
}
}
   
   
/* Test if an element has a certain class **************************************
/* Test if an element has a certain class **************************************
Line 113: Line 31:
     };
     };
})();
})();
/** Interwiki links to featured articles ***************************************
*
*  Description: Highlights interwiki links to featured articles (or
*              equivalents) by changing the bullet before the interwiki link
*              into a star.
*  Maintainers: [[User:R. Koot]]
*/
function LinkFA()
{
    if ( document.getElementById( "p-lang" ) ) {
        var InterwikiLinks = document.getElementById( "p-lang" ).getElementsByTagName( "li" );
        for ( var i = 0; i < InterwikiLinks.length; i++ ) {
            if ( document.getElementById( InterwikiLinks[i].className + "-fa" ) ) {
                InterwikiLinks[i].className += " FA"
                InterwikiLinks[i].title = "This is a featured article in another language.";
            }
        }
    }
}
addOnloadHook( LinkFA );
   
   
   
   
Line 148: Line 41:
   
   
var autoCollapse = 2;
var autoCollapse = 2;
var collapseCaption = "hide";
var collapseCaption = "Collapse";
var expandCaption = "show";
var expandCaption = "Expand";
   
   
function collapseTable( tableIndex )
function collapseTable( tableIndex )
Line 196: Line 89:
             var ButtonLink = document.createElement( "a" );
             var ButtonLink = document.createElement( "a" );
             var ButtonText = document.createTextNode( collapseCaption );
             var ButtonText = document.createTextNode( collapseCaption );
            Button.style.styleFloat = "right";    //
            Button.style.cssFloat = "right";      // REMOVE THESE LINES
            Button.style.fontWeight = "normal";  // ON 10 FEBRUARY 2009
            Button.style.textAlign = "right";    //
            Button.style.width = "6em";          //
   
   
             Button.className = "collapseButton";  //Styles are declared in Common.css
             Button.className = "collapseButton";  //Styles are declared in Common.css
Line 222: Line 109:
         if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) {
         if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) {
             collapseTable( i );
             collapseTable( i );
         }  
         }
         else if ( hasClass( NavigationBoxes[i], "innercollapse" ) ) {
         else if ( hasClass( NavigationBoxes[i], "innercollapse" ) ) {
             var element = NavigationBoxes[i];
             var element = NavigationBoxes[i];
Line 235: Line 122:
}
}
   
   
addOnloadHook( createCollapseButtons );
$( createCollapseButtons );
 
 
 
 
 
/** Proper(?) collapsible text **********************************************************/
 
function doExpandText(textIndex)
{
    var Button=document.getElementById("pcsx2_collapsibleButton"+textIndex);
    if (!Button) return false;
    var TextFull=document.getElementById("pcsx2_collapsibleTextFull"+textIndex);
    if (!TextFull) return false;
    Button.style.display="none";
    TextFull.style.display="";
}
 
function createCollapseTextButtons()
{
    var MyClasses=document.getElementsByClassName("pcsx2_collapsible_text");
    var textIndex=0;
    var str="";
 
    for (var i=0;i<MyClasses.length;i++) {
        str=MyClasses[i].innerHTML;
        MyClasses[i].innerHTML=str.replace(/(<p>|<\/p>|<br>|<br\/>|<br \/>)/gmi,"");
 
        //should contain two spans: pcsx2_collapsible_text_part and pcsx2_collapsible_text_full
        var TextPart=MyClasses[i].getElementsByClassName("pcsx2_collapsible_text_part")[0];
        if (!TextPart) continue;
        var TextFull=MyClasses[i].getElementsByClassName("pcsx2_collapsible_text_full")[0];
        if (!TextFull) continue;
        //creating href
        var Button=document.createElement("span");
        var ButtonLink=document.createElement("a");
        var ButtonText=document.createTextNode("...");
        Button.style.fontWeight="bold";
        Button.style.fontSize="smaller";
        Button.setAttribute("id","pcsx2_collapsibleButton"+textIndex);
        ButtonLink.setAttribute("href","javascript:doExpandText("+textIndex+");");
        ButtonLink.setAttribute("title","Expand this text...");
        ButtonLink.appendChild(ButtonText);
        Button.appendChild(document.createTextNode(" ("));
        Button.appendChild(ButtonLink);
        Button.appendChild(document.createTextNode(")"));
        TextFull.setAttribute("id","pcsx2_collapsibleTextFull"+textIndex);
        TextFull.style.display="none";
        TextPart.appendChild(Button);
        textIndex++;
    }
}
   
   
addOnloadHook(createCollapseTextButtons);
   
   
/** Dynamic Navigation Bars (experimental) *************************************
/** Dynamic Navigation Bars (experimental) *************************************
  *
  *
Line 347: Line 177:
{
{
     var indexNavigationBar = 0;
     var indexNavigationBar = 0;
     // 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++) {
     for (var i = 0; NavFrame = divs[i]; i++) {
Line 395: Line 225:
}
}
   
   
addOnloadHook( createNavigationBarToggleButton );
$( createNavigationBarToggleButton );
 
/** "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>
*  Maintainers: Remember_the_dot
*/
if (mw.config.get('wgIsArticle')) //prevents the "Editing " prefix from disappearing during preview
{
    $(function()
    {
        var realTitle = document.getElementById("RealTitle")
        if (realTitle)
        {
            //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 || mw.config.get('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[0].toUpperCase() + normalizedRealTitle.substring(1)
                normalizedPageTitle = mw.config.get('wgPageName')[0].toUpperCase() + mw.config.get('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[0].toUpperCase() + normalizedRealPageTitle.substring(1)
                normalizedPageTitle = mw.config.get('wgPageName').substring(0, mw.config.get('wgPageName').indexOf(":") + 1).toLowerCase() + mw.config.get('wgPageName').substring(mw.config.get('wgPageName').indexOf(":") + 1)
            }
   
   
/** Table sorting fixes ************************************************
            if (normalizedRealTitle == normalizedPageTitle) //normalized titles match, so we can do full replacement
  *
            {
  *  Description: Disables code in table sorting routine to set classes on even/odd rows
                var h1 = document.getElementsByTagName("h1")[0]
  *  Maintainers: [[User:Random832]]
  */
   
   
ts_alternate_row_colors = false;
                //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")
                if (realTitleBanner) realTitleBanner.parentNode.removeChild(realTitleBanner)
            }
   
   
            //no matter what, correct the page title
            document.title = realTitleText + " - Wikipedia Mìng-dĕ̤ng-ngṳ̄ - Cê̤ṳ-iù gì Báik-kuŏ-ciòng-cṳ̆"
        }
    })
}
   
   
/**
* uploadwizard_newusers
*
* Switches in a message for non-autoconfirmed users at [[Wikipedia:Upload]]
*
* Maintainers: [[User:Krimpet]]
*/
function uploadwizard_newusers() {
  if (mw.config.get('wgNamespaceNumber') == 4 && mw.config.get('wgTitle') == "Upload" && mw.config.get('wgAction') == "view") {
    var oldDiv = document.getElementById("autoconfirmedusers"),
        newDiv = document.getElementById("newusers");
    if (oldDiv && newDiv) {
      if (typeof mw.config.get('wgUserGroups') == "object" && mw.config.get('wgUserGroups')) {
        for (i = 0; i < mw.config.get('wgUserGroups').length; i++) {
          if (mw.config.get('wgUserGroups')[i] == "autoconfirmed") {
            oldDiv.style.display = "block";
            newDiv.style.display = "none";
            return;
          }
        }
      }
      oldDiv.style.display = "none";
      newDiv.style.display = "block";
      return;
    }
  }
}
$(uploadwizard_newusers);
   
   
/** Disambig editintro ********************************************************
/**
* Disambig editintro
  *
  *
  * Description: Adds an editintro on disambiguation pages. Original code
  * Description: Adds an editintro on disambiguation pages. Original code
  * located at [[User:RockMFR/disambigeditintro.js]].
  * located at [[User:RockMFR/disambigeditintro.js]].
  *
  *
  * Maintainers: [[User:RockMFR]], [[User:Quiddity]]
  * Maintainers: [[User:RockMFR]], [[User:Quiddity]]
  */
  */
   
   
if (wgNamespaceNumber == 0) addOnloadHook(function(){
if (mw.config.get('wgNamespaceNumber') == 0) $(function(){
  if (!document.getElementById('disambig')) return
  if (!document.getElementById('disambig')) return
  var el = document.getElementById('ca-edit')
  var el = document.getElementById('ca-edit')
Line 424: Line 360:
  if (el) el.href += '&editintro=Template:Disambig_editintro'
  if (el) el.href += '&editintro=Template:Disambig_editintro'
})
})
/** Mobile browser helper link ************************************************
*
*  Adds a link to the mobile-optimized gateway at en.m.wikimedia.org
*  for viewers on iPhone, iPod Touch, and Android devices.
*  This is semi-experimental to drive more test traffic there for now;
*  it's still in development but very usable for reading!
*
*  Currently set to always show the link on main page and search results,
*  and w/ 25% probability on other page views.
*
*  Maintainer: [[User:Brion VIBBER]]
*/
if (/(Android|iPhone|iPod)/.test(navigator.userAgent)) {
  $(function() {
    var prob = 1.0;
    if (mw.config.get('wgCanonicalNamespace') == 'Special' && mw.config.get('wgCanonicalSpecialPageName') == 'Search') {
      var pageLink = '?search=' + encodeURIComponent(document.getElementById('searchText').value);
    } else if (mw.config.get('wgPageName') == 'Main_Page') {
      var pageLink = '::Home'; // Special case
    } else {
      var pageLink = encodeURIComponent(mw.config.get('wgPageName')).replace('%2F','/').replace('%3A',':');
      prob = 0.25;
    }
    if (prob < Math.random()) return;
    var div = document.createElement('div');
    div.style.fontSize = '30pt';
    div.style.lineHeight = '40pt';
    div.style.textAlign = 'center';
    div.style.marginTop = '20px';
    div.style.marginBottom = '20px';
    div.style.padding = '20px';
    div.style.border = '2px solid gray';
    div.appendChild(document.createTextNode("View this page in "));
    var link = document.createElement('a');
    link.href = 'http://en.m.wikipedia.org/wiki/' + pageLink;
    link.appendChild(document.createTextNode("Wikipedia's mobile site"));
    div.appendChild(link);
    var content=document.getElementById('content');
    content.insertBefore(div,content.firstChild);
  });
}
/**
* Interwiki links to featured articles
*
* Description: Highlights interwiki links to featured articles (or
*              equivalents) by changing the bullet before the interwiki link
*              into a star.
* Maintainers: [[User:R. Koot]]
*/
function LinkFA(){
var pLang = document.getElementById('p-lang')
if (!pLang) return
var list = {
'fa':'This is a featured article in another language',
'ga':'This is a good article in another language'}
var iw = pLang.getElementsByTagName('li')
for (var i=0; i<iw.length; i++)
  for (var s in list)
    if (document.getElementById(iw[i].className+'-'+s)){
      iw[i].className += ' ' + s.toUpperCase()
      iw[i].title = list[s] + ' in another language'
    }
}
$( LinkFA );
// Results from Wikidata
// [[File:Wdsearch_script_screenshot.png]]
if ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Search' ||  ( mw.config.get( 'wgArticleId' ) === 0 && mw.config.get( 'wgCanonicalSpecialPageName' ) === false ) ) {
mw.loader.load( '//en.wikipedia.org/w/index.php?title=MediaWiki:Wdsearch.js&action=raw&ctype=text/javascript' );
}


  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
/**
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
* WikiMiniAtlas
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
*
  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
* Description: WikiMiniAtlas is a popup click and drag world map.
 
*              This script causes all of our coordinate links to display the WikiMiniAtlas popup button.
  ga('create', 'UA-102999763-1', 'auto');
*              The script itself is located on meta because it is used by many projects.
  ga('send', 'pageview');
*              See [[Meta:WikiMiniAtlas]] for more information.
 
* Maintainers: [[User:Dschwen]]
*/
( function () {
    var require_wikiminiatlas = false;
    var coord_filter = /geohack/;
    $( function () {
        $( 'a.external.text' ).each( function( key, link ) {
            if ( link.href && coord_filter.exec( link.href ) ) {
                require_wikiminiatlas = true;
                // break from loop
                return false;
            }
        } );
        if ( $( 'div.kmldata' ).length ) {
            require_wikiminiatlas = true;
        }
        if ( require_wikiminiatlas ) {
            mw.loader.load( '//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript' );
        }
    } );
} )();


//</source>
   
   
//</source>
// </nowiki></pre>
// </nowiki></pre>

Navigation menu