User:NQ/custom-scripts/inlinediffs.js

Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// WritKeeper's amazing inlinediff script with some style changes. [[User:Writ Keeper/Scripts/commonHistory.js]] [[User:Writ_Keeper/Scripts/inlineDiffDocs]]

diffRequestLocked = "f";
if(typeof inspectText == "undefined")
{
	inspectText = "inspect diff";
}
if(typeof showText == "undefined")
{
	showText = "show diff";
}
if(typeof hideText == "undefined")
{
	hideText = "hide diff";
}
if(	mw.config.get("wgCanonicalSpecialPageName") == "Watchlist" || 
	mw.config.get("wgCanonicalSpecialPageName") == "Recentchanges" || 
	mw.config.get("wgCanonicalSpecialPageName") == "Contributions" ||
	mw.config.get("wgAction") == "history")
{
	function inspectionEachHelper(index, element)
	{
		var findString;
		if(mw.config.get("wgAction") == "history" || $(element).hasClass("mw-enhanced-rc-nested"))
		{
			findString = 'a:contains("prev")';
		}
		else
		{
			findString = 'a:contains("diff")';
		}
		
		var regex;
		
		if(mw.config.get("wgCanonicalSpecialPageName") == "Contributions")
		{
			regex = /&oldid=(\d+)$/;
			
		}
		else
		{
			regex = /&diff=(\d+)&oldid=/;
		}
		var diffLink = $(element).find(findString);
		if(diffLink.length > 0 )
		{
			var regexResult = regex.exec(diffLink[0].href);
			if(regexResult != null && regexResult.length >= 2)
			{
				var diffID = regexResult[1];
				var inlineDiffButton;
				if(typeof inlineDiffBigUI === "undefined")
				{ 
					inlineDiffButton = document.createElement("a");
					inlineDiffButton.href = "#";
					inlineDiffButton.innerHTML = '<span style="color:black;"> (</span>'+inspectText+'<span style="color:black;">) </span>';
				}
				else
				{
					inlineDiffButton = document.createElement("input");
					inlineDiffButton.type = "button";
					inlineDiffButton.value = "Inspect edit";
				}
				inlineDiffButton.id = diffID;
				$(inlineDiffButton).click(function(){ return inspectWatchlistDiff(this);});
					if($(element).find("tr:first").length == 0)
				{
					$(inlineDiffButton).insertBefore($(element).children(".mw-changeslist-separator:first"));
				}
				else
				{
					$(element).find("tr:first").append("<td></td>");
					$(element).find("tr:first>td:last").append(inlineDiffButton);
				}
			}
		}
	}
	function addWatchlistInspectionBoxes() {
	
		
		var entries = $("#mw-content-text table.mw-enhanced-rc");
		if(entries.length == 0)
		{
			$("#mw-content-text ul").each(function(ind, el)
			{
				$(el).children("li").each(inspectionEachHelper);
			});
		}
		else
		{
			entries.each(inspectionEachHelper);
			$("td.mw-enhanced-rc-nested").each(inspectionEachHelper);
		}
		mw.loader.load('mediawiki.action.history.diff');
	}
 
	function inspectWatchlistDiff(button)
	{
		if(diffRequestLocked === "t")
		{
			alert("An old request is still being processed, please wait...");
			return false;
		}
		else
		{
			diffRequestLocked = "t";
			var mwApi = new mw.Api();
			mwApi.get( {action : "query", prop : "revisions", format : "json", rvprop : "timestamp", rvdiffto : "prev", revids : button.id}).done(function(response) 
			{
 				if(response == null)
				{
					alert("Request failed!");
					diffRequestLocked = "f";
					return false;
				}

				var diffString = response.query.pages[Object.keys(response.query.pages)[0]].revisions[0].diff["*"];
 
				if(diffString == null)
				{
					alert("Request failed!");
					diffRequestLocked = "f";
					return false;
				}
 
				var newTable = document.createElement("table");
				newTable.className = "diff";
 				$(newTable).html('<colgroup><col class="diff-marker"><col class="diff-content"><col class="diff-marker"><col class="diff-content"></colgroup>');
 
				$(newTable).append(diffString);
				if($("#"+ button.id).parent("td").length > 0 && !($("#"+ button.id).parent("td").hasClass("mw-enhanced-rc-nested")))
				{
					$("#"+ button.id).parents("table.mw-enhanced-rc:first").after(newTable);
				}
				else
				{
					diffParent = $("#"+button.id).parent();
					diffParent.append(newTable);
				}
				newTable.id = button.id + "display";
	
				$(button).unbind("click");
				if(typeof inlineDiffBigUI === "undefined")
				{
					$(button).html('<span style="color:black;"> (</span>'+hideText+'<span style="color:black;">) </span>');
					$(button).click(function(){ return hideSmallEditInspection(this);});
				}
				else
				{
					$(button).attr("value","Hide edit");
					$(button).click(function(){ return hideEditInspection(this);});
				}
				mwApi.post({action : "setnotificationtimestamp", revids: button.id, token : mw.user.tokens.get("editToken")}).done(function(data)
				{
					if(diffParent != null)
					{
						diffParent.removeClass("mw-changeslist-line-watched");
						diffParent.addClass("mw-changeslist-line-not-watched");
					}
				});
 
				diffRequestLocked = "f";
			});
	
		}
		return false;
	}
 
	function showEditInspection(button)
	{
		$("#"+button.id+"display").css("display", "");
		$(button).attr("value","Hide edit");
		$(button).unbind("click");
		$(button).click(function(){ return hideEditInspection(this);});
		return false;
	}
 
	function hideEditInspection(button)
	{
		$("#"+button.id+"display").css("display", "none");
		$(button).attr("value","Show edit");
		$(button).unbind("click");
		$(button).click(function(){ return showEditInspection(this);});
		return false;
	}

	function showSmallEditInspection(button)
	{
		$("#"+button.id+"display").css("display", "");
		$(button).html('<span style="color:black;"> (</span>'+hideText+'<span style="color:black;">) </span>');
		$(button).unbind("click");
		$(button).click(function(){ return hideSmallEditInspection(this);});
		return false;
	}
		
	function hideSmallEditInspection(button)
	{
		$("#"+button.id+"display").css("display", "none");
		$(button).html('<span style="color:black;"> (</span>'+showText+'<span style="color:black;">) </span>');
		$(button).unbind("click");
		$(button).click(function(){ return showSmallEditInspection(this);});
		return false;
	}

	$(document).ready(addWatchlistInspectionBoxes);
}