MediaWiki:Gadget-UserInfo.js: Difference between revisions

From Test Wiki
Jump to navigation Jump to search
Content deleted Content added
No edit summary
No edit summary
 
(7 intermediate revisions by the same user not shown)
Line 1: Line 1:
// based on http://en.wikipedia.org/wiki/User:Fran Rogers/dimorphism.js
/* {{Catégorisation JS}}<nowiki> */
// and on http://en.wikipedia.org/wiki/User:Splarka/sysopdectector.js


/* imported from fr vikidia*/

// Basé sur [[wp:en:User:Fran Rogers/dimorphism.js]] et [[wp:en:User:Splarka/sysopdectector.js]] ;
// Modifié et retravaillé par Bulest85 et Matteo1234321.
// Traduction en --> fr par Matteo1234321
// (n'hésitez surtout pas à vous plaindre du fait qu'il ne sait pas parler anglais car c'est une vérité)

// Fonction qui met au pluriel au besoin.
function UserinfoJsFormatQty(qty, singular, plural) {
function UserinfoJsFormatQty(qty, singular, plural) {
return String(qty).replace(/\d{1,3}(?=(\d{3})+(?!\d))/g, "$& ") + "\u00a0" + (qty == 1 ? singular : plural);
return String(qty).replace(/\d{1,3}(?=(\d{3})+(?!\d))/g, "$&,") + "\u00a0" + (qty == 1 ? singular : plural);
}
}


