MediaWiki:Common.js

From Wikispecies
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/* Test if an element has a certain class *************************************
*
* Description: Uses regular expressions and caching for better performance.
* Maintainers: [[en:User:Mike Dillon]], [[en:User:R. Koot]], [[en: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);
  };
})();

/** Collapsible tables ********************************************************
*
*  Description: Allows tables to be collapsed, showing only the header. See
*               [[Wikipedia:NavFrame]].
*  Maintainers: [[en: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 = {};
  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);
    }
  }
}

$(createCollapseButtons);

/** Main Page layout fixes ****************************************************
*
*  Description:  Various layout fixes for the main page, including an
*                additional link to the complete list of languages available
*                and the renaming of the 'Article' to to 'Main Page'.
*  Maintainers:  [[User:AzaToth]], [[User:R. Koot]], [[User:Alex Smotrov]]
*/

if(mw.config.get('wgIsMainPage')) {
  $(mainPageAppendCompleteListLink);
}

function mainPageAppendCompleteListLink() {
  mw.util.addPortletLink('p-lang', '//meta.wikimedia.org/wiki/List_of_Wikipedias',
  'Complete list', 'interwiki-completelist', 'Complete list of Wikipedias');
}

/** pageview counter **********************************************************
*
*  Description: Please talk to de:User:LeonWeber before changing anything or
*               if there are any issues with that.
*  Maintainers: [[:de:User:LeonWeber]]?
*/

/** "Technical restrictions" title fix ****************************************
*
* Description:
* Maintainers: en:User:Interiot, en:User:Mets501, en: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(mw.config.get('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)
  $(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 = /</.test(realTitleHTML);    // contains ANY HTML
          var containsTooMuchHTML = /</.test(realTitleHTML.replace(/<\/?(sub|sup|small|big)>/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(mw.config.get('wgNamespaceNumber') != 0) {
            if(mw.config.get('wgCanonicalNamespace') == verifyTitle.substr(0, mw.config.get('wgCanonicalNamespace').length).replace(/ /g, "_") && verifyTitle.charAt(mw.config.get('wgCanonicalNamespace').length) == ":") {
              verifyTitle = verifyTitle.substr(mw.config.get('wgCanonicalNamespace').length + 1);
            } else {
              realTitleText = mw.config.get('wgCanonicalNamespace').replace(/_/g, " ") + ":" + realTitleText;
              realTitleHTML = mw.config.get('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 == mw.config.get('wgTitle')) || (verifyTitle == mw.config.get('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 [[User:Deskana]], code by [[User:Tra]]
$(function()
{
  if(document.location.search.indexOf("undo=") != -1
      && document.getElementsByName('wpAutoSummary')[0]) {
    document.getElementsByName('wpAutoSummary')[0].value='1';
  }
});

/** Add dismiss button to watchlist-message ***********************************
*
*  Description: Hide the watchlist message for one week.
*  Maintainers: [[en:User:Ruud Koot]]
*/

function addDismissButton()
{
  var watchlistMessage = document.getElementById("watchlist-message");
  if(watchlistMessage == null) return;
  var watchlistCookieID = watchlistMessage.className.replace(/cookie\-ID\_/ig,'');

  if(document.cookie.indexOf("hidewatchlistmessage-" + watchlistCookieID + "=yes") != -1) {
    watchlistMessage.style.display = "none";
  }

  var Button     = document.createElement("span");
  var ButtonLink = document.createElement("a");
  var ButtonText = document.createTextNode("dismiss");

  ButtonLink.setAttribute("id", "dismissButton");
  ButtonLink.setAttribute("href", "javascript:dismissWatchlistMessage();");
  ButtonLink.setAttribute("title", "Hide this message for one week");
  ButtonLink.appendChild(ButtonText);

  Button.appendChild(document.createTextNode("["));
  Button.appendChild(ButtonLink);
  Button.appendChild(document.createTextNode("]"));

  watchlistMessage.appendChild(Button);
}

function dismissWatchlistMessage()
{
  var e = new Date();
  e.setTime(e.getTime() + (7*24*60*60*1000));
  var watchlistMessage = document.getElementById("watchlist-message");
  var watchlistCookieID = watchlistMessage.className.replace(/cookie\-ID\_/ig,'');
  document.cookie = "hidewatchlistmessage-" + watchlistCookieID + "=yes; expires=" + e.toGMTString() + "; path=/";
  watchlistMessage.style.display = "none";
}

$(addDismissButton);

/** Geo-targeted watchlist notice *********************************************
*
*  Description: Allows for geographic targeting of watchlist notices. See [[Wikipedia:Geonotice]] for more information.
*  Created by: [[en:User:Gmaxwell]]
*  if(mw.config.get('wgPageName') == "Special:Watchlist")
*  $((function(){document.write('<script type="text/javascript" src="http://tools.wikimedia.de/~gmaxwell/cgi-bin/geonotice.py"><\/script>')}));
*/


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

if(navigator.userAgent.indexOf("MSIE") != -1 && document.createStyleSheet) {
  mw.util.addCSS('.IPA { font-family: "Doulos SIL", "Charis SIL", Gentium, "DejaVu Sans", Code2000, "TITUS Cyberbit Basic", "Arial Unicode MS", "Lucida Sans Unicode", "Chrysanthi Unicode"; }');
}