User:Equazcion/userinfo.js

// Modified version of User:PleaseStand/userinfo.js

// ...which in turn is based on User:Fran Rogers/dimorphism.js

// ...and User:Splarka/sysopdectector.js.

/*global window, wgNamespaceNumber, wgTitle, wgFormattedNamespaces

wgScriptPath, addOnloadHook, importScriptURI, sajax_init_object*/

// for non-Firefox browsers

if(!Array.prototype.map) {

Array.prototype.map = function(fun /*, thisp*/) {

var len = this.length >>> 0;

if (typeof fun != "function") {

throw new TypeError();

}

var res = new Array(len);

var thisp = arguments[1];

for (var i = 0; i < len; i++) {

if (i in this) {

res[i] = fun.call(thisp, this[i], i, this);

}

}

return res;

};

}

function UserinfoJsParseDate(utcDate) {

// The ISO 8601 date format used by MediaWiki

var s = /^(\d\d\d\d)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)Z$/.exec(utcDate);

if(s === null) {

return null;

}

var d = new Date();

d.setUTCFullYear(s[1], s[2] - 1, s[3]);

d.setUTCHours(s[4], s[5], s[6]);

return d;

}

function UserinfoJsValidateIp(ip) {

var ipSplit = ip.split(".");

if(ipSplit.length != 4) {

return false;

}

if(ipSplit.map(function(s){return parseInt(s,10);}).join(".") != ip) {

return false;

}

return true;

}

function UserinfoJsFormatQty(qty, singular, plural) {

return qty + "\u00a0" + (qty == 1 ? singular : plural);

}

// If on a user or user talk page, and not a subpage...

if((mw.config.get('wgNamespaceNumber') == 2 || mw.config.get('wgNamespaceNumber') == 3) && !(/\//.test(mw.config.get('wgTitle')))) {

// add a hook to...

$(function(){

if(typeof sajax_init_object === 'undefined') return;

// Request the user's information from the API.

// Note that this is allowed to be up to 5 minutes old.

var x = sajax_init_object();

x.open("GET", mw.config.get('wgScriptPath') +

"/api.php?format=json&maxage=300&action=query&list=users&ususers=" +

encodeURIComponent(mw.config.get('wgTitle')) +

"&usprop=blockinfo|groups|editcount|registration|gender", true);

x.onreadystatechange = function() {

if(x.readyState != 4) {

return;

}

// When response arrives extract the information we need.

var user = eval("(" + x.responseText + ")").query.users[0];

var invalid = typeof user.invalid != "undefined";

var missing = typeof user.missing != "undefined";

var groups = (typeof user.groups == "object") ? user.groups : [];

var editcount = (typeof user.editcount == "number") ? user.editcount : null;

var registration = (typeof user.registration == "string") ?

UserinfoJsParseDate(user.registration) : null;

var blocked = typeof user.blockedby != "undefined";

var gender = (typeof user.gender == "string") ? user.gender : null;

// Format the information for on-screen display

// Gender

var genderSymbol;

switch(gender) {

case "male": genderSymbol = "\u2642"; break;

case "female": genderSymbol = "\u2640"; break;

default: genderSymbol = ""; break;

}

var statusText = "";

// Registration date

if(registration) {

// The code below requires the computer's clock to be set correctly.

var age = new Date().getTime() - registration.getTime();

var ageNumber, ageRemainder, ageWords;

if(age < 60000) {

// less than one minute old

ageNumber = Math.floor(age / 1000);

ageWords = UserinfoJsFormatQty(ageNumber, "second", "seconds");

} else if(age < 3600000) {

// less than one hour old

ageNumber = Math.floor(age / 60000);

ageWords = UserinfoJsFormatQty(ageNumber, "minute", "minutes");

} else if(age < 86400000) {

// less than one day old

ageNumber = Math.floor(age / 3600000);

ageWords = UserinfoJsFormatQty(ageNumber, "hour", "hours");

ageRemainder = Math.floor((age - ageNumber * 3600000) / 60000);

} else if(age < 604800000) {

// less than one week old

ageNumber = Math.floor(age / 86400000);

ageWords = UserinfoJsFormatQty(ageNumber, "day", "days");

} else if(age < 2592000000) {

// less than one month old

ageNumber = Math.floor(age / 604800000);

ageWords = UserinfoJsFormatQty(ageNumber, "week", "weeks");

} else if(age < 31536000000) {

// less than one year old

ageNumber = Math.floor(age / 2592000000);

ageWords = UserinfoJsFormatQty(ageNumber, "month", "months");

} else {

// one year or older

ageNumber = Math.floor(age / 31536000000);

ageWords = UserinfoJsFormatQty(ageNumber, "year", "years");

ageRemainder =

Math.floor((age - ageNumber * 31536000000) / 2592000000);

if(ageRemainder) {

ageWords += " " +

UserinfoJsFormatQty(ageRemainder, "month", "months");

}

}

statusText += "" + ageWords + " old";

}

// Edit count

if(editcount !== null) {

statusText += ", with " +

"

encodeURIComponent(user.name) +

"&lang=en&wiki=wikipedia\">" +

UserinfoJsFormatQty(editcount, "edit", "edits") + "";

}

// Now show the information at the top of the page

var fh = window.document.getElementById("firstHeading");

fh.appendChild(window.document.createTextNode(genderSymbol));

var stDiv = window.document.createElement("div");

// Non-standard? Yes, but it gets the job done.

stDiv.innerHTML = statusText;

fh.parentNode.insertBefore(stDiv, fh.nextSibling);

};

x.send(null);

});

}