MediaWiki:Common.js
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);