function UserinfoJsFormatDateRel(old) {
function UserinfoJsFormatDateRel(old) {
// The code below requires the computer's clock to be set correctly.
// Ce code nécessite que l'horloge de l'ordinateur est correcte.
var age = new Date().getTime() - old.getTime();
var age = new Date().getTime() - old.getTime();
var ageNumber, ageRemainder, ageWords;
var ageNumber, ageRemainder, ageWords;
if(age < 60000) {
if(age < 60000) {
// Utilisateur enregistré il y a moins d'une minute.
// less than one minute old
ageNumber = Math.floor(age / 1000);
ageNumber = Math.floor(age / 1000);
ageWords = UserinfoJsFormatQty(ageNumber, "second", "seconds");
ageWords = UserinfoJsFormatQty(ageNumber, "second", "seconds");
} else if(age < 3600000) {
} else if(age < 3600000) {
// Utilisateur enregistré il y a moins d'une heure.
// less than one hour old
ageNumber = Math.floor(age / 60000);
ageNumber = Math.floor(age / 60000);
ageWords = UserinfoJsFormatQty(ageNumber, "minute", "minutes");
ageWords = UserinfoJsFormatQty(ageNumber, "minute", "minutes");
} else if(age < 86400000) {
} else if(age < 86400000) {
// Utilisateur enregistré il y a moins d'un jour.
// less than one day old
ageNumber = Math.floor(age / 3600000);
ageNumber = Math.floor(age / 3600000);
ageWords = UserinfoJsFormatQty(ageNumber, "hour", "hours");
ageWords = UserinfoJsFormatQty(ageNumber, "hour", "hours");
ageRemainder = Math.floor((age - ageNumber * 3600000) / 60000);
ageRemainder = Math.floor((age - ageNumber * 3600000) / 60000);
} else if(age < 604800000) {
} else if(age < 604800000) {
// Utilisateur enregistré il y a moins d'une semaine.
// less than one week old
ageNumber = Math.floor(age / 86400000);
ageNumber = Math.floor(age / 86400000);
ageWords = UserinfoJsFormatQty(ageNumber, "day", "days");
ageWords = UserinfoJsFormatQty(ageNumber, "day", "days");
} else if(age < 2592000000) {
} else if(age < 2592000000) {
// Utilisateur enregistré il y a moins d'un mois.
// less than one month old
ageNumber = Math.floor(age / 604800000);
ageNumber = Math.floor(age / 604800000);
ageWords = UserinfoJsFormatQty(ageNumber, "week", "weeks");
ageWords = UserinfoJsFormatQty(ageNumber, "week", "weeks");
} else if(age < 31536000000) {
} else if(age < 31536000000) {
// Utilisateur enregistré il y a moins d'un an.
// less than one year old
ageNumber = Math.floor(age / 2592000000);
ageNumber = Math.floor(age / 2592000000);
ageWords = UserinfoJsFormatQty(ageNumber, "month", "months");
ageWords = UserinfoJsFormatQty(ageNumber, "month", "months");
} else {
} else {
// Utilisateur enregistré il y a plus d'un an.
// one year or older
ageNumber = Math.floor(age / 31536000000);
ageNumber = Math.floor(age / 31536000000);
ageWords = UserinfoJsFormatQty(ageNumber, "year", "years");
ageWords = UserinfoJsFormatQty(ageNumber, "year", "years");
Line 56: Line 49:
}
}


// If on a user or user talk page, and not a subpage...
// Afficher les infos utilisateur seulement sur la page utilisteur et de discussion dudit utilisateur...
if((mw.config.get("wgNamespaceNumber") == 2 || mw.config.get("wgNamespaceNumber") == 3) && !(/\//.test(mw.config.get("wgTitle")))) {
if((mw.config.get("wgNamespaceNumber") == 2 || mw.config.get("wgNamespaceNumber") == 3) && !(/\//.test(mw.config.get("wgTitle")))) {
// Ajout d'un crochet...
// add a hook to...
mw.loader.using( ['mediawiki.util'], function() { $(function(){
mw.loader.using( ['mediawiki.util'], function() { $(function(){
// Demander les informations de l'utilisateur via l'API.
// Request the user's information from the API.
// Noter que ceci est autorisé jusqu'à l'âge de 5 minutes [traduction douteuse].
// Note that this is allowed to be up to 5 minutes old.
var et = encodeURIComponent(mw.config.get("wgTitle"));
var et = encodeURIComponent(mw.config.get("wgTitle"));
$.getJSON(mw.config.get("wgScriptPath") + "/api.php?format=json&action=query&list=users|usercontribs&usprop=blockinfo|editcount|gender|registration|groups&uclimit=1&ucprop=timestamp&ususers=" + et + "&ucuser=" + et + "&meta=allmessages&amprefix=grouppage-&amincludelocal=1")
$.getJSON(mw.config.get("wgScriptPath") + "/api.php?format=json&action=query&list=users|usercontribs&usprop=blockinfo|editcount|gender|registration|groups&uclimit=1&ucprop=timestamp&ususers=" + et + "&ucuser=" + et + "&meta=allmessages&amprefix=grouppage-&amincludelocal=1")
.done(function(query) {
.done(function(query) {
// Quand les informations arrivent, extrayons-en celles dont on a besoin.
// When response arrives extract the information we need.
if(!query.query) { return; } // Suggéré par [[wp:en:User:Gary]] pour éviter les erreurs JavaScript. --PS 25.08.2010
if(!query.query) { return; } // Suggested by Gary King to avoid JS errors --PS 2010-08-25
query = query.query;
query = query.query;
var user, invalid, missing, groups, groupPages={}, editcount, registration, blocked, gender, lastEdited;
var user, invalid, missing, groups, groupPages={}, editcount, registration, blocked, gender, lastEdited;
Line 84: Line 77:
new Date(query.usercontribs[0].timestamp) : null;
new Date(query.usercontribs[0].timestamp) : null;
for (var am=0; am<query.allmessages.length; am++) {
for (var am=0; am<query.allmessages.length; am++) {
groupPages[query.allmessages[am].name.replace("grouppage-","")] = query.allmessages[am]["*"].replace("{{ns:project}}:","Project:");
groupPages[query.allmessages[am]["name"].replace("grouppage-","")] = query.allmessages[am]["*"].replace("{{ns:project}}:","Project:");
}
}
} catch(e) {
} catch(e) {
return; // Pas beaucoup à faira quand le serveur renvoie une erreur (par exemple le nom de l'utilisateur est mal formé)...
return; // Not much to do if the server is returning an error (e.g. if the username is malformed).
}
}


// Formatage des informations affichées.
// Format the information for on-screen display
// Ces trois variables déterminent le genre de l'utilisateur/trice et modifient le texte.
var userf, userf2, userf3;
switch(gender) {
case "male":
userf = "", userf2 = "eur", userf3 = "eur";
break;
case "female":
userf = "e", userf2 = "rice", userf3 = "euse";
break;
default:
userf = "", userf2 = "eur", userf3 = "eur";
}
var statusText = "";
var statusText = "";
var ipUser = false;
var ipUser = false;
Line 108: Line 90:
var ipv6User = false;
var ipv6User = false;


// User status
if(blocked) {
statusText += "<a href=\"" + mw.config.get("wgScriptPath") +
"/index.php?title=Special:Log&amp;page=" +
encodeURIComponent(mw.config.get("wgFormattedNamespaces")[2] + ":" + user.name) +
"&amp;type=block\">blocked</a> ";
}
if (missing) {
if (missing) {
statusText += "nom d'utilisateur non enregistré";
statusText += "username not registered";
} else if (invalid) {
} else if (invalid) {
ipv4User = mw.util.isIPv4Address(user.name);
ipv4User = mw.util.isIPv4Address(user.name);
Line 115: Line 104:
ipUser = ipv4User || ipv6User;
ipUser = ipv4User || ipv6User;
if (ipv4User) {
if (ipv4User) {
statusText += "utilisateur anonyme IPv4";
statusText += "anonymous IPv4 user";
} else if (ipv6User) {
} else if (ipv6User) {
statusText += "utilisateur anonyme IPv6";
statusText += "anonymous IPv6 user";
} else {
} else {
statusText += "nom d'utilisateur non valide";
statusText += "invalid username";
}
}
} else {
} else {
// L'utilisateur est enregistré et pourrait être dans un groupe privilégié. En dessous un liste desdits groupes.
// User is registered and may be in a privileged group. Below we have a list of user groups.
// Nous avons juste besoin de ceux différents de ceux du programme (ou ceux à exclure).
// Only need the ones different from the software's name (or ones to exclude), though.
var friendlyGroupNames = {
var friendlyGroupNames = {
// Exclure les groupes implicites des utilisateurs ; par MW 1.17. --PS 17.02.2012
// Exclude implicit user group information provided by MW 1.17 --PS 2010-02-17
'*': false,
'*': false,
'user': false,
'user': false,
autoconfirmed: "autoconfirmé" + userf,
'autoconfirmed': false,
sysop: "administrat" + userf2,
'named': false,
'interface-admin': "administrat" + userf2 + " d'interface",
sysop: "administrator",
bureaucrat: "bureaucrate",
accountcreator: "account creator",
checkuser: "vérificat" + userf2 + " d'utilisateurs",
'import': "importer",
developer: "développ" + userf2,
transwiki: "transwiki importer",
accountcreator: "créateur de comptes",
'ipblock-exempt': "IP block exemption",
'import': "importat" + userf2,
confirmed: "confirmed user",
transwiki: "importat" + userf2 + " transwikis",
'abusefilter-admin': "edit filter manager",
'ipblock-exempt': "exempté" + userf + " du blocage IP",
'abusefilter-helper': "edit filter helper",
oversight: "supervis" + userf3,
autoreviewer: "autopatrolled user",
confirmed: "utilisat" + userf2 + " confirmé" + userf,
abusefilter: "configurat" + userf2 + " des filtres antiabus",
'abusefilter-helper': "aide Abuse Filter",
autoreviewer: "utlisat" + userf2 + " autovérifié" + userf,
epcoordinator: "Education Program course coordinator",
epcampus: "Education Program campus volunteer",
epinstructor: "Education Program instructor",
eponline: "Education Program online volunteer",
filemover: "file mover",
filemover: "file mover",
'massmessage-sender': "mass message sender",
'massmessage-sender': "mass message sender",
Line 152: Line 133:
extendedconfirmed: "extended confirmed user",
extendedconfirmed: "extended confirmed user",
extendedmover: "page mover",
extendedmover: "page mover",
'flow-bot': "Bot Flow",
reviewer: "pending changes reviewer",
reviewer: "pending changes reviewer",
suppress: "nuker",
suppress: "oversighter",
bot: "robot",
patroller: "new page reviewer",
patroller: "patrouill" + userf3
copyviobot: "copyright violation bot",
eventcoordinator: "event coordinator",
'interface-admin': "interface administrator",
exampleuser: "example user",
'interwiki-admin': "interwiki administrator"
};
};
Line 173: Line 157:
switch(friendlyGroups.length) {
switch(friendlyGroups.length) {
case 0:
case 0:
// L'utilisateur n'est pas dans un groupe privilégié.
// User not in a privileged group
// Changé à « utilisateur enregistré » (« registered user » en anglais) à la demande de [[wp:en:User:RiverStyx23]]. --PS 16.05.2010
// Changed to "registered user" by request of [[User:Svanslyck]]
// --PS 2010-05-16
// statusText += "utilisateur";
// statusText += "user";
if(blocked) {
if(blocked) {
statusText += "utilisat" + userf2;
statusText += "user";
} else {
} else {
statusText += "utilisat" + userf2 + " enregistré" + userf;
statusText += "registered user";
}
}
break;
break;
Line 187: Line 172:
break;
break;
case 2:
case 2:
statusText += friendlyGroups[0] + " et " + friendlyGroups[1];
statusText += friendlyGroups[0] + " and " + friendlyGroups[1];
break;
break;
default:
default:
statusText += friendlyGroups.slice(0, -1).join(", ") +
statusText += friendlyGroups.slice(0, -1).join(", ") +
", et " + friendlyGroups[friendlyGroups.length - 1];
", and " + friendlyGroups[friendlyGroups.length - 1];
break;
break;
}
}
}
// Statut de l'utilisateur ; est-il bloqué ?
if(blocked) {
statusText += "<a href=\"" + mw.config.get("wgScriptPath") +
"/index.php?title=Special:Log&amp;page=" +
encodeURIComponent(mw.config.get("wgFormattedNamespaces")[2] + ":" + user.name) +
"&amp;type=block\">&nbsp;bloqué" + userf +"</a>";
}
}
// Date de la création du compte.
// Registration date
if(registration) {
if(registration) {
var firstLoggedUser = new Date("17:42, 22 January 2008"); // When the [[Special:Log/newusers]] was first activated
var firstLoggedUser = new Date("22:16, 7 September 2005"); // When the [[Special:Log/newusers]] was first activated
if(registration >= firstLoggedUser) {
if(registration >= firstLoggedUser) {
statusText += ", enregistré" + userf + " il y a <a href='" + mw.config.get("wgScriptPath") +
statusText += ", <a href='" + mw.config.get("wgScriptPath") +
"/index.php?title=Special:Log&amp;type=newusers&amp;dir=prev&amp;limit=1&amp;user=" +
"/index.php?title=Special:Log&amp;type=newusers&amp;dir=prev&amp;limit=1&amp;user=" +
et + "'>" + UserinfoJsFormatDateRel(registration) + "</a>";
et + "'>" + UserinfoJsFormatDateRel(registration) + "</a> old";
} else {
} else {
statusText += ", enregistré" + userf + " il y a <a href='" + mw.config.get("wgScriptPath") +
statusText += ", <a href='" + mw.config.get("wgScriptPath") +
"/index.php?title=Special:ListUsers&amp;limit=1&amp;username=" +
"/index.php?title=Special:ListUsers&amp;limit=1&amp;username=" +
et + "'>" + UserinfoJsFormatDateRel(registration) + "</a>";
et + "'>" + UserinfoJsFormatDateRel(registration) + "</a> old";
}
}
}
}
// Compteur du nombre d'éditions.
// Edit count
if(editcount !== null) {
if(editcount !== null) {
statusText += ", avec " +
statusText += ", with " +
"<a href=\"https://fr.vikidia.org/wiki/Spécial:Contributions/" +
"<a href=\"//testwiki.wiki/wiki/Special:Editcount/" +
encodeURIComponent(user.name) + "\">" +
encodeURIComponent(user.name) +
UserinfoJsFormatQty(editcount, "modification", "modifications") + "</a>";
"\">" +
UserinfoJsFormatQty(editcount, "edit", "edits") + "</a>";
}
}
// Prefix status text with correct article
// Déterminant
if("AEIOaeio".indexOf(statusText.charAt(statusText.indexOf('>')+1)) >= 0) {
if("AEIOaeio".indexOf(statusText.charAt(statusText.indexOf('>')+1)) >= 0) {
statusText = "Un" + userf + " " + statusText;
statusText = "An " + statusText;
} else {
} else {
statusText = "Un" + userf + " " + statusText;
statusText = "A " + statusText;
}
}
// Point à la fin de la phrase, mais seulement si l'utilisateur a des contributions.
if(lastEdited) {
statusText += ".";
};


// Dernière modification --PS 27.06.2010
// Add full stop to status text
statusText += ".";
// Ajout d'un lien à la page de contributions --PS 3.07.201

// Last edited --PS 2010-06-27
// Added link to contributions page --PS 2010-07-03
if(lastEdited) {
if(lastEdited) {
statusText += " Dernière modification il y a <a href=\"" + mw.config.get("wgArticlePath").replace("$1", "Spécial:Contributions/" + encodeURIComponent(user.name)) + "\">" + UserinfoJsFormatDateRel(lastEdited) + "</a>";
statusText += " Last edited <a href=\"" + mw.config.get("wgArticlePath").replace("$1", "Special:Contributions/" + encodeURIComponent(user.name)) + "\">" + UserinfoJsFormatDateRel(lastEdited) + " ago</a>.";
};
}

// Ajouter le symbole de genre correct.
// Show the correct gender symbol
var fh = document.getElementById("firstHeading") ||
var fh = document.getElementById("firstHeading") ||
document.getElementById("section-0");
document.getElementById("section-0");
if(!fh) return; // e.g. Minerva user talk pages
// Ajout de classes pour les utilisateurs bloqués, enregistrés et anonymes (IPs).
// Add classes for blocked, registered, and anonymous users
var newClasses = [];
var newClasses = [];
if(blocked) {
if(blocked) {
Line 269: Line 248:
case "male": genderSymbol = "\u2642"; break;
case "male": genderSymbol = "\u2642"; break;
case "female": genderSymbol = "\u2640"; break;
case "female": genderSymbol = "\u2640"; break;
default: genderSymbol = "";
default: genderSymbol = ""; break;
}
}
genderSpan.appendChild(document.createTextNode(genderSymbol));
genderSpan.appendChild(document.createTextNode(genderSymbol));
fh.appendChild(genderSpan);
fh.appendChild(genderSpan);


// Maintenant, ajouter les autres informations. Pas standard, mais au moins ça fait le taf ^^.
// Now show the other information. Non-standard? Yes, but it gets the job done.
// Ajouter un point après le texte en faisant ainsi. --PS 3.07.2010
// Add a period after the tagline when doing so. --PS 2010-07-03


var ss = document.getElementById("siteSub");
var ss = document.getElementById("siteSub");
Line 281: Line 260:
ss = document.createElement("div");
ss = document.createElement("div");
ss.id = "siteSub";
ss.id = "siteSub";
ss.innerHTML = "";
ss.innerHTML = "Test Wiki.";
var bc = document.getElementById("bodyContent");
var bc = document.getElementById("bodyContent");
bc.insertBefore(ss, bc.firstChild);
bc.insertBefore(ss, bc.firstChild);
}
}
ss.innerHTML = '<span id="ps-userinfo">' + statusText + '</span>' + ss.innerHTML + '.';
ss.innerHTML = '<span id="ps-userinfo">' + statusText + '</span> ' + ss.innerHTML + '.';
ss.style.display = "block";
ss.style.display = "block";
});
});
}); });
}); });
}
}
/* </nowiki> */

