Merge:Common js

/\* Test if an element has a certain class \*/

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 \*/

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 );

/\* Auto updating recent changes opt-in

```
* See w:c:dev:AjaxRC for info & attribution
*/

```

AjaxRCRefreshText = 'Auto-refresh';
AjaxRCRefreshHoverText = 'Automatically refresh the page';
ajaxPages = ["Special:RecentChanges","Special:WikiActivity"];
importScriptPage('AjaxRC/code.js', 'dev');

/\* Adds "purge" option to page controls

```
* See w:c:dev:PurgeButton for info & attribution
*/

```

importScriptPage('PurgeButton/code.js', 'dev');

/\* DisableArchiveEdit

```
* Discourages/disables the editing of talk page archives
* By User:Porter21
*/

```

importScriptPage('DisableArchiveEdit/code.js', 'dev');

/\* Special:Random > Special:Random/main

```
* By User:Porter21
*/

```

jQuery(function($) {

```
  if (skin == "oasis" || skin == "wikia") {
     $('ul.subnav-2.accent li a[href="/wiki/Special:Random"]').attr('href', '/wiki/Special:Random/main');
  }

```

});

// \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
// Experimental javascript countdown timer (Splarka)
// Version 0.0.3
// \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
//
// Usage example:
//
// Only January 01 2007 00:00:00 PST until New years.
//
// Javascript disabled.

function updatetimer(i) {

```
 var now = new Date();
 var then = timers[i].eventdate;
 var diff = count=Math.floor((then.getTime()-now.getTime())/1000);

 // catch bad date strings
 if(isNaN(diff)) {
   timers[i].firstChild.nodeValue = '** ' + timers[i].eventdate + ' **' ;
   return;
 }

 // determine plus/minus
 if(diff<0) {
   diff = -diff;
   var tpm = ' ';
 } else {
   var tpm = ' ';
 }

 // calcuate the diff
 var left = (diff%60) + ' seconds';
   diff=Math.floor(diff/60);
 if(diff > 0) left = (diff%60) + ' minutes ' + left;
   diff=Math.floor(diff/60);
 if(diff > 0) left = (diff%24) + ' hours ' + left;
   diff=Math.floor(diff/24);
 if(diff > 0) left = diff + ' days ' + left
 timers[i].firstChild.nodeValue = tpm + left;

 // a setInterval() is more efficient, but calling setTimeout()
 // makes errors break the script rather than infinitely recurse
 timeouts[i] = setTimeout('updatetimer(' + i + ')',1000);

```

}

function checktimers() {

```
 //hide 'nocountdown' and show 'countdown'
 var nocountdowns = getElementsByClassName(document, 'span', 'nocountdown');
 for(var i in nocountdowns) nocountdowns[i].style.display = 'none'
 var countdowns = getElementsByClassName(document, 'span', 'countdown');
 for(var i in countdowns) countdowns[i].style.display = 'inline'

 //set up global objects timers and timeouts.
 timers = getElementsByClassName(document, 'span', 'countdowndate');  //global
 timeouts = new Array(); // generic holder for the timeouts, global
 if(timers.length == 0) return;
 for(var i in timers) {
   timers[i].eventdate = new Date(timers[i].firstChild.nodeValue);
   updatetimer(i);  //start it up
 }

```

}
addOnloadHook(checktimers);

// \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
// - end - Experimental javascript countdown timer
// \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

/\* Replaces Template:USERNAME with the name of the user browsing the page.

```
  Requires copying Template:USERNAME. */

```

function UserNameReplace() {

```
   if(typeof(disableUsernameReplace) != 'undefined' && disableUsernameReplace || wgUserName == null) return;
   $("span.insertusername").html(wgUserName);
}
addOnloadHook(UserNameReplace);

```

/\* End of the Template:USERNAME replacement \*/

/\*\*\*\*\*\*\*\*\*\*\*\*\* Funzioni di utilità generale \*\*\*\*\*\*\*\*\*\*\*\*\*/

```
/* Test if an element has a certain class **************************************
* Description: Uses regular expressions and caching for better performance.
* Maintainers: User:Mike Dillon, User:R. Koot, 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);
   };
})();

```

function getElementsByClass (node, className, tagName) {
 var list = node.getElementsByTagName(tagName?tagName:'\*');
 var array = new Array();
 var i = 0;
 for (i in list) {
 if (hasClass(list[i], className))
 array.push(list[i]);
 }
 return array;

```
}

```

/\* Creates the method getElementsByClass, if unsupported from the browser \*/
if(!document.getElementsByClass) document.getElementsByClass = function(className) {
 return getElementsByClass(document, className, '\*');
};

function getElementsByName (name, root) {

```
if (root == undefined) root = document;
var e = root.getElementsByTagName('*');
var r = new Array();
for (var i = 0; i < e.length; i++) {

```

 if (e[i].getAttribute('name') == name) r[r.length] = e[i];

```
}
return r;

```

}

And:

/\* Reference Popups

```
*/

```

importArticles({

```
   type: 'script',
   articles: [
       // ...
       'w:c:dev:ReferencePopups/code.js',
       // ...
   ]

```

});

/\* Adds icons to page header bottom border

```
* by: User:The 888th Avatar
*/

```

$(document).ready(function() {
 if (skin == "oasis" || skin == "wikia") {
 $('.WikiaPageHeader').append($('#icons'));
 $('#icons').css({'position' : 'absolute', 'right' : '0', 'bottom' : '-1.2em'});
 }
});

/\* User Code tagging: Added by Notorious Zimmer

* /

importArticles({
 type:'script',
 articles: [
 // ...
 'w:c:dev:UserTags/code.js',
 // ...
 ]
});
/\* Any JavaScript here will be loaded for all users on every page load. \*/