MediaWiki:Common.js: Difference between revisions

From The Sims Wiki, a collaborative database for The Sims series
Jump to navigation Jump to search
Content added Content deleted
sims>Lost Labyrinth
(seemed to have fixed before I reverted myself :/)
sims>Woganhemlock
(adding that refresh script seems to have mucked up other js, reverting to last stable version for now)
Line 1: Line 1:
// 10:00, September 25, 2011 (UTC)
// 00:51, September 26, 2011 (UTC)
// <source lang="JavaScript">
// <source lang="JavaScript">
/* Any JavaScript here will be loaded for all users on every page load. */
/* Any JavaScript here will be loaded for all users on every page load. */

/* Test if an element has a certain class **************************************
/* Test if an element has a certain class **************************************
*
*
* Description: Uses regular expressions and caching for better performance.
* Description: Uses regular expressions and caching for better performance.
* Taken from Wikipedia's Common.js.
* Taken from Wikipedia's Common.js.
*/a
*/

/* ######################################################################## */
/* ######################################################################## */
/* ### TITLE ICONS (Template:Era) ### */
/* ### TITLE ICONS (Template:Era) ### */
Line 48: Line 48:
}
}
});
});

// Standard Edit Summaries
// Standard Edit Summaries
importScript('MediaWiki:Common.js/standardeditsummaries.js');
importScript('MediaWiki:Common.js/standardeditsummaries.js');
// END of Standard Edit Summaries
// END of Standard Edit Summaries

/** Collapsible tables *********************************************************
/** Collapsible tables *********************************************************
*
*
Line 66: Line 66:
};
};
})();
})();

var autoCollapse = 2;
var autoCollapse = 2;
var collapseCaption = "hide";
var collapseCaption = "hide";
Line 253: Line 253:
addOnloadHook( createNavigationBarToggleButton );
addOnloadHook( createNavigationBarToggleButton );

// **************************************************
// **************************************************
// Experimental javascript countdown timer (Splarka)
// Experimental javascript countdown timer (Splarka)
Line 264: Line 264:
// </span>
// </span>
// <span class="nocountdown">Javascript disabled.</span>
// <span class="nocountdown">Javascript disabled.</span>

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

// catch bad date strings
// catch bad date strings
if(isNaN(diff)) {
if(isNaN(diff)) {
Line 275: Line 275:
return;
return;
}
}

// determine plus/minus
// determine plus/minus
if(diff<0) {
if(diff<0) {
Line 283: Line 283:
var tpm = '';
var tpm = '';
}
}

// calcuate the diff
// calcuate the diff
var left = (diff%60) + ' seconds';
var left = (diff%60) + ' seconds';
Line 298: Line 298:
timers[i].firstChild.nodeValue = tpm + left;
timers[i].firstChild.nodeValue = tpm + left;
}
}

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

function checktimers() {
function checktimers() {
//hide 'nocountdown' and show 'countdown'
//hide 'nocountdown' and show 'countdown'
Line 311: Line 311:
var countdowns = getElementsByClassName(document, 'span', 'countdown');
var countdowns = getElementsByClassName(document, 'span', 'countdown');
for(var i in countdowns) countdowns[i].style.display = 'inline'
for(var i in countdowns) countdowns[i].style.display = 'inline'

//set up global objects timers and timeouts.
//set up global objects timers and timeouts.
timers = getElementsByClassName(document, 'span', 'countdowndate'); //global
timers = getElementsByClassName(document, 'span', 'countdowndate'); //global
Line 322: Line 322:
}
}
addOnloadHook(checktimers);
addOnloadHook(checktimers);

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

// **************************************************
// **************************************************
// Hide namespaces in categories (Splarka)
// Hide namespaces in categories (Splarka)
Line 333: Line 333:
// <div id="catnoprefix" style="display:none;"></div>
// <div id="catnoprefix" style="display:none;"></div>
// to the category description page to activate it.
// to the category description page to activate it.

function catprefix() {
function catprefix() {
if(!document.getElementById('catnoprefix')) return
if(!document.getElementById('catnoprefix')) return
Line 344: Line 344:
}
}
addOnloadHook(catprefix)
addOnloadHook(catprefix)

// **************************************************
// **************************************************
// - end - Hide namespaces in categories
// - end - Hide namespaces in categories
// **************************************************
// **************************************************

/* Username replace feature
/* Username replace feature
* Inserts viewing user's name into <span class="insertusername"></span>
* Inserts viewing user's name into <span class="insertusername"></span>
Line 355: Line 355:
* This (jQuery) version by [[wikia:User:Joeyaa]], written to be backwards compatible
* This (jQuery) version by [[wikia:User:Joeyaa]], written to be backwards compatible
*/
*/

if (wgUserName != 'null') {
if (wgUserName != 'null') {
$('.insertusername').html(wgUserName);
$('.insertusername').html(wgUserName);
}
}

/* Custom edit buttons
/* Custom edit buttons
See http://help.wikia.com/wiki/Help:Custom_edit_buttons
See http://help.wikia.com/wiki/Help:Custom_edit_buttons
Line 427: Line 427:
"sampleText": "Template"};
"sampleText": "Template"};
}
}

/* Tooltip script begin */
/* Tooltip script begin */

var $tfb;
var $tfb;

// hides the tooltip
// hides the tooltip
function hideTip() {
function hideTip() {
$tfb.html("").removeClass("tooltip-ready").addClass("hidden").css("visibility","hidden");
$tfb.html("").removeClass("tooltip-ready").addClass("hidden").css("visibility","hidden");
}
}

// displays the tooltip
// displays the tooltip
function displayTip(e) {
function displayTip(e) {
Line 443: Line 443:
$tfb.not(":empty").css("visibility","visible");
$tfb.not(":empty").css("visibility","visible");
}
}

// moves the tooltip
// moves the tooltip
function moveTip(e) {
function moveTip(e) {
Line 450: Line 450:
$tfb.not(".hidden").css({"position":"fixed","top":newTop + "px","left":newLeft + "px"});
$tfb.not(".hidden").css({"position":"fixed","top":newTop + "px","left":newLeft + "px"});
}
}

// AJAX tooltips
// AJAX tooltips
function showTip(e) {
function showTip(e) {
Line 465: Line 465:
}
}
}
}

function bindTT() {
function bindTT() {
$t=$(this);
$t=$(this);
Line 471: Line 471:
if ($p.hasClass("selflink") == false) $t.data("tt", $p.attr("title").replace(" (page does not exist)","").replace("?","%3F")).mouseover(showTip).mouseout(hideTip).mousemove(moveTip);
if ($p.hasClass("selflink") == false) $t.data("tt", $p.attr("title").replace(" (page does not exist)","").replace("?","%3F")).mouseover(showTip).mouseout(hideTip).mousemove(moveTip);
}
}

// check to see if it is active then do it
// check to see if it is active then do it
$(function() {
$(function() {
Line 479: Line 479:
$("#bodyContent span.ajaxttlink").each(bindTT);
$("#bodyContent span.ajaxttlink").each(bindTT);
});
});

/* Tooltip script end */
/* Tooltip script end */

/* PCJ's dup finder start */
/* PCJ's dup finder start */
dil = new Array();
dil = new Array();
Line 509: Line 509:
$(function () { if ($("#mw-dupimages").length) findDupImages(); });
$(function () { if ($("#mw-dupimages").length) findDupImages(); });
/* PCJ's dup finder end */
/* PCJ's dup finder end */

/* Move SiteNotice
/* Move SiteNotice
* By w:c:avatar:Joeyaa
* By w:c:avatar:Joeyaa
* Requires #mw-dismissable-notice span {display:none;} in css
* Requires #mw-dismissable-notice span {display:none;} in css
*/
*/

$('#sitenotice-dismiss').html('[<a href="javascript:dismissNotice();">dismiss</a>]');
$('#sitenotice-dismiss').html('[<a href="javascript:dismissNotice();">dismiss</a>]');

// ============================================================
// ============================================================
// BEGIN Template:Era
// BEGIN Template:Era
// ============================================================
// ============================================================

// Description: Add game icons to top right corner of articles
// Description: Add game icons to top right corner of articles
// Credit: User:Mirar (based on Template:Eras by User:Sikon), copied from fallout.wikia
// Credit: User:Mirar (based on Template:Eras by User:Sikon), copied from fallout.wikia

function addTitleGames() {
function addTitleGames() {
var titleDiv = document.getElementById("title-games");
var titleDiv = document.getElementById("title-games");
Line 532: Line 532:
var content = document.getElementById('content');
var content = document.getElementById('content');
}
}

if (content) {
if (content) {
var hs = content.getElementsByTagName('h1');
var hs = content.getElementsByTagName('h1');
Line 543: Line 543:
}
}
}
}

var cloneNode = titleDiv.cloneNode(true);
var cloneNode = titleDiv.cloneNode(true);
firstHeading.insertBefore(cloneNode, firstHeading.childNodes[0]);
firstHeading.insertBefore(cloneNode, firstHeading.childNodes[0]);
Line 554: Line 554:
}
}
}
}

addOnloadHook( addTitleGames );
addOnloadHook( addTitleGames );

//Facebook 'Like Box'
//Facebook 'Like Box'
//Graciously (and unknowingly) provided by The Spanish 'Simspedia'
//Graciously (and unknowingly) provided by The Spanish 'Simspedia'

function fBox() {
function fBox() {
$('#fbox').append('<iframe marginheight="0" marginwidth="0" src="http://www.facebook.com/connect/connect.php?id=126686564044617&amp;connections=10" align="top" frameborder="0" width="300" height="250" scrolling="no" />');
$('#fbox').append('<iframe marginheight="0" marginwidth="0" src="http://www.facebook.com/connect/connect.php?id=126686564044617&amp;connections=10" align="top" frameborder="0" width="300" height="250" scrolling="no" />');
}
}

$(fBox);
$(fBox);

/* Display Timer */
/* Display Timer */

importScript('MediaWiki:Common.js/DisplayTimer.js');
importScript('MediaWiki:Common.js/DisplayTimer.js');

// *************************************************
// *************************************************
// Pagetitle rewrite
// Pagetitle rewrite
Line 583: Line 583:
$(".#user_masthead_head h2").html(newTitle + "<small id='user_masthead_since'>" + edits + "</small>");
$(".#user_masthead_head h2").html(newTitle + "<small id='user_masthead_since'>" + edits + "</small>");
});
});


/* ######################################################################## */
/* ### AJAX RC ### */
/* ### ---------------------------------------------------------------- ### */
/* ### Description: Automatically refresh "Recent changes" via AJAX ### */
/* ### Credit: User:pcj (original) ### */
/* ### User:Grunny (bug fixes) ### */
/* ######################################################################## */
var ajaxIndicator = stylepath + '/common/progress-wheel.gif';
var ajaxPages = new Array("Special:RecentChanges", "Special:WikiActivity");
var ajaxCallAgain = [];
var ajaxTimer;
var ajaxRefresh = 60000;
var refreshText = 'Auto-refresh';
var refreshHover = 'Enable auto-refreshing page loads';
var doRefresh = true;
// *************************************************
/**
// autorefresh
* Sets the cookie
//
* @param c_name string Name of the cookie
// used to refresh RecentChanges for maximum stalking of edits
* @param value string 'on' or 'off'
// *************************************************
* @param expiredays integer Expiry time of the cookie in days
*/
function setCookie(c_name, value, expiredays) {
var exdate = new Date();
exdate.setDate(exdate.getDate() + expiredays);
document.cookie = c_name + "=" + escape(value) + ((expiredays === null) ? "" : ";expires=" + exdate.toGMTString());
}
importScriptPage('AjaxRC/code.js', 'dev');
/**
* Gets the cookie
* @param c_name string Cookie name
* @return The cookie name or empty string
*/
function getCookie(c_name) {
if (document.cookie.length > 0) {
var c_start = document.cookie.indexOf(c_name + "=");
if (c_start !== -1) {
c_start = c_start + c_name.length + 1;
var c_end = document.cookie.indexOf(";", c_start);
if (c_end === -1) {
c_end = document.cookie.length;
}
return unescape(document.cookie.substring(c_start, c_end));
}
}
return "";
}
/**
* Main function to start the Auto-refresh process
*/
function preloadAJAXRL() {
var ajaxRLCookie = (getCookie("ajaxload-" + wgPageName) == "on") ? true : false;
var appTo = ($('#WikiaPageHeader' ).length) ? $('#WikiaPageHeader > h1') : ($('#AdminDashboardHeader').length ? $('#AdminDashboardHeader > h1') : $('.firstHeading'));
appTo.append('&#160;<span style="font-size: xx-small; line-height: 100%;" id="ajaxRefresh"><span style="border-bottom: 1px dotted; cursor: help;" id="ajaxToggleText" title="' + refreshHover + '">' + refreshText + ':</span><input type="checkbox" style="margin-bottom: 0;" id="ajaxToggle"><span style="display: none;" id="ajaxLoadProgress"><img src="' + ajaxIndicator + '" style="float: none; vertical-align: baseline;" border="0" alt="Refreshing page" /></span></span>');
$('#ajaxLoadProgress').ajaxSend(function(event, xhr, settings) {
if (location.href == settings.url) {
$(this).show();
}
} ).ajaxComplete(function(event, xhr, settings) {
if (location.href == settings.url) {
$(this).hide();
for(var i in ajaxCallAgain) {
ajaxCallAgain[i]();
}
}
} );
$('#ajaxToggle').click(toggleAjaxReload).attr('checked', ajaxRLCookie);
if (getCookie("ajaxload-" + wgPageName) == "on") {
loadPageData();
}
}
/**
* Turn refresh on and off by toggling the checkbox
*/
function toggleAjaxReload() {
if ($('#ajaxToggle').prop('checked') === true) {
setCookie("ajaxload-" + wgPageName, "on", 30);
doRefresh = true;
loadPageData();
} else {
setCookie("ajaxload-" + wgPageName, "off", 30);
doRefresh = false;
clearTimeout(ajaxTimer);
}
}
/**
* Does the actual refresh
*/
function loadPageData() {
var cC = ($('#WikiaArticle').length ) ? '#WikiaArticle' : '#bodyContent';
$(cC).load(location.href + " " + cC + " > *", function (data) {
if (doRefresh) {
ajaxTimer = setTimeout(loadPageData, ajaxRefresh);
}
});
}

// *************************************************
// *************************************************
// change profile labels on individual pages
// change profile labels on individual pages
Line 695: Line 599:
//
//
// *************************************************
// *************************************************

if (wgCanonicalNamespace === "User_talk" || wgCanonicalNamespace === "User" ){
if (wgCanonicalNamespace === "User_talk" || wgCanonicalNamespace === "User" ){
if ( document.getElementById('UserProfileMasthead').getElementsByClassName('group').length === 1 ){
if ( document.getElementById('UserProfileMasthead').getElementsByClassName('group').length === 1 ){
Line 704: Line 608:
}
}
importScriptPage('PurgeButton/code.js', 'dev');

// </source>
// </source>

Revision as of 00:51, 26 September 2011

// 00:51, September 26, 2011 (UTC)
// <source lang="JavaScript">
/* Any JavaScript here will be loaded for all users on every page load. */
 
/* Test if an element has a certain class **************************************
  *
  * Description: Uses regular expressions and caching for better performance.
  * Taken from Wikipedia's Common.js.
  */
 
/* ######################################################################## */
/* ### TITLE ICONS (Template:Era)                                       ### */
/* ### ---------------------------------------------------------------- ### */
/* ### Description: Add icons to article title                          ### */
/* ### Credit:      User:Porter21                                       ### */
/* ######################################################################## */
 
$(function addTitleIcons () {
   if (skin == 'monobook' || skin == 'oasis') {
      var insertTarget;
 
      switch (skin) {
         case 'monobook':
            insertTarget = $('#firstHeading');
            break;
         case 'oasis':
 
            if (wgAction != 'submit' && wgNamespaceNumber != 112 && $('#titleicons').length > 0) {
               if ($('#WikiaPageHeader h2').length == 0) {
                  $('<h2>&nbsp;</h2>').appendTo('#WikiaPageHeader');
               }
               insertTarget = $('#WikiaPageHeader h2');
            }
            break;
      }
 
      if (insertTarget) {
         $('#titleicons').css('display', 'block').prependTo(insertTarget);
         $('#titleicons-more').append('<img width="0" height="0" class="titleicons-chevron" src="' + wgBlankImgUrl + '">');
 
         $('#titleicons').hover(
             function () {
                $(this).addClass('titleicons-hover');
             }, function () {
                $(this).removeClass('titleicons-hover');
             });
      }
   }
});
 
// Standard Edit Summaries
importScript('MediaWiki:Common.js/standardeditsummaries.js');
// END of Standard Edit Summaries
 
/** Collapsible tables *********************************************************
  *
  *  Description: Allows tables to be collapsed, showing only the header. See
  *               [[Wikipedia:NavFrame]].
  *  Taken from Wikipedia's Common.js.
  */
 
var hasClass = (function () {
   var reCache = {};
   return function (element, className) {
      return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
   };
})();
 
 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 = "2em";
 
             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 );
 
 /** Dynamic Navigation Bars (experimental) *************************************
  *
  *  Description: See [[Wikipedia:NavFrame]].
  *  Taken from Wikipedia's Common.js.
  */
 
  // set up the words in your language
  var NavigationBarHide = '[' + collapseCaption + ']';
  var NavigationBarShow = '[' + expandCaption + ']';
 
  // 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.firstChild.data == NavigationBarHide) {
         for (
                 var NavChild = NavFrame.firstChild;
                 NavChild != null;
                 NavChild = NavChild.nextSibling
             ) {
             if ( hasClass( NavChild, 'NavPic' ) ) {
                 NavChild.style.display = 'none';
             }
             if ( hasClass( NavChild, 'NavContent') ) {
                 NavChild.style.display = 'none';
             }
         }
     NavToggle.firstChild.data = NavigationBarShow;
 
     // if hidden now
     } else if (NavToggle.firstChild.data == NavigationBarShow) {
         for (
                 var NavChild = NavFrame.firstChild;
                 NavChild != null;
                 NavChild = NavChild.nextSibling
             ) {
             if (hasClass(NavChild, 'NavPic')) {
                 NavChild.style.display = 'block';
             }
             if (hasClass(NavChild, 'NavContent')) {
                 NavChild.style.display = 'block';
             }
         }
     NavToggle.firstChild.data = NavigationBarHide;
     }
  }
 
  // adds show/hide-button to navigation bars
  function createNavigationBarToggleButton()
  {
     var indexNavigationBar = 0;
     // iterate over all < div >-elements 
     var divs = document.getElementsByTagName("div");
     for(
             var i=0; 
             NavFrame = divs[i]; 
             i++
         ) {
         // if found a navigation bar
         if (hasClass(NavFrame, "NavFrame")) {
 
             indexNavigationBar++;
             var NavToggle = document.createElement("a");
             NavToggle.className = 'NavToggle';
             NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
             NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');
 
             var NavToggleText = document.createTextNode(NavigationBarHide);
             for (
                  var NavChild = NavFrame.firstChild;
                  NavChild != null;
                  NavChild = NavChild.nextSibling
                 ) {
                 if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
                     if (NavChild.style.display == 'none') {
                         NavToggleText = document.createTextNode(NavigationBarShow);
                         break;
                     }
                 }
             }
 
             NavToggle.appendChild(NavToggleText);
             // 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 (hasClass(NavFrame.childNodes[j], "NavHead")) {
                 NavFrame.childNodes[j].appendChild(NavToggle);
               }
             }
             NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
         }
     }
  }
 
  addOnloadHook( createNavigationBarToggleButton );
 
// **************************************************
// Experimental javascript countdown timer (Splarka)
// Version 0.0.3
// **************************************************
//
// Usage example:
//  <span class="countdown" style="display:none;">
//  Only <span class="countdowndate">January 01 2007 00:00:00 PST</span> until New years.
//  </span>
//  <span class="nocountdown">Javascript disabled.</span>
 
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 = 'T plus ';
  } 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
  var diffing = count=Math.floor((then.getTime()-now.getTime())/1000);
  if(diffing<0) {
  timers[i].firstChild.nodeValue = 'Timer has expired';
  } else {
  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
// **************************************************
 
// **************************************************
// Hide namespaces in categories (Splarka)
// **************************************************
// A quick script to hide namespace prefixes in category lists. Just add 
// <div id="catnoprefix" style="display:none;"></div>
// to the category description page to  activate it. 
 
function catprefix() {
  if(!document.getElementById('catnoprefix')) return
  var anchors = document.getElementById('mw-pages').getElementsByTagName('a');
  for(var i=0;i < anchors.length;i++) {
    if(anchors[i].firstChild.nodeValue.indexOf(':') != -1) {
      anchors[i].firstChild.nodeValue = anchors[i].firstChild.nodeValue.substring(anchors[i].firstChild.nodeValue.indexOf(':')+1);
    }
  }
}
addOnloadHook(catprefix)
 
// **************************************************
//  - end -  Hide namespaces in categories
// **************************************************
 
/* Username replace feature
 * Inserts viewing user's name into <span class="insertusername"></span>
 * Put text inside the spans to be viewed by logged out users
 * Originally by [[wikia:User:Splarka|Splarka]], then by [[User:Spang|Spang]],
 * This (jQuery) version by [[wikia:User:Joeyaa]], written to be backwards compatible
 */
 
if (wgUserName != 'null') {
	$('.insertusername').html(wgUserName);
}
 
/* Custom edit buttons
See http://help.wikia.com/wiki/Help:Custom_edit_buttons
 */
 if (mwCustomEditButtons) {
   mwCustomEditButtons[mwCustomEditButtons.length] = {
     "imageFile": "http://images3.wikia.nocookie.net/central/images/1/11/Btn_toolbar_liste.png",
     "speedTip": "List",
     "tagOpen": "\n* ",
     "tagClose": "\n* Element B\n* Element C",
     "sampleText": "Element A"};
  }
 if (mwCustomEditButtons) {
   mwCustomEditButtons[mwCustomEditButtons.length] = {
     "imageFile": "http://images4.wikia.nocookie.net/central/images/8/88/Btn_toolbar_enum.png",
     "speedTip": "Numbering",
     "tagOpen": "\n# ",
     "tagClose": "\n# Element 2\n# Element 3",
     "sampleText": "Element 1"};
  }
 if (mwCustomEditButtons) {
   mwCustomEditButtons[mwCustomEditButtons.length] = {
     "imageFile": "http://images4.wikia.nocookie.net/central/images/f/fd/Button_blockquote.png",
     "speedTip": "Blockquote",
     "tagOpen": "<blockquote>",
     "tagClose": "</blockquote>",
     "sampleText": "Insert text"};
  }
 if (mwCustomEditButtons) {
   mwCustomEditButtons[mwCustomEditButtons.length] = {
     "imageFile": "http://images2.wikia.nocookie.net/central/images/7/74/Button_comment.png",
     "speedTip": "Note",
     "tagOpen": "{{Info|Insert title|",
     "tagClose": "}}",
     "sampleText": "Insert text"};
  }
 if (mwCustomEditButtons) {
   mwCustomEditButtons[mwCustomEditButtons.length] = {
     "imageFile": "http://images2.wikia.nocookie.net/central/images/b/b4/Button_category03.png",
     "speedTip": "Category",
     "tagOpen": "[[Category:",
     "tagClose": "]]",
     "sampleText": "Category name"};
  }
 if (mwCustomEditButtons) {
   mwCustomEditButtons[mwCustomEditButtons.length] = {
     "imageFile": "http://images.wikia.com/central/images/c/c8/Button_redirect.png",
     "speedTip": "Redirect",
     "tagOpen": "#REDIRECT [[",
     "tagClose": "]]",
     "sampleText": "Insert text"};
  }
 if (mwCustomEditButtons) {
   mwCustomEditButtons[mwCustomEditButtons.length] = {
     "imageFile": "http://images2.wikia.nocookie.net/central/images/1/12/Button_gallery.png",
     "speedTip": "Picture gallery",
     "tagOpen": "\n<gallery>\nImage:",
     "tagClose": "|[[The Sims Wiki]] Logo\nImage:Wiki.png|[[The Sims Wiki]] Logo\nImage:Wiki.png|Eine [[The Sims Wiki]] Logo\n<\/gallery>",
     "sampleText": "Wiki.png"};
  }
 if (mwCustomEditButtons) {
   mwCustomEditButtons[mwCustomEditButtons.length] = {
     "imageFile": "http://images1.wikia.nocookie.net/central/images/3/3b/Button_template_alt.png",
     "speedTip": "Template",
     "tagOpen": "{{",
     "tagClose": "}}",
     "sampleText": "Template"};
  }
 
/* Tooltip script begin */
 
var $tfb;
 
// hides the tooltip
function hideTip() {
$tfb.html("").removeClass("tooltip-ready").addClass("hidden").css("visibility","hidden"); 
}
 
// displays the tooltip
function displayTip(e) {
$tfb.not(":empty").removeClass("hidden").addClass("tooltip-ready");
moveTip(e);
$tfb.not(":empty").css("visibility","visible");
}
 
// moves the tooltip
function moveTip(e) {
var newTop = e.clientY + ((e.clientY > ($(window).height()/2)) ? -($tfb.not(".hidden").innerHeight()+20):20);
var newLeft = e.clientX + ((e.clientX > ($(window).width()/2)) ? -($tfb.not(".hidden").innerWidth()+20):20);
$tfb.not(".hidden").css({"position":"fixed","top":newTop + "px","left":newLeft + "px"});
}
 
// AJAX tooltips
function showTip(e) {
$t=$(this);
$p=$t.parent();
if ($p.hasClass("selflink")==false) {
$t.removeAttr("title");
$p.removeAttr("title");
$tfb.load("/"+$t.data("tt").replace(/ /g,"_").replace(/\?/g,"%3F")+"?action=render div.tooltip-content",function () {
if ($tfb.html() == "") $tfb.html('<div class="tooltip-content"><b>Error</b><br />This target either has no tooltip<br />or was not intended to have one.</div>');
$tfb.find(".tooltip-content").css("display","");
displayTip(e);
});
}
}
 
function bindTT() {
$t=$(this);
$p=$t.parent();
if ($p.hasClass("selflink") == false) $t.data("tt", $p.attr("title").replace(" (page does not exist)","").replace("?","%3F")).mouseover(showTip).mouseout(hideTip).mousemove(moveTip);
}
 
// check to see if it is active then do it
$(function() {
$("#bodyContent").mouseover(hideTip);
$("#bodyContent").append('<div id="tfb" class="htt"></div>');
$tfb = $("#tfb");
$("#bodyContent span.ajaxttlink").each(bindTT);
});
 
/* Tooltip script end */
 
/* PCJ's dup finder start */
dil = new Array();
function findDupImages(gf) {
output = "";
url = "/api.php?action=query&generator=allimages&prop=duplicatefiles&gailimit=500&format=json";
if (gf) url += "&gaifrom=" + gf;
$.getJSON(url,function (data) {
if (data.query) {
pages = data.query.pages;
for (pageID in pages) {
dils = ","+dil.join();
if (dils.indexOf(","+pages[pageID].title) == -1 && pages[pageID].title.indexOf("File::") == -1 && pages[pageID].duplicatefiles) {
output += "<h3><a href='/" + pages[pageID].title + "'>"+pages[pageID].title+"</a></h3>\n<ul>\n";
for (x=0;x<pages[pageID].duplicatefiles.length;x++) {
output += "<li><a href='/File:" + pages[pageID].duplicatefiles[x].name + "'>File:"+pages[pageID].duplicatefiles[x].name+"</a></li>\n";
dil.push("File:"+pages[pageID].duplicatefiles[x].name.replace(/_/g," "));
}
output += "</ul>\n\n"
}
}
$("#mw-dupimages").append(output);
if (data["query-continue"]) setTimeout("findDupImages('"+data["query-continue"].allimages.gaifrom+"');",5000);
}
});
}
$(function () { if ($("#mw-dupimages").length) findDupImages(); });
/* PCJ's dup finder end */
 
/* Move SiteNotice
 * By w:c:avatar:Joeyaa
 * Requires #mw-dismissable-notice span {display:none;} in css
 */
 
$('#sitenotice-dismiss').html('[<a href="javascript:dismissNotice();">dismiss</a>]');
 
// ============================================================
// BEGIN Template:Era
// ============================================================
 
// Description: Add game icons to top right corner of articles
// Credit:      User:Mirar (based on Template:Eras by User:Sikon), copied from fallout.wikia
 
function addTitleGames() {
   var titleDiv = document.getElementById("title-games");
   if (titleDiv != null && titleDiv != undefined)
   {
      var content = document.getElementById('article');
      if (!content) {
         var content = document.getElementById('content');
      }
 
      if (content) {
         var hs = content.getElementsByTagName('h1');
         var firstHeading;
         for (var i = 0; i < hs.length; i++)
         {
            if ( (' '+hs[i].className+' ').indexOf(' firstHeading ') != -1){
               firstHeading=hs[i];
               break;
            }
         }
 
         var cloneNode = titleDiv.cloneNode(true);
         firstHeading.insertBefore(cloneNode, firstHeading.childNodes[0]);
         cloneNode.style.display = "block";
         cloneNode.style.visibility = "visible";
         if (skin != "monaco") {
            cloneNode.style.marginTop = "-11px";
         }
      }
   }
}
 
addOnloadHook( addTitleGames );
 
//Facebook 'Like Box'
//Graciously (and unknowingly) provided by The Spanish 'Simspedia'
 
function fBox() {
	$('#fbox').append('<iframe marginheight="0" marginwidth="0" src="http://www.facebook.com/connect/connect.php?id=126686564044617&amp;connections=10" align="top" frameborder="0" width="300" height="250" scrolling="no" />');
}
 
$(fBox);
 
/* Display Timer */
 
importScript('MediaWiki:Common.js/DisplayTimer.js');
 
// *************************************************
// Pagetitle rewrite
//
// Rewrites the page's title, used by Template:Title
// *************************************************
 
    $(function(){
	var newTitle = $("#title-meta").html();
	if (!newTitle) return;
	var edits = $("#user_masthead_since").text();
	$(".firstHeading,#WikiaUserPagesHeader h1,#WikiaPageHeader h1").html(newTitle);
	$(".#user_masthead_head h2").html(newTitle + "<small id='user_masthead_since'>" + edits + "</small>");
});
 
 
// *************************************************
// autorefresh
//
// used to refresh RecentChanges for maximum stalking of edits
// *************************************************
 
importScriptPage('AjaxRC/code.js', 'dev');
 
 
// *************************************************
// change profile labels on individual pages
//
// 
// *************************************************
 
if (wgCanonicalNamespace === "User_talk" || wgCanonicalNamespace === "User"  ){
	if ( document.getElementById('UserProfileMasthead').getElementsByClassName('group').length === 1 ){
		if (document.getElementById('adm-changetitle') !== null ){
			document.getElementById('UserProfileMasthead').getElementsByClassName('group')[0].innerHTML = document.getElementById('adm-changetitle').innerHTML;
		}
	}
}
 
 
// </source>