User:Writ Keeper/Scripts/userHistory.js

if ( histlimit === undefined ) var histlimit = 40; if ( typeof histwidth === 'undefined' ) var histwidth = 200; diffRequestLocked = "f"; function userHistMain { var me = this; this.displayBox = function ( user ) { // if user is set, this name will automatically be displayed on load if ( user == null ) { user = ''; } else { user = user.replace ( /(_|%20)/gi, ' ' ); user = user.replace ( /(%3A)/gi, ':' ); }			var box = document.createElement( 'input' ); box.setAttribute ( 'id', 'userhist-isolate' ); box.setAttribute ( 'type', 'text' ); box.setAttribute ( 'value', user ); box.setAttribute ( 'style', 'width: ' + histwidth + 'px' ); var button = document.createElement( 'input' ); button.setAttribute ( 'type', 'button' ); button.setAttribute ( 'value', 'Isolate history' ); button.setAttribute ( 'style', 'margin-left: 4px;' ); if ( button.addEventListener ) { button.addEventListener( 'click', function { userHist.getUserHist(document.getElementById('userhist-isolate').value); }, false ); } 			else { 				button.attachEvent( 'onclick', function { userHist.getUserHist(document.getElementById('userhist-isolate').value); } ); }			var span = document.createElement ( 'span' ); span.setAttribute ( 'style','margin-left: 20px;' ); span.appendChild ( box ); span.appendChild ( button ); document.getElementById( 'mw-history-search' ).appendChild ( span ); }		this.getUserHist = function ( user ) { var api = '/w/api.php'; if ( typeof user == 'undefined' ) return false; if ( ! user ) return false // remove useless interface var histPar = document.getElementById ( 'mw-history-compare' ); histPar.innerHTML = ' isolating edits by ' + user + ' - please wait... ';			var apiLink = '?action=query&format=xml&prop=revisions&titles='+encodeURIComponent(mw.config.get("wgPageName"))+'&rvprop=ids|timestamp|flags|comment|user|size&rvlimit=500&rvuser='+encodeURIComponent(user)+''; this.req 				= new wa_ajaxcall ; this.req.requestUrl		= api + apiLink; this.req.get			( function {										userHist.data = userHist.req.response;										userHist.showUserHist ;										return true;									} ); }		this.showUserHist = function { var data = this.data; if ( data.getElementsByTagName( 'rev' ).length <= 0 ) { this.showError('That user has never edited this page.'); return false; }			// get output var output = []; for ( var i = 0; i < data.getElementsByTagName( 'rev' ).length; i ++ ) { var dataset = data.getElementsByTagName( 'rev' )[i]; output[i] = []; output[i][0] = dataset.getAttribute ( 'revid' ); // oldid output[i][1] = dataset.getAttribute ( 'user' ); // user output[i][2] = dataset.getAttribute ( 'timestamp' ); // timestamp output[i][3] = dataset.getAttribute ( 'comment' ); // comment output[i][4] = dataset.getAttribute ( 'size' ); // size output[i][5] = dataset.getAttribute ( 'minor' ); // minor }			// build our own interface var newInt = document.createElement("ul"); newInt.id = "pagehistory"; var url = '/w/index.php?title='+mw.config.get("wgPageName"); for (var i = 0; i < output.length; i ++) { var timestamp = me.convertTimestamp(output[i][2]); var comment = me.parseComment(output[i][3]); if ( output[i][5] != null ) { var m = ' m '; } else { var m = ''; } newEntry = document.createElement("li"); newEntry.className='""'; newEntry.id = "rev" + output[i][0]; newEntry.innerHTML = '(cur | prev) '+timestamp+' '+output[i][1]+' '+m+' ('+output[i][4]+' bytes) '+comment+' '; if(typeof inlineDiffSmallUI != "undefined") {                                              inlineDiffButton = document.createElement("a"); inlineDiffButton.href = "#"; inlineDiffButton.innerHTML = ' [ inspect diff ] '; }                                       else {                                             inlineDiffButton = document.createElement("input"); inlineDiffButton.type = "button"; inlineDiffButton.value = "Inspect edit"; }				inlineDiffButton.id = output[i][0]; $(inlineDiffButton).click(function{ return userHist.inspectDiff(this);}); newEntry.appendChild(inlineDiffButton); newInt.appendChild(newEntry); }			var histPar = document.getElementById( 'mw-history-compare' ); histPar.innerHTML = ""; histPar.appendChild(newInt); mw.loader.load('mediawiki.action.history.diff') }		this.inspectDiff = function( button) {			if(diffRequestLocked === "t") {				alert("An old request is still being processed, please wait..."); return; }			else {				diffRequestLocked = "t"; $.getJSON("/w/api.php?action=query&prop=revisions&format=json&rvprop=timestamp&revids="+button.id+"&rvdiffto=prev", function(response, status){

var diffString = response.query.pages[mw.config.get("wgArticleId")].revisions[0].diff["*"]; if(diffString == null) {                                    alert("Request failed!"); diffRequestLocked = "f"; return; }

var newTable = document.createElement("table"); newTable.className = "diff"; var colGroup = document.createElement("colgroup"); var diffCol = document.createElement("col"); diffCol.className = "diff-marker"; colGroup.appendChild(diffCol); diffCol = document.createElement("col"); diffCol.className = "diff-content"; colGroup.appendChild(diffCol); diffCol = document.createElement("col"); diffCol.className = "diff-marker"; colGroup.appendChild(diffCol); diffCol = document.createElement("col"); diffCol.className = "diff-content"; colGroup.appendChild(diffCol); newTable.appendChild(colGroup);

$(newTable).append(diffString); $(newTable).insertAfter("#"+ button.id); newTable.id = button.id + "display";

$(button).unbind("click"); if(typeof inlineDiffSmallUI != "undefined") {				   $(button).html(' [ hide diff ] '); $(button).click(function{ return userHist.hideSmallEditInspection(this);}); }                               else {                                   $(button).attr("value","Hide edit"); $(button).click(function{ return userHist.hideEdit(this);}); }

//$(button).attr("disabled", "disabled"); //$(button).click(function{return false;});

diffRequestLocked = "f"; });			}                       return false;		}                this.showEdit = function( button)                {                    $("#"+button.id+"display").css("display", "");                    $(button).attr("value","Hide edit");                    $(button).unbind("click");                    $(button).click(function{ userHist.hideEdit(this);});                }

this.hideEdit = function( button) {                   $("#"+button.id+"display").css("display", "none"); $(button).attr("value","Show edit"); $(button).unbind("click"); $(button).click(function{ userHist.showEdit(this);}); }		this.showSmallEditInspection = function( button) {      	        	$("#"+button.id+"display").css("display", ""); $(button).html(' [ hide diff ] '); $(button).unbind("click"); $(button).click(function{ return userHist.hideSmallEditInspection(this);}); return false; }       	this.hideSmallEditInspection = function( button) {			$("#"+button.id+"display").css("display", "none"); $(button).html(' [ show diff ] '); $(button).unbind("click"); $(button).click(function{ return userHist.showSmallEditInspection(this);}); return false; }		this.showError = function( errorMessage ) { var container = document.getElementById( 'mw-history-compare' ); container.innerHTML = ' userhist error: ' + errorMessage + ' '; return true; }		this.convertTimestamp = function (timestamp) { var regTest = /([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})Z/g; regTest.lastIndex = 0; time = regTest.exec(timestamp); if (time == null) return 'failed to parse timestamp'; var d = new Date; var hourOffset = (d.getTimezoneOffset / 60) * -1; var h = parseInt( time[4], 10 ) + hourOffset; if (h < 10 ) h = '0' + h;			var months = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'); var month = parseInt(time[2], 10); var newStamp = h + ':' + time[5] + ', ' + time[3] + ' ' + months[month-1] + ' ' + time[1]; return newStamp; }		this.parseComment = function (comment) { if (comment == null) return ''; comment = comment.replace('/*', ' ?'); comment = comment.replace('*/', ' '); comment = comment.replace(/\[\[(.+?)(#.+?)?(?:\|(.+?))\]\]/g, "$3"); comment = comment.replace(/\[\[(.+?)(#.+?)?\]\]/g, "$1"); comment = '( ' + comment + ' )'; return comment; }		this.manageSize = function { var regTest = /class="history-size">\(([,0-9]+?) +?bytes\)<\/span>/ig, regMatch; var col = { 'add': '#006400', 'remove': '#8b0000' }, results = [], i = 0; while ( regMatch = regTest.exec ( document.getElementById ( 'pagehistory' ).innerHTML ) ) { results [ i ++ ] = parseInt ( regMatch [1].replace ( ',', '' ), 10 ); if ( i > histlimit ) break; }			for ( var i = 0, l = results.length; i < ( l - 1 ); i ++ ) { var addition = results [i] - results [i + 1]; if ( addition === 0 ) { var rep = ' 0 '; } else if ( addition < 0 ) { var rep = '' + addition + ' '; } else { var rep = '+' + addition + ' '; } document.getElementById ( 'pagehistory' ).innerHTML = document.getElementById ( 'pagehistory' ).innerHTML.replace ( /class="history-size">\(([,0-9]+?) +?bytes\)<\/span>/i, "class=\"historysize\">(" + rep + ", $1 bytes) " ); }		}		this.init = function { if ( mw.config.get("wgAction") == 'history' ) { if ( ( window.location.href.indexOf ( '&isolate=' ) > -1 ) && ( window.location.href.indexOf ( '&offset=' ) == -1 ) && ( window.location.href.indexOf ( '&limit=' ) == -1 ) ) { var user = window.location.href.substr ( window.location.href.indexOf( '&isolate=' ) + 9 ); me.getUserHist ( user ); } else { //me.manageSize ; - FIXME: prevents the history diff selectors from working correctly var user = ''; }				me.displayBox ( user ); }			else if ( ( mw.config.get("wgAction") == 'view' ) && ( mw.config.get("wgPageName") == 'Special:Contributions' ) ) { var regContent = document.getElementById ( 'contentSub' ).innerHTML; var regTest = /for .*?(?:title="(.+?)">|([\.0-9]+?) \/i;				var regMatch = regTest.exec ( regContent );				if ( regMatch[1] === undefined ) {					var user = regMatch[2];				} else {					var user = regMatch[1];				}				var bodyContent = document.getElementById ( 'bodyContent' );				regTest.lastIndex = 0;				regTest = /(title="([^<]+?)">hist<\/a>)\)/ig; bodyContent.innerHTML = bodyContent.innerHTML.replace ( regTest, "$1 | all\)" );			}		}	}

importScript ( 'User:Ale_jrb/Scripts/waLib.js' ); var userHist = new userHistMain ; $(window).on( 'load', userHist.init );