Latest revision as of 20:51, 29 May 2024

// based on http://en.wikipedia.org/wiki/User:Fran Rogers/dimorphism.js
// and on http://en.wikipedia.org/wiki/User:Splarka/sysopdectector.js

function UserinfoJsFormatQty(qty, singular, plural) {
    return String(qty).replace(/\d{1,3}(?=(\d{3})+(?!\d))/g, "$&,") + "\u00a0" + (qty == 1 ? singular : plural);
}

function UserinfoJsFormatDateRel(old) {
// The code below requires the computer's clock to be set correctly.
            var age = new Date().getTime() - old.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");
                }
           }
           return ageWords;
}

// 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...
    mw.loader.using( ['mediawiki.util'], function() { $(function(){
        // Request the user's information from the API.
        // Note that this is allowed to be up to 5 minutes old.
        var et = encodeURIComponent(mw.config.get("wgTitle"));
        
        $.getJSON(mw.config.get("wgScriptPath") + "/api.php?format=json&action=query&list=users|usercontribs&usprop=blockinfo|editcount|gender|registration|groups&uclimit=1&ucprop=timestamp&ususers=" + et + "&ucuser=" + et + "&meta=allmessages&amprefix=grouppage-&amincludelocal=1")
        .done(function(query) {
            // When response arrives extract the information we need.
            if(!query.query) { return; } // Suggested by Gary King to avoid JS errors --PS 2010-08-25
            query = query.query;
            var user, invalid, missing, groups, groupPages={}, editcount, registration, blocked, gender, lastEdited;
            try {
                user = query.users[0];
                invalid = typeof user.invalid != "undefined";
                missing = typeof user.missing != "undefined";
                groups = (typeof user.groups == "object") ? user.groups : [];
                editcount = (typeof user.editcount == "number") ? user.editcount : null;
                registration = (typeof user.registration == "string") ?
                    new Date(user.registration) : null;
                blocked = typeof user.blockedby != "undefined";
                gender = (typeof user.gender == "string") ? user.gender : null;
                lastEdited = (typeof query.usercontribs[0] == "object") &&
                    (typeof query.usercontribs[0].timestamp == "string") ?
                    new Date(query.usercontribs[0].timestamp) : null;
                for (var am=0; am<query.allmessages.length; am++) {
                	groupPages[query.allmessages[am]["name"].replace("grouppage-","")] = query.allmessages[am]["*"].replace("{{ns:project}}:","Project:");
                }
            } catch(e) {
                return; // Not much to do if the server is returning an error (e.g. if the username is malformed).
            }

            // Format the information for on-screen display
            
            var statusText = "";
            var ipUser = false;
            var ipv4User = false;
            var ipv6User = false;

            // User status
            if(blocked) {
                statusText += "<a href=\"" + mw.config.get("wgScriptPath") +
                    "/index.php?title=Special:Log&amp;page=" + 
                    encodeURIComponent(mw.config.get("wgFormattedNamespaces")[2] + ":" + user.name) +
                    "&amp;type=block\">blocked</a> ";
            }
            if (missing) {
                statusText += "username not registered";
            } else if (invalid) {
                ipv4User = mw.util.isIPv4Address(user.name);
                ipv6User = mw.util.isIPv6Address(user.name);
                ipUser = ipv4User || ipv6User;
                if (ipv4User) {
                    statusText += "anonymous IPv4 user";
                } else if (ipv6User) {
                    statusText += "anonymous IPv6 user";
                } else {
                    statusText += "invalid username";
                }
            } else {
                // User is registered and may be in a privileged group. Below we have a list of user groups.
                // Only need the ones different from the software's name (or ones to exclude), though.
                var friendlyGroupNames = {
                    // Exclude implicit user group information provided by MW 1.17 --PS 2010-02-17
                    '*': false,
                    'user': false,
                    'autoconfirmed': false,
                    'named': false,
                    sysop: "administrator",
                    accountcreator: "account creator",
                    'import': "importer",
                    transwiki: "transwiki importer",
                    'ipblock-exempt': "IP block exemption",
                    confirmed: "confirmed user",
                    'abusefilter-admin': "edit filter manager",
                    'abusefilter-helper': "edit filter helper",
                    autoreviewer: "autopatrolled user",
                    filemover: "file mover",
                    'massmessage-sender': "mass message sender",
                    templateeditor: "template editor",
                    extendedconfirmed: "extended confirmed user",
                    extendedmover: "page mover",
                    reviewer: "pending changes reviewer",
                    suppress: "oversighter",
                    patroller: "new page reviewer",
                    copyviobot: "copyright violation bot",
                    eventcoordinator: "event coordinator",
                    'interface-admin': "interface administrator",
                    exampleuser: "example user",
                    'interwiki-admin': "interwiki administrator"
                };
                
                var friendlyGroups = [];
                for(var i = 0; i < groups.length; ++i) {
					var s = groups[i];
                    var t = friendlyGroupNames.hasOwnProperty(s) ? friendlyGroupNames[s] : s;
                    if (t) {
                    	if (groupPages.hasOwnProperty(s)) {
                    		friendlyGroups.push("<a href=\"/wiki/" + encodeURIComponent( groupPages[s] ) + "\">" + t + "</a>");
                    	} else {
                    		friendlyGroups.push(t);
                    	}
                    }
                }
                switch(friendlyGroups.length) {
                    case 0:
                        // User not in a privileged group
                        // Changed to "registered user" by request of [[User:Svanslyck]]
                        // --PS 2010-05-16
                        
                        // statusText += "user";
                        if(blocked) {
                            statusText += "user";
                        } else {
                            statusText += "registered user";
                        }
                        break;
                    case 1:
                        statusText += friendlyGroups[0];
                        break;
                    case 2:
                        statusText += friendlyGroups[0] + " and " + friendlyGroups[1];
                        break;
                    default:
                        statusText += friendlyGroups.slice(0, -1).join(", ") +
                            ", and " + friendlyGroups[friendlyGroups.length - 1];
                        break;
                }
            }
                
            // Registration date
            if(registration) {
            	var firstLoggedUser = new Date("22:16, 7 September 2005"); // When the [[Special:Log/newusers]] was first activated
            	if(registration >= firstLoggedUser) {
            		statusText += ", <a href='" + mw.config.get("wgScriptPath") +
                    "/index.php?title=Special:Log&amp;type=newusers&amp;dir=prev&amp;limit=1&amp;user=" +
                    et + "'>" + UserinfoJsFormatDateRel(registration) + "</a> old";
            	} else {
            		statusText += ", <a href='" + mw.config.get("wgScriptPath") +
                    "/index.php?title=Special:ListUsers&amp;limit=1&amp;username=" +
                    et + "'>" + UserinfoJsFormatDateRel(registration) + "</a> old";
            	}
            }
            
            // Edit count
            if(editcount !== null) {
                statusText += ", with " +
                    "<a href=\"//testwiki.wiki/wiki/Special:Editcount/" +
                    encodeURIComponent(user.name) +
                    "\">" +
                    UserinfoJsFormatQty(editcount, "edit", "edits") + "</a>";
            }
            
            // Prefix status text with correct article
            if("AEIOaeio".indexOf(statusText.charAt(statusText.indexOf('>')+1)) >= 0) {
                statusText = "An " + statusText;
            } else {
                statusText = "A " + statusText;
            }

            // Add full stop to status text
            statusText += ".";

            // Last edited --PS 2010-06-27
            // Added link to contributions page --PS 2010-07-03
            if(lastEdited) {
                statusText += " Last edited <a href=\"" + mw.config.get("wgArticlePath").replace("$1", "Special:Contributions/" + encodeURIComponent(user.name)) + "\">" + UserinfoJsFormatDateRel(lastEdited) + " ago</a>.";
            }

            // Show the correct gender symbol
            var fh = document.getElementById("firstHeading") ||
                document.getElementById("section-0");
            if(!fh) return; // e.g. Minerva user talk pages
            // Add classes for blocked, registered, and anonymous users
            var newClasses = [];
            if(blocked) {
                newClasses.push("ps-blocked");
            }
            if(ipUser) {
                newClasses.push("ps-anonymous");
            } else if(invalid) {
                newClasses.push("ps-invalid");
            } else {
                newClasses.push("ps-registered");
            }
            fh.className += (fh.className.length ? " " : "") + groups.map(function(s) {
                return "ps-group-" + s;
            }).concat(newClasses).join(" ");
            var genderSpan = document.createElement("span");
            genderSpan.id = "ps-gender-" + (gender || "unknown");
            genderSpan.style.paddingLeft = "0.25em";
            genderSpan.style.fontFamily = '"Lucida Grande", "Lucida Sans Unicode", "sans-serif"';
            genderSpan.style.fontSize = "75%";
            var genderSymbol;
            switch(gender) {
                case "male": genderSymbol = "\u2642"; break;
                case "female": genderSymbol = "\u2640"; break;
                default: genderSymbol = ""; break;
            }
            genderSpan.appendChild(document.createTextNode(genderSymbol));
            fh.appendChild(genderSpan);

            // Now show the other information. Non-standard? Yes, but it gets the job done.
            // Add a period after the tagline when doing so. --PS 2010-07-03

            var ss = document.getElementById("siteSub");
            if(!ss) {
                ss = document.createElement("div");
                ss.id = "siteSub";
                ss.innerHTML = "Test Wiki.";
                var bc = document.getElementById("bodyContent");
                bc.insertBefore(ss, bc.firstChild);
            }
            ss.innerHTML = '<span id="ps-userinfo">' + statusText + '</span> ' + ss.innerHTML + '.';
            ss.style.display = "block";
            });
    }); });
}