User:Writ Keeper/Scripts/massRevdel.js

mw.hook("wikipage.content").add( function {	mw.loader.using(["mediawiki.api"]).then(function {		var apiLimit = 500; var api = new mw.Api; if(mw.config.get("wgCanonicalSpecialPageName") == "Contributions") {			wkContribsCheckboxInit = true; $("ul.mw-contributions-list:first").before(" Revision deletion\	 \	 \	\	  delete content \	  delete user name \	  delete edit summary \	  undelete content \	  undelete user name \  undelete edit summary \ Other reason \  \  ");			$("ul.mw-contributions-list .mw-revdelundel-link").each(function(ind,el){				if($(this).children("a").length > 0)				{					var revId = /ids=(\d+)/.exec($(this).children("a").attr("href"))[1];					var pageTitle = /target=([^&]+)/.exec($(this).children("a").attr("href"))[1];					el.innerHTML = "";					$(el).children(".revdelIds").data("index", ind);				}			});			$("ul.mw-contributions-list").after(" ");			$("#revdelCP").data("revdelToolbarShowing", false);			$("#revdelCP").data("lastSelectedIndex", -1);

//load canned summaries $.get("/w/index.php?title=MediaWiki:Revdelete-reason-dropdown&action=raw",function(data)			{				reasons = data.replace(/\*\* ([^\*]+)/g, '<option value="$1">$1 ');				reasons = reasons.replace(/\* ([^<]+)([^\*]+)/g, '<optgroup label="$1">$2 ');				$('#wpRevDeleteReasonList').append(reasons);			}).done(function			{				$.get("/w/index.php?title=MediaWiki:Revdelete-reason-dropdown-suppress&action=raw", function(data) {					reasons = data.replace(/\*\* ([^\*]+)/g, '<option value="$1">$1 '); reasons = reasons.replace(/\* ([^<]+)([^\*]+)/g, '<optgroup label="$1">$2 '); $('#wpRevDeleteReasonList').append(reasons); });			});			//attach handlers $("#revdelLabel").click(				function				{					if($("#revdelCP").data("revdelToolbarShowing"))					{						$("#revdelCP").data("revdelToolbarShowing", false);						$("#revdelLabelImg").css("transform","rotate(270deg)");						$("#revdelCPBody").fadeOut;					}					else					{						$("#revdelCP").data("revdelToolbarShowing", true);						$("#revdelLabelImg").css("transform","none");						$("#revdelCPBody").fadeIn;					}				}			); $("#revdelSelectAll").click(				function				{					$('input.revdelIds').each(function {						$(this).prop("checked", true); });					$("#revdelCP").data("lastSelectedIndex", -1);				}			); $("#revdelSelectNone").click(				function				{					$('input.revdelIds').each(function {						$(this).prop("checked", false); });					$("#revdelCP").data("lastSelectedIndex", -1);				}			);

$("#revdelSelectInv").click(				function				{					$('input.revdelIds').each(function {						$(this).prop("checked", !($(this).prop("checked"))); });					$("#revdelCP").data("lastSelectedIndex", -1);				}			); $("input.revdelIds").off("click").click(				function(ev)				{					var lastSelectedRevdel = $("#revdelCP").data("lastSelectedIndex");					var newIndex = $(this).data("index")					if(ev.shiftKey && lastSelectedRevdel >= 0)					{						var checkboxArray = $("input.revdelIds");						var start = lastSelectedRevdel;						var stop = newIndex;						if(start < stop)						{							for(var i = start; i < stop; i++)							{								if(i != lastSelectedRevdel)								{									$(checkboxArray[i]).prop("checked", !($(checkboxArray[i]).prop("checked")));								}							}						}						else						{							for(var i = start; i > stop; i--)							{								if(i != lastSelectedRevdel)								{									$(checkboxArray[i]).prop("checked", !($(checkboxArray[i]).prop("checked")));								}							}						}					}					 $("#revdelCP").data("lastSelectedIndex", newIndex);				}			); $("#revdelSubmit").click(				function				{					//figure out which revisions and pages we're working on.					var revCount = 0;					var numTitles = 0;					var pageTitles = {};					$("input.revdelIds:checked").each(function(ind) {						revCount = ind + 1; if(ind > apiLimit - 1) {							mw.notify("You can't do more than " + apiLimit + " revdels at once! Canceling..."); return false; }						if(typeof pageTitles[$(this).attr("name")] == "undefined") {							pageTitles[$(this).attr("name")] = $(this).val; numTitles++; }						else {							pageTitles[$(this).attr("name")] = pageTitles[$(this).attr("name")] + "|" + $(this).val; }					});					if(numTitles == 0)					{						mw.notify("You didn't select any revisions to delete!");						return false;					}					var confirmString = "You are attempting to modify " + revCount + " revisions.\n\nThe following revision attributes will be changed:\n";					//figure out what we're doing to each revision. This is pretty clunky, but whatever.					var deleteString = "";					var revealString = "";					var typeString = "revdel";					if($("#revdelContent").prop("checked") == $("#undelContent").prop("checked"))					{						confirmString = confirmString + "-Content visibility won't change.\n";					}					else if($("#revdelContent").prop("checked"))					{						deleteString = "content";						confirmString = confirmString + "-Content will be deleted.\n";					}					else					{						revealString = "content";						confirmString = confirmString + "-Content will be revealed.\n";					}					if($("#revdelComment").prop("checked") == $("#undelComment").prop("checked")) {						confirmString = confirmString + "-Edit summary visibility won't change.\n"; }					else if($("#revdelComment").prop("checked")) {						if(deleteString != "") {							deleteString = deleteString + "|"; }						deleteString = deleteString + "comment"; confirmString = confirmString + "-Edit summary will be deleted.\n"; }					else {						if(revealString != "") {							revealString = revealString + "|"; }						revealString = revealString + "comment"; confirmString = confirmString + "-Edit summary will be revealed.\n"; }					if($("#revdelName").prop("checked") == $("#undelName").prop("checked")) {						confirmString = confirmString + "-User name visibility won't change.\n"; }					else if($("#revdelName").prop("checked")) {						if(deleteString != "") {							deleteString = deleteString + "|"; }						deleteString = deleteString + "user"; confirmString = confirmString + "-User name will be deleted.\n"; }					else {						if(revealString != "") {							revealString = revealString + "|"; }						revealString = revealString + "user"; confirmString = confirmString + "-User name will be revealed.\n"; }					if(deleteString == "" && revealString == "") {						mw.notify("You didn't select any properties of the revisions to change!"); return false; }					var summary = ""; //construct the revdel summary if($("#wpRevDeleteReasonList").val == "other") {						if($("#wpReason").val == "") {							mw.notify("You didn't select or write in an edit summary for the logs!"); return false; }						summary = $("#wpReason").val; }					else {						summary = $("#wpRevDeleteReasonList").val; if($("#wpReason").val != "") {							summary = summary + ": " + $("#wpReason").val; }					}					confirmString = confirmString + "\nYour revdel summary is: "+ summary +"\n\nAre you sure you want to do this?"; if(confirm(confirmString)) {						var numCompleted = 0; for (title in pageTitles) {							var ajaxData; ajaxData = {action:"revisiondelete",type:"revision",ids:pageTitles[title],reason:summary}; if(deleteString != "") {								ajaxData.hide=deleteString; }							if(revealString != "") {								ajaxData.show=revealString; }							api.postWithToken('csrf', ajaxData).done(function							{								numCompleted++;								if(numCompleted == numTitles)								{									mw.notify("modified " + revCount + " revision(s) successfully!");									return false;								}							}); }					}					return false; }			)			$("#oversightSubmit").click( function {					//figure out which revisions and pages we're working on. var revCount = 0; var numTitles = 0; var pageTitles = {}; $("input.revdelIds:checked").each(function(ind)					{						revCount = ind + 1;						if(ind > apiLimit - 1)						{							mw.notify("You can't do more than " + apiLimit + " revdels at once! Canceling...");							return false;						}						if(typeof pageTitles[$(this).attr("name")] == "undefined")						{							pageTitles[$(this).attr("name")] = $(this).val;							numTitles++;						}						else						{							pageTitles[$(this).attr("name")] = pageTitles[$(this).attr("name")] + "|" + $(this).val;						}					}); if(numTitles == 0) {						mw.notify("You didn't select any revisions to delete!"); return false; }					var confirmString = "You are attempting to modify " + revCount + " revisions.\n\nThe following revision attributes will be changed:\n"; //figure out what we're doing to each revision. This is pretty clunky, but whatever. var deleteString = ""; var oversighting = -1; if($("#revdelContent").prop("checked") == $("#undelContent").prop("checked")) {						confirmString = confirmString + "-Content visibility won't change.\n"; }					else if($("#revdelContent").prop("checked")) {						deleteString = "content"; confirmString = confirmString + "-Content will be oversighted.\n"; oversighting = 1; }					else {						if(oversighting == 1) {							mw.notify("we can't oversight and un-oversight edits at the same time!"); return false; }						deleteString = "content"; confirmString = confirmString + "-Content will be returned to normal (admin-only) revision deletion.\n"; oversighting = 0; }					if($("#revdelComment").prop("checked") == $("#undelComment").prop("checked")) {						confirmString = confirmString + "-Edit summary visibility won't change.\n"; }					else if($("#revdelComment").prop("checked")) {						if(oversighting == 0) {							mw.notify("we can't oversight and un-oversight edits at the same time!"); return false; }						if(deleteString != "") {							deleteString = deleteString + "|"; }						deleteString = deleteString + "comment"; confirmString = confirmString + "-Edit summary will be oversighted.\n"; oversighting = 1; }					else {						if(oversighting == 1) {							mw.notify("we can't oversight and un-oversight edits at the same time!"); return false; }						if(deleteString != "") {							deleteString = deleteString + "|"; }						deleteString = deleteString + "comment"; confirmString = confirmString + "-Edit summary will be returned to normal (admin-only) revision deletion.\n"; oversighting = 0; }					if($("#revdelName").prop("checked") == $("#undelName").prop("checked")) {						confirmString = confirmString + "-User name visibility won't change.\n"; }					else if($("#revdelName").prop("checked")) {						if(oversighting == 0) {							mw.notify("we can't oversight and un-oversight edits at the same time!"); return false; }						if(deleteString != "") {							deleteString = deleteString + "|"; }						deleteString = deleteString + "user"; confirmString = confirmString + "-User name will be oversighted.\n"; oversighting = 1; }					else {						if(oversighting == 1) {							mw.notify("we can't oversight and un-oversight edits at the same time!"); return false; }						if(deleteString != "") {							deleteString = deleteString + "|"; }						deleteString = deleteString + "user"; confirmString = confirmString + "-User name will be returned to normal (admin-only) revision deletion.\n"; oversighting = 0; }					if(deleteString == "") {						mw.notify("You didn't select any properties of the revisions to change!"); return false; }					var summary = ""; //construct the revdel summary if($("#wpRevDeleteReasonList").val == "other") {						if($("#wpReason").val == "") {							mw.notify("You didn't select or write in an edit summary for the logs!"); return false; }						summary = $("#wpReason").val; }					else {						summary = $("#wpRevDeleteReasonList").val; if($("#wpReason").val != "") {							summary = summary + ": " + $("#wpReason").val; }					}					confirmString = confirmString + "\nYour oversight summary is: "+ summary +"\n\nAre you sure you want to do this?"; if(confirm(confirmString)) {						var numCompleted = 0; for (title in pageTitles) {							var ajaxData; ajaxData = {action:"revisiondelete",type:"revision",ids:pageTitles[title],reason:summary,hide:deleteString}; if(oversighting == 1) {								ajaxData.suppress = "yes"; }							else if(oversighting == 0) {								ajaxData.suppress = "no"; }							else {								mw.notify("Something went wrong, so we're going to abort without doing anything."); }							api.postWithToken('csrf', ajaxData).done(function							{								numCompleted++;								if(numCompleted == numTitles)								{									mw.notify("modified " + revCount + " revision(s) successfully!");									return false;								}							}); }					}					return false; }			)		}	}); });