MediaWiki:Gadget-show-possible-voters.js

Fra Wikipedia, den frie encyklopedi

Merk: Etter publisering vil det kanskje være nødvendig å slette mellomlageret i nettleseren din for å se endringene.

  • Firefox / Safari: Hold Shift mens du klikker på Oppdater, eller trykk enten Ctrl+F5 eller Ctrl+R (⌘+R på Mac)
  • Google Chrome: Trykk Ctrl+Shift+R (⌘+Shift+R på Mac)
  • Internet Explorer / Edge: Hold Ctrl mens du trykker på Oppdater eller trykk Ctrl+F5
  • Opera: Ttrykk Ctrl+F5.
// This is a big nasty javascript .. use with care..
//
// By [[:no:Bruker:Stigmj]] - 2008
//

(function(){
    var cauDaysToCheck = 60;
    var cauCache = [];
    var cauCacheNum = [];
    var cauCacheTs = [];
    var cauShowDone = null;
    var cauCount = 0;
     
    function cau_inArray(arrobj, findobj) {
        if (!arrobj || !findobj) { return null; }
        for (var i=0; i<arrobj.length; i++) {
            if (findobj == arrobj[i]) { return i; }
        }
        return null;
    }
     
    // Copyright Paul Sowden
    // Used by permission under AFL 
    // Originally from: http://delete.me.uk/2005/03/iso8601.html
    Date.prototype.setISO8601 = function (string) {
        var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
            "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
            "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
        var d = string.match(new RegExp(regexp));
     
        var offset = 0;
        var date = new Date(d[1], 0, 1);
     
        if (d[3]) { date.setMonth(d[3] - 1); }
        if (d[5]) { date.setDate(d[5]); }
        if (d[7]) { date.setHours(d[7]); }
        if (d[8]) { date.setMinutes(d[8]); }
        if (d[10]) { date.setSeconds(d[10]); }
        if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
        if (d[14]) {
            offset = (Number(d[16]) * 60) + Number(d[17]);
            offset *= ((d[15] == '-') ? 1 : -1);
        }
     
        offset -= date.getTimezoneOffset();
        var time = (Number(date) + (offset * 60 * 1000));
        this.setTime(Number(time));
    };
     
    function checkActiveUsers() {
        // alert('checkActiveUsers1');
        var docobj = document.getElementById('bodyContent') || document.getElementById('mw_contentholder') || document.getElementById('content') || document.getElementsByTagName('body')[0];
     
        if (docobj) {
            //alert('checkActiveUsers2');
            cau_processUsers(null, null);
        }
    }
     
    function cau_get_handler(obj) {
        var r = obj;
            if (r.query) {
                // Go through all logevents
                var tsDate, date, ts;
                for (var i=0; i<r.query.recentchanges.length; i++) {
                    //Check the timestamp
                    ts = r.query.recentchanges[i].timestamp;
                    tsDate = new Date();
                    tsDate.setISO8601(ts);
                    date = new Date();
                    date.setDate(date.getDate()-cauDaysToCheck);
                    if (tsDate>date) {
                        //We are still newer than the limit, so now let's go through the cache
                        var cachePos = null;
                        cachePos = cau_inArray(cauCache, r.query.recentchanges[i].user);
                        if (cachePos === null) {
                            // Didn't find it the cache, so let's make room for it.
                            cachePos = cauCache.length;
                            cauCacheNum[cachePos] = 0;
                            // And record the name.
                            cauCache[cachePos] = r.query.recentchanges[i].user;
                        }
                        // Now let's inc the numbers and record the timestamp
                        cauCacheNum[cachePos]++;
                        cauCacheTs[cachePos] = ts;
                    }
                }
                if (!r['query-continue']) {
                    //alert('first');
                    cau_showResults();
                    return;
                }
                // So, we have more results, but check the date first
                tsDate = new Date();
                tsDate.setISO8601(r['query-continue'].recentchanges.rcstart);
                //$('#possible-voters-gadget').append(r['query-continue'].recentchanges.rcstart + ' ');
                date = new Date();
                date.setDate(date.getDate()-cauDaysToCheck);
                if (tsDate>date) {
                    // We are still newer than the limit, so let's get some more.
                    cau_processUsers(r['query-continue'].recentchanges.rcstart);
                } else {
                    //alert('second');
                    cau_showResults();
                }
            }
    }
     
    function cau_processUsers(from) {
        cauCount++;
        //$('#possible-voters-gadget').append('[' + cauCount + '] ');
        var url = mw.util.wikiScript('api') + '?';
        if (from) {
            url = url + '&rcstart=' + from;
        }
        try {
            $.getJSON(
                    url,
                    { action: 'query',
                      list: 'recentchanges',
                      rcshow: '!bot|!anon',
                      rcprop: 'user|timestamp',
                      rclimit: '500',
                      format: 'json'
                    },
                    cau_get_handler
            );
        } catch(e) {
            //alert('exception:' + e.message);
        }
    }
     
    function cau_showResults() {
        if (!cauShowDone) {
            cauShowDone = 1;
            //$('h1').append('['+cauCount+']');
            // Do some sorting
            //Make a new table of concatenated values
            var sorTable = [];
            for (var i=0, j=0; i<cauCache.length; i++) {
                if (cauCacheNum[i] >= 30) { sorTable[j++] = cauCache[i] + ';' + cauCacheNum[i] + ';' + cauCacheTs[i]; }
            }
            // Sort the new table
            sorTable.sort();
            // And put it in place again:
            cauCache = []; cauCacheNum = []; cauCacheTs = [];
            for (var i=0; i<sorTable.length; i++) {
                var tArr = sorTable[i].split(';',3);
                cauCache[i] = tArr[0];
                cauCacheNum[i] = tArr[1];
                cauCacheTs[i] = tArr[2];
            }
            // I guess we are finished?
            var docobj = document.getElementById('bodyContent') || document.getElementById('mw_contentholder') || document.getElementById('content') || document.getElementsByTagName('body')[0];
            var header = new Array('Navn','Bidrag','Første bidrag');
            // Create a table object
            var table = document.createElement('table');
            table.setAttribute('class', 'wikitable sortable')
            var thead = document.createElement('thead');
            var tbody = document.createElement('tbody');
            var hr = document.createElement('tr');
            for (var i=0; i<header.length; i++) {
                var tc = document.createElement('th');
                tc.appendChild(document.createTextNode(header[i]));
                hr.appendChild(tc);
            }
            thead.appendChild(hr);
            table.appendChild(thead);
            table.appendChild(tbody);
            docobj.appendChild(table);
            for(var i=0;i<cauCache.length;i++) {
                hr = document.createElement('tr');
                var tc = document.createElement('td');
                tc.style.backgroundColor = '#cccccc';
                tc.appendChild(document.createTextNode(cauCache[i]));
                hr.appendChild(tc);
                tc = document.createElement('td');
                tc.appendChild(document.createTextNode(cauCacheNum[i]));
                hr.appendChild(tc);
                tc = document.createElement('td');
                tc.appendChild(document.createTextNode(cauCacheTs[i]));
                hr.appendChild(tc);
                tbody.appendChild(hr);
            }
            //$('#possible-voters-gadget').append(table);
        }
    }
     
    if (mw.config.get('wgPageName')=='Wikipedia:Avstemninger/Stemmeberettigede/Status') {
      jQuery( document ).ready(checkActiveUsers);
    }
})();