User:Splarka/contribsmulti.js

/* Special:Contributions Multi-user lookup, version [0.0.2a] Originally from: http://en.wikipedia.org/wiki/User:Splarka/contribsmulti.js

Notes:
 * Experimental per: https://bugzilla.wikimedia.org/show_bug.cgi?id=16402
 * brion: please make this core, kthx!
 * cmLimit is also the default display limit, this is to prevent incorrect/lost data
 * Logic goes: if you fetch X contribs for each user, mix and sort by date, and show X total, you don't lose any



if(wgCanonicalSpecialPageName == 'Contributions' && true) { addOnloadHook(multiContribsInit); var cmLimit = 500; //max uclimit (500 default) and max display limit; var cmMaxU = 5;  //max number of parameters var cmTotal; var cmList = []; var cmIndex = []; appendCSS('#results-from-multicontribs {border:1px solid black;padding:.5em}\n.mw-mightexist {font-style:italic;}'); }

function multiContribsInit { var ucfrm = document.getElementsByTagName('form')[0]; if(!ucfrm.target) return var users = ucfrm.target.value.split('|'); if(users.length < 2) return

//general optionlets independent of type of search. var opt_ns = (parseInt(ucfrm.namespace[ucfrm.namespace.selectedIndex].value) > -1) ? '&ucnamespace=' + ucfrm.namespace[ucfrm.namespace.selectedIndex].value : ''; var opt_ts = ''; var m = '' + ucfrm.month.selectedIndex; var y = ucfrm.year.value; if(m.length == 1) m = '0' + m if(y > 2000 && y < 2100) opt_ts = '&ucstart=' + y + '-' + m + '-01T00:00:00Z' var options = opt_ns + opt_ts;

cmTotal = 0; multiContribsStartbox(ucfrm.parentNode); for(var i=0;i= parseInt(cmMaxU)) break var user = users[i].replace(/(^\W*|\W*$)/g,''); if(user == '') continue var url = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?action=query&format=json&callback=multiContribs&list=usercontribs' + options + '&uclimit=' + parseInt(cmLimit) + '&ucuser=' + encodeURIComponent(user) + '&requestid=' + i;   mw.loader.load(url); cmTotal++; } }

function multiContribs(obj) { if(!obj['requestid']) return var ri = obj['requestid']; cmTotal--; if(cmTotal == 0) removeSpinner('multicontribs-spin')

if(!obj['query'] || !obj['query']['usercontribs']) return var contribs = obj['query']['usercontribs']; for(var i=0;i<contribs.length;i++) { //fill global object with all arrays, indexed by timestamp + contrib# + user# var index = contribs[i]['timestamp'] + '_' + i + '_' + ri; cmList[index] = contribs[i]; cmIndex.push(index); } if(cmTotal == 0) multiContribsShowResults }

function multiContribsShowResults { var res = document.getElementById('results-from-multicontribs'); //sort by date by creating plain index of associative array's index which is made of timestamps (dirty) cmIndex.sort(sortReverse);

if(cmIndex.length == 0) { res.appendChild(document.createTextNode('No results found.')); }

//limit display, if you show too many you might miss some var length = (cmIndex.length > cmLimit) ? cmLimit : cmIndex.length var ul = document.createElement('ul'); for(var i=0;i<length;i++) { var li = document.createElement('li'); li.appendChild(document.createTextNode(cmList[cmIndex[i]].timestamp.replace(/[TZ]/g,' ') + '')); addlinkchild(li, wgScript + '?title=Special:Contributions/' + cmList[cmIndex[i]].user, cmList[cmIndex[i]].user); li.appendChild(document.createTextNode(' ('));    addlinkchild(li, wgScript + '?title=User_talk:' + cmList[cmIndex[i]].user, 'talk','','mw-mightexist');     li.appendChild(document.createTextNode(') edited ('));     addlinkchild(li, wgScript + '?title=-&curid=' + cmList[cmIndex[i]].pageid + '&diff=' + cmList[cmIndex[i]].revid, 'diff');     li.appendChild(document.createTextNode(') ')); addlinkchild(li, wgScript + '?title=-&curid=' + cmList[cmIndex[i]].pageid, cmList[cmIndex[i]].title); if(cmList[cmIndex[i]].comment) li.appendChild(document.createTextNode(' (' + cmList[cmIndex[i]].comment + ')')) ul.appendChild(li); } res.appendChild(ul); }

function sortReverse(a,b) { return ((b < a) ? -1 : ((b > a) ? 1 : 0)); }

function multiContribsStartbox(parent) { var res = document.createElement('div'); res.setAttribute('id','results-from-multicontribs'); var spin = document.createElement('span'); spin.setAttribute('id','multicontribs-prog') //spin.appendChild(document.createTextNode('Searching.')); res.appendChild(spin); injectSpinner(spin,'multicontribs-spin'); parent.appendChild(res); }

function addlinkchild(obj,href,text,id,classes) { if(!obj || !href || !text) return false; var a = document.createElement('a'); a.setAttribute('href',href); a.appendChild(document.createTextNode(text)); if(id) a.setAttribute('id',id); if(classes) a.setAttribute('class',classes); obj.appendChild(a); return a; }