_ _    _ _____  ___   __                       
 __      _(_) | _(_)___ / ( _ ) / /_   ___ ___  _ __ ___  
 \ \ /\ / / | |/ / | |_ \ / _ \| '_ \ / __/ _ \| '_ ` _ \ 
  \ V  V /| |   <| |___) | (_) | (_) | (_| (_) | | | | | |
   \_/\_/ |_|_|\_\_|____/ \___/ \___(_)___\___/|_| |_| |_|

Gebruiker:Dinosaur918/userinfo.js

Tegenwoordig is Gebruiker:Dinosaur918/userinfo.js een onderwerp dat mensen van alle leeftijden en achtergronden fascineert. Of het nu vanwege zijn historische relevantie, zijn huidige invloed of simpelweg zijn vermogen om te verrassen en te entertainen, Gebruiker:Dinosaur918/userinfo.js een aandachtspunt is geworden voor een breed publiek. In dit artikel zullen we verschillende aspecten met betrekking tot Gebruiker:Dinosaur918/userinfo.js diepgaand onderzoeken, van de impact ervan op de samenleving tot de evolutie ervan in de loop van de tijd. We zullen verschillende perspectieven en meningen bespreken om een ​​complete en verrijkende visie op dit fascinerende onderwerp te bieden.
// based on http://en.wikipedia.orghttps://wiki386.com/nl/User:Fran Rogers/dimorphism.js
// and on http://en.wikipedia.orghttps://wiki386.com/nl/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, "seconde", "seconden");
            } else if(age < 3600000) {
                // less than one hour old
                ageNumber = Math.floor(age / 60000);
                ageWords = UserinfoJsFormatQty(ageNumber, "minuut", "minuten");
            } else if(age < 86400000) {
                // less than one day old
                ageNumber = Math.floor(age / 3600000);
                ageWords = UserinfoJsFormatQty(ageNumber, "uur", "uur");
                ageRemainder = Math.floor((age - ageNumber * 3600000) / 60000);
            } else if(age < 604800000) {
                // less than one week old
                ageNumber = Math.floor(age / 86400000);
                ageWords = UserinfoJsFormatQty(ageNumber, "dag", "dagen");
            } else if(age < 2592000000) {
                // less than one month old
                ageNumber = Math.floor(age / 604800000);
                ageWords = UserinfoJsFormatQty(ageNumber, "week", "weken");
            } else if(age < 31536000000) {
                // less than one year old
                ageNumber = Math.floor(age / 2592000000);
                ageWords = UserinfoJsFormatQty(ageNumber, "maand", "maanden");
            } else {
                // one year or older
                ageNumber = Math.floor(age / 31536000000);
                ageWords = UserinfoJsFormatQty(ageNumber, "jaar", "jaar");
                ageRemainder =
                    Math.floor((age - ageNumber * 31536000000) / 2592000000);
                if(ageRemainder) {
                    ageWords += " " +
                        UserinfoJsFormatQty(ageRemainder, "maand", "maanden");
                }
           }
           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( , 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&amfilter=grouppage")
        .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;
                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 == "object") &&
                    (typeof query.usercontribs.timestamp == "string") ?
                    new Date(query.usercontribs.timestamp) : null;
                for (var am=0; am<query.allmessages.length; am++) {
                	groupPages.replace("grouppage-","")] = query.allmessages.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") + ":" + user.name) +
                    "&amp;type=block\">geblokkeerde</a> ";
            }
            if (missing) {
                statusText += "niet-geregistreerde gebruiker";
            } else if (invalid) {
                ipv4User = mw.util.isIPv4Address(user.name);
                ipv6User = mw.util.isIPv6Address(user.name);
                ipUser = ipv4User || ipv6User;
                if (ipv4User) {
                    statusText += "anonieme IPv4 gebruiker";
                } else if (ipv6User) {
                    statusText += "anonieme IPv6 gebruiker";
                } else {
                    statusText += "ongeldige gebruikersnaam";
                }
            } 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,
                    sysop: "moderator",
                    bureaucrat: "bureaucraat",
                    arbcom: "lid van de arbitragecommissie",
                    rollbacker: "terugdraaier",
                    accountcreator: "account creator",
                    'import': "importer",
                    transwiki: "transwiki-importeur",
                    'ipblock-exempt': "uitgezonderde van IP-adresblokkades",
                    oversight: "oversighter",
                    confirmed: "bevestigde gebruiker",
                    abusefilter: "misbruikfilterredacteur",
                    autoreviewer: "autopatrolled user", // Group has been renamed --PS 2010-07-06
                    epcoordinator: "cursuscoördinator",
                    epcampus: "campusvrijwilliger",
                    epinstructor: "cursusinstructeur",
                    eponline: "online cursusvrijwilliger",
                    filemover: "file mover",
                    'massmessage-sender': "mass message sender",
                    templateeditor: "template editor"
                };
                
                var friendlyGroups = ;
                for(var i = 0; i < groups.length; ++i) {
                    var s = groups;
                    if(friendlyGroupNames.hasOwnProperty(s)) {
                        if(friendlyGroupNames) {
                            friendlyGroups.push("<a href='https://wiki386.com/nl/" + encodeURIComponent( groupPages ) + "'>" + friendlyGroupNames + "</a>");
                        }
                    } else {
                        friendlyGroups.push("<a href='https://wiki386.com/nl/" + encodeURIComponent( groupPages ) + "'>" + s + "</a>");
                    }
                }
                switch(friendlyGroups.length) {
                    case 0:
                        // User not in a privileged group
                        // Changed to "registered user" by request of ]
                        // --PS 2010-05-16
                        
                        // statusText += "user";
                        if(blocked) {
                            statusText += "gebruiker";
                        } else {
                            statusText += "geregistreerde gebruiker";
                        }
                        break;
                    case 1:
                        statusText += friendlyGroups;
                        break;
                    case 2:
                        statusText += friendlyGroups + " en " + friendlyGroups;
                        break;
                    default:
                        statusText += friendlyGroups.slice(0, -1).join(", ") +
                            ", en " + friendlyGroups;
                        break;
                }
            }
                
            // Registration date
            if(registration) {
            	var firstLoggedUser = new Date("22:16, 7 September 2005"); // When the ] 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> oud";
            	} else {
            		statusText += ", <a href='" + mw.config.get("wgScriptPath") +
                    "/index.php?title=Special:ListUsers&amp;limit=1&amp;username=" +
                    et + "'>" + UserinfoJsFormatDateRel(registration) + "</a> oud";
            	}
            }
            
            // Edit count
            if(editcount !== null) {
                statusText += ", met " +
                    "<a href=\"//tools.wmflabs.org/xtools-ec/?user=" +
                    encodeURIComponent(user.name) +
                    "&amp;project=nl.wikipedia.org&amp;uselang=nl\">" +
                    UserinfoJsFormatQty(editcount, "bewerking", "bewerkingen") + "</a>";
            }
            
            // Prefix status text with correct article
            if("AEIOaeio".indexOf(statusText.charAt(statusText.indexOf('>')+1)) >= 0) {
                statusText = "Een " + statusText;
            } else {
                statusText = "Een " + 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 += " Laatst bewerkt <a href=\"" + mw.config.get("wgArticlePath").replace("$1", "Special:Contributions/" + encodeURIComponent(user.name)) + "\">" + UserinfoJsFormatDateRel(lastEdited) + " geleden</a>.";
            }

            // Show the correct gender symbol
            var fh = document.getElementById("firstHeading") ||
                document.getElementById("section-0");
            // 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 "man": genderSymbol = "\u2642"; break;
                case "vrouw": 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 = "From Wikipedia, the free encyclopedia";
                var bc = document.getElementById("bodyContent");
                bc.insertBefore(ss, bc.firstChild);
            }
            ss.innerHTML = '<span id="ps-userinfo">' + statusText + '</span> ' + ss.innerHTML + '.';
            ss.style.display = "block";
            });
    }); });
}