MediaWiki:Common.js

Minn Wikizzjunarju

Nota: Wara li salvajt il-modifiki tiegħek, jista' jkun li jkun hemm bżonn li tħassar il-cache tal-browżer tiegħek sabiex tara t-tibdil li sar.

  • Firefox / Safari: żomm il-buttuna Shift waqt li tagħfas fuq Reload, jew agħfas Ctrl-F5 jew Ctrl-R (⌘-R fuq Mac)
  • Google Chrome: agħfas Ctrl-Shift-R (⌘-Shift-R fuq Mac)
  • Internet Explorer: żomm il-buttuna Ctrl waqt li tagħfas Refresh, jew agħfas Ctrl-F5
  • Opera: ħassar il-cache fuq Tools → Preferences
/* Any JavaScript here will be loaded for all users on every page load. */


/*</pre>
=== DOM creation ===
<pre>*/
/**
 * Create a new DOM node for the current document.
 *    Basic usage:  var mySpan = newNode('span', "Hello World!")
 *    Supports attributes and event handlers*: var mySpan = newNode('span', {style:"color: red", focus: function(){alert(this)}, id:"hello"}, "World, Hello!")
 *    Also allows nesting to create trees: var myPar = newNode('p', newNode('b',{style:"color: blue"},"Hello"), mySpan)
 *
 * *event handlers, there are some issues with IE6 not registering event handlers on some nodes that are not yet attached to the DOM,
 * it may be safer to add event handlers later manually.
**/
function newNode(tagname){

  var node = document.createElement(tagname);
  
  for( var i=1;i<arguments.length;i++ ){
    
    if(typeof arguments[i] == 'string'){ //Text
      node.appendChild( document.createTextNode(arguments[i]) );
      
    }else if(typeof arguments[i] == 'object'){ 
      
      if(arguments[i].nodeName){ //If it is a DOM Node
        node.appendChild(arguments[i]);
        
      }else{ //Attributes (hopefully)
        for(var j in arguments[i]){
          if(j == 'class'){ //Classname different because...
            node.className = arguments[i][j];
            
          }else if(j == 'style'){ //Style is special
            node.style.cssText = arguments[i][j];
            
          }else if(typeof arguments[i][j] == 'function'){ //Basic event handlers
            try{ node.addEventListener(j,arguments[i][j],false); //W3C
            }catch(e){try{ node.attachEvent('on'+j,arguments[i][j],"Language"); //MSIE
            }catch(e){ node['on'+j]=arguments[i][j]; }}; //Legacy
          
          }else{
            node.setAttribute(j,arguments[i][j]); //Normal attributes

          }
        }
      }
    }
  }
  
  return node;
}


/*</pre>
==Wiktionary Customisation==
<pre>*/

//initialize the storage for script options. Gadgets that set script
//options should also include this line as they are loaded before us.
if(typeof WiktScriptPrefs == 'undefined') WiktScriptPrefs = {};

/*</pre>
===Edit page javascript===
<pre>*/
if (mw.config.get('wgAction') == 'edit' || mw.config.get('wgAction') == 'submit' ) importScript('MediaWiki:Edit.js')

$( function () { 
    if (document.getElementById('editpage-specialchars'))
        importScript('MediaWiki:Edit.js');
});
/*</pre>

==URL Fixes==
<pre>*/

/**
 * doRedirect will redirect if a did you mean box is found, and create a 
 * "redirected from X" if a rdfrom is passed in the get parameters
 * The first half is an ugly workaround for Bugzilla:3339, :(
 * The second half is an ugly workaround for not having serverware support :(
**/

/*</pre>
===Did you mean ____ redirects===
<pre>*/

function doRedirect() {
  var dym = document.getElementById('did-you-mean')
  var wiktDYMfrom= decodeURIComponent(location.href.replace(/^(.+[&\?]rdfrom=([^&]+).*|.*)?$/,"$2"));

// REDIRECTED FROM
  if( location.href.indexOf('rdfrom=')!=-1 ) {
    var insertPosition= document.getElementById("siteSub");
    var div=document.createElement("div");
    if(insertPosition){
      div.setAttribute("id", "contentSub");
      var tt = document.createElement('tt');
      var lnk = document.createElement('a');
      lnk.setAttribute("href", mw.config.get('wgArticlePath').replace('$1', wiktDYMfrom) + '?redirect=no');
      lnk.className = "new"; // As they are redlinks
      lnk.appendChild(document.createTextNode(wiktDYMfrom));
      tt.appendChild(lnk);
      div.appendChild(document.createTextNode("(Auto-redirected from "));
      div.appendChild(tt);
      div.appendChild(document.createTextNode(")"));
      insertPosition.parentNode.insertBefore(div,insertPosition.nextSibling);
      } else {
        alert('No insertposition');
      }

// DID YOU MEAN
    }else{
      if( dym 
          && !location.href.match(/[&\?]redirect=no/)
          && ($.cookie('WiktionaryDisableAutoRedirect') != 'true')
        ) {
      var target = dym.firstChild.title;
      var pagetitle = document.getElementsByTagName('h1')[0].firstChild.nodeValue;

      if( pagetitle != target 
          && wgArticleId == 0
          && pagetitle.search(/Editing /g) == -1
          && !(document.getElementById('contentSub') && document.getElementById('contentSub').innerHTML.indexOf("Redirected from")>=0) // does contentSub always exist
        ) {
        window.location = mw.config.get('wgArticlePath').replace('$1', encodeURIComponent(target.replace(/\ /g, "_")))
                          + '?rdfrom=' + encodeURIComponent(pagetitle.replace(/ /g,"_"));
      }
    }
  }
}

$(doRedirect);

/*</pre>

===Fix Wikified section titles===
<pre>*/
$(function () {
  // {temp|template}
  if (/\.7B\.7Btemp\.7C(.*?)\.7D\.7D/.test(window.location.href)) {
    var url=window.location.href.replace(/\.7B\.7Btemp.7C/g, ".7B.7B");
    window.location = url;
  }
});

$(function () {
  if(mw.config.get('wgAction') != 'edit')
    return;
  if(! /[?&]section=\d/.test(window.location.href))
    return;
  var wpSummary = document.getElementById('wpSummary');
  if(! wpSummary)
    return;
  if(wpSummary.value.substr(0, 3) != '/* ')
    return;
  if(wpSummary.value.substr(wpSummary.value.length - 4) != ' */ ')
    return;
  wpSummary.value = wpSummary.value.replace(/\{\{temp(late)?\|/g, '{{');
});

/*</pre>
==Dynamic Navigation Bars (experimental)==
<pre>*/

 // ============================================================
 // BEGIN Dynamic Navigation Bars (experimental)
 // FIXME: currently only works for one nav bar on a page at a time
 
 // set up the words in your language
 var NavigationBarHide = 'hide ▲';
 var NavigationBarShow = 'show ▼';
 
 // set up max count of Navigation Bars on page,
 // if there are more, all will be hidden
 // NavigationBarShowDefault = 0; // all bars will be hidden
 // NavigationBarShowDefault = 1; // on pages with more than 1 bar all bars will be hidden
 var NavigationBarShowDefault = 1;
 if ( mw.config.get('wgNamespaceNumber') == 0 ) NavigationBarShowDefault = 999 ;
  
/*</pre>
===toggleNavigationBar===
<pre>*/

 // 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.isHidden == false) {
        for (
                var NavChild = NavFrame.firstChild;
                NavChild;
                NavChild = NavChild.nextSibling
            ) {
            if (NavChild.className == 'NavPic') {
                NavChild.style.display = 'none';
            }
            if (NavChild.className == 'NavContent') {
                NavChild.style.display = 'none';
            }
        }
    NavToggle.childNodes[1].firstChild.nodeValue = NavigationBarShow;
    NavToggle.isHidden = true;
 
    // if hidden now
    } else if (NavToggle.isHidden == true) {
        for (
                var NavChild = NavFrame.firstChild;
                NavChild;
                NavChild = NavChild.nextSibling
            ) {
            if (NavChild.className == 'NavPic') {
                NavChild.style.display = 'block';
            }
            if (NavChild.className == 'NavContent') {
                NavChild.style.display = 'block';
            }
        }
    NavToggle.childNodes[1].firstChild.nodeValue = NavigationBarHide;
    NavToggle.isHidden = false;
    }
 }
 
/*</pre>
===createNavigationBarToggleButton===
<pre>*/

 var wgNavBarArray = new Array();

 // adds show/hide-button to navigation bars
 function createNavigationBarToggleButton()
 {
    // Are we previewing an translation section?
    var preview = document.getElementById('wikiPreview');

    if (preview != null) {
      var p = preview.getElementsByTagName('p');
      if (p != null && p.length >= 2 && p[1].firstChild.id == 'Translations') {
        NavigationBarShowDefault = 999;
      }
    }

    var indexNavigationBar = 0;
    // iterate over all < div >-elements
    for(
            var i=0; 
            NavFrame = document.getElementsByTagName("div")[i]; 
            i++
        ) {
        // if found a navigation bar
        // (Note that a navigation bar is a div whose *sole* class is
        // "NavFrame". That might not be the best approach, but currently
        // {{trans-see}} exploits it, so be cautious in changing that.)
        if (NavFrame.className == "NavFrame") {
 
            indexNavigationBar++;
            var NavToggle = document.createElement("span");
            NavToggle.className = 'NavToggle';
            NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
            
            NavToggle.appendChild(document.createTextNode('['));
            NavToggle.appendChild(document.createElement("a"));
            var NavToggleText = document.createTextNode(NavigationBarHide);
            // These need an href, but must do nothing
            NavToggle.childNodes[1].setAttribute('href', 'javascript:(function(){})()');
            NavToggle.childNodes[1].appendChild(NavToggleText);
            NavToggle.appendChild(document.createTextNode(']'));
            NavToggle.isHidden = false;

            wgNavBarArray[indexNavigationBar - 1] = NavToggle;

            // 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 (NavFrame.childNodes[j].className == "NavHead") {
                var NavHead = NavFrame.childNodes[j];
                for (var k=0; k < NavHead.childNodes.length; k++) {
                  if (NavHead.childNodes[k].nodeType == 1) { 
                    NavHead.childNodes[k].onclick = function (e) {
                      if (e) {
                        e.stopPropagation ()
                      } else {
                        window.event.cancelBubble = true;
                      }
                    }
                  }
                }
                NavHead.style.cursor = "pointer";
                NavHead.onclick = (function (i) { return function () { toggleNavigationBar(i); } })(indexNavigationBar)
                if( NavHead.childNodes[0] ){
                  NavHead.insertBefore(NavToggle,NavHead.childNodes[0]);
                }else{
                  NavHead.appendChild(NavToggle);
                }
              }
            }
            NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
        }
    }
    // if more Navigation Bars found than Default: hide all
    if (NavigationBarShowDefault < indexNavigationBar) {
        for(
                var i=1; 
                i<=indexNavigationBar; 
                i++
        ) {
            toggleNavigationBar(i);
        }
    }
 
 }
 
 $(createNavigationBarToggleButton);
 
 // END Dynamic Navigation Bars
 // ============================================================

/*</pre>
== Interproject links ==
<pre>*/

/*
#########
### ProjectLinks
###  by [[user:Pathoschild]] (idea from an older, uncredited script)
###    * generates a sidebar list of links to other projects from {{projectlinks}}
#########
*/
function Projectlinks() {
        var elements = new Array();
        var spans = document.getElementsByTagName('span');
        
        // filter for projectlinks
        for (var i=0, j=0; i<spans.length; i++) {
                if (spans[i].className == 'interProject') {
                        elements[j] = spans[i].getElementsByTagName('a')[0];
                        j++;
                }
        }

        if (j == 0)
            return;
        
        // sort alphabetically
        function sortbylabel(a,b) {
                // get labels
                a = a.innerHTML.replace(/^.*<a[^>]*>(.*)<\/a>.*$/i,'$1');
                b = b.innerHTML.replace(/^.*<a[^>]*>(.*)<\/a>.*$/i,'$1');

                // return sort order
                if (a < b) return -1;
                if (a > b) return 1;
                return 0;
        }
        elements.sort(sortbylabel);
        
        // Create the list of project links
        var pllist = newNode('ul');
        for (var i=0; i<elements.length; i++) {
                pllist.appendChild(newNode('li', elements[i]));
        }
        var projectBox = newNode('div', {'class': 'portlet portal', id: 'p-projects'}, 
            newNode('h5', 'In other projects'),
            newNode('div', {'class': 'pBody body'}, pllist)
        );

        var insert = document.getElementById('p-tb');
        if (!insert)
            return;

        if (insert.nextSibling)
            insert.parentNode.insertBefore(projectBox, insert.nextSibling);
        else
            insert.parentNode.appendChild(projectBox);
}

$(Projectlinks);