MediaWiki:Common.js

/* Any JavaScript here will be loaded for all users on every page load. */

// ================================================================================ // Countdowns // ================================================================================ // Credits go to AbelToy, Guy Perfect, Espyo for the countdown code.

// List of countdowns on the current page var countdowns = [];

// Converts from time to a clean time info structure function timeToStruct(time) {

var passed = time < 0; //Has the moment passed? // Parse time fields from the number time = Math.floor(time / 1000); var secs = ("00" + (time % 60)).slice(-2); time = Math.floor(time /   60); var mins = ("00" + (time % 60)).slice(-2); time = Math.floor(time /   60); var hours = ("00" + (time % 24)).slice(-2); time = Math.floor(time /  24);

// Construct the string representation return { d: time, h: hours, m: mins, s: secs, p: passed }; }

// Gets the time remaining until the next stage rotation function getStageCountdown(now) { var hour  = Math.floor(now / 3600000) % 24 + 2; // Add 2 for UTC bias var now   = hour * 3600000 + now % 3600000;     // Current adjusted hour var target = (hour + 4 & -4) * 3600000;         // Target hour return target - now; }

function tickCountdowns { var now = Date.now; for(var c = 0; c < countdowns.length; c++){ var diff = 0; if(countdowns[c].stage) { diff = timeToStruct(getStageCountdown(now)); } else { diff = timeToStruct(countdowns[c].time - now); }   if(diff.p && diff.d < -1) { // Over 24 hours passed countdowns[c].span.innerHTML = countdowns[c].doneMessage; } else if(diff.p){ // 24 hours haven't passed yet countdowns[c].span.innerHTML = countdowns[c].ongoingMessage; } else { // The time hasn't come yet countdowns[c].span.innerHTML = ((diff.d > 0) ? (diff.d + " day" + (diff.d == 1 ? "" : "s") + ", ") : "") + diff.h + ":" + diff.m + ":" + diff.s;   } } }

// Returns the info from a countdown span on the page. function getCountdownInfo(countdown, stage) { var time = null; var ongoingMessage = ""; var doneMessage = "";

if(!stage) { // Format is " | | " var parts = countdown.innerHTML.split("|"); doneMessage = (parts.length >= 3) ? parts[2] : parts[1]; ongoingMessage = parts[1]; var timeParts = parts[0].split(/[ \n]/); var date = timeParts[0].split("/"); var hour = timeParts[1].split(":"); time = Date.UTC(date[0], date[1] - 1, date[2], hour[0], hour[1]); } countdowns.push( {    span:           countdown,    stage:          stage,    time:           time,    ongoingMessage: ongoingMessage,    doneMessage:    doneMessage  } ); // The spans start hidden and with the info // Delete the info and show the span countdown.style.display = "inline"; countdown.innerHTML = ""; }

// Finds countdown spans on the document and sets up the countdowns function setupCountdowns { var stageCountdowns = document.getElementsByClassName("stageCountdown"); for(var sc = 0; sc < stageCountdowns.length; sc++) { getCountdownInfo(stageCountdowns[sc], true); } var countdowns = document.getElementsByClassName("countdown"); for(var c = 0; c < countdowns.length; c++) { getCountdownInfo(countdowns[c], false); } setInterval(tickCountdowns, 1000); }

setupCountdowns;

// ================================================================================ // Pikan -- the analyzer on the edit page // ================================================================================ mw.loader.load('//www.pikminwiki.com/index.php?title=User:Espyo/pikan-core.js' + '&action=raw&ctype=text/javascript');

mw.loader.load('//www.splatoonwiki.org/w/index.php?title=User:Espyo/pikan-inkipedia.js' + '&action=raw&ctype=text/javascript');

// ================================================================================ // Username replace function for Template:USERNAME // ================================================================================ // Inserts user name into. // Disable by setting disableUsernameReplace = true. jQuery(function($) { if (typeof(disableUsernameReplace) != 'undefined' && disableUsernameReplace)    return;  var username = mw.config.get('wgUserName');  if (username == null)    return;

$('.insertusername').text(username); });

// ================================================================================ // Editcount replace function for Template:EDITCOUNT // ================================================================================ // Inserts edit count into jQuery(function($) { var userEditCount = mw.config.get('wgUserEditCount');  if (userEditCount == null)    return;

$('.inserteditcount').text(userEditCount); });

// ================================================================================ // Registration date replace function for Template:REGISTRATIONDATE // ================================================================================ // Inserts registration date into jQuery(function($) { var userRegistrationDate = mw.config.get('wgUserRegistration');  if (userRegistrationDate == null)    return;  var d = new Date(0); // Sets the date to the epoch  d.setUTCMilliseconds(userRegistrationDate);

$('.insertregistrationdate').text(d.toLocaleString); });

// ================================================================================ // Injection into Upload Wizard for custom licensing and categories // ================================================================================ //https://commons.wikimedia.org/wiki/Commons:Upload_Wizard/Editing#License_options //https://www.mediawiki.org/wiki/Extension:UploadWizard/CustomWikiTextLicenseFeature

if ("UploadWizard" === mw.config.get('wgCanonicalSpecialPageName')) { mw.loader.using('ext.uploadWizard', function {    try {      var autoAdd = mw.config.get('UploadWizardConfig').autoAdd;      // Add a custom category to all my upload wizard uploads      // autoAdd.categories.push("Images");

// Add a custom license tag to all my files uploaded using the sorcerer autoAdd.wikitext += ""; } catch (ex) { mw.log("Injecting custom-category into UploadWizard failed.", ex); } }); }