User:PiRSquared17/Rollback.js

Source: Wikipedia, the free encyclopedia.
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.
// the following scripts are from [[simple:User:PiRSquared17/MRBK.js]] and [[simple:User:Tholly/Rollback.js]], respectively

//Mass rollback function
//Written by John254
//Adapted from User:Mr.Z-man/rollbackSummary.js
//Instructions: Selecting the "rollback all" tab when viewing a user's contributions history
//will open all rollback links displayed there. (Use with caution)
// 
//EdSum copied from [[User:Tholly/Rollback.js]]
//
//  **The script below is an adaption of one from [[w:User:Gracenotes/rollback.js]]**
//           **Please read that page for more details on the script.**
//
//  The Differences:
//  -Instead of just being able to:  $user --> username
//  -Now there is:  $user --> [[User:username|username]] - (linked)
//  -Also: $talk     --> [[User talk:username|talk]] - (linked)
//  -Also: $contribs --> [[Special:Contributions/username|contributions]] - (linked)
//  -Also: $ip       --> [[Special:Contributions/username|username]] - (linked). Used especially for IPs with no userpage.
//  -Also: $rvuser   --> [[User:User to revert to|user to revert to]] - (linked).
//  -Also: $rvip     --> [[Special:Contributions/user to revert to|user to revert to]] - (linked). Used for IPs with no userpage.
//
//  -Another change is that there is already text in the summary box, defaulting to: 
//   "Reverted edits by $ip ($talk) to last version by $rvuser."
//  -Finally, the link to click on next to rollback is "summary", not "sum"
//   and there are spaces between "rollback", "|" and "summary" to match other formatting.
//
 
// 
//  Added by PiRSquared17:
//  -If you want to open the user's talk page, put "$opentalk" at the end of the input box
 
if (typeof(skin)!="undefined" && skin=="vector")
  (function() {
      var GET = document.getElementById;
      document.getElementById = function(id) {
          var g = GET.call(document, id);
          if (g) {
              return g;
          } else {
              return GET.call(document, {
                  'p-cactions': 'actions',
                  'p-personal': 'personal',
                  'p-search': 'p-navigation', // redirected to this for positioning, or to #search?
                  'p-logo': 'logo',
                  'column-one': 'panel',
                  'column-content': 'content', // since #content exists, is this ok?
                  'globalWrapper': 'content', // what should this be?
                  'lastmod': 'foot-info-lastmod'
              }[id]);
          }
      };
  })();
 
function _confirmRollback() {
    var url = document.location.href;
    var user = url.match(/Special:Contributions\/([^&]*)/);
    if (!user || user == wgUserName)
    {
        alert("error");
        return;
    }
    user = decodeURIComponent(user[1]);

    var summary = prompt("Enter a summary to use for rollback. Leave blank to use the default.\n\n- '$user' will be replaced with the link to " + user + "'s userpage,\n- '$talk' to their talk page,\n- '$contribs' to their contributions page, and\n- '$ip' to their contributions page with the link text as '" + user + "'.\n\n- $rvuser links to userpage of user reverting back to, and \n- $rvip to the contribs page of user reverting back to (link text of username).", "Reverted edits by $ip ($talk) to last version by $rvuser (Mass reversion of changes by $ip).");
    if (summary == undefined) {
        return false;
    }
    else if (summary == "") {
        return true;
    }
    var startsum = summary.replace(/\$user/g, "[[User:$2|$2]]");
    var worksum1 = startsum.replace(/\$ip/g, "[[Special:Contributions/$2|$2]]");
    var worksum2 = worksum1.replace(/\$rvuser/g, "[[User:$1|$1]]");
    var worksum3 = worksum2.replace(/\$rvip/g, "[[Special:Contributions/$1|$1]]");
    var worksum4 = worksum3.replace(/\$opentalk/g, "");
    if (worksum3 != worksum4) {
        open(wgServer + (wgArticlePath.replace(/\$1/g, "")) + "User talk:" + user);
    }
    var finsum = worksum4.replace(/\$contribs/g, "[[Special:Contributions/" + user + "|contributions]]");
    finsum = "&summary=" + encodeURIComponent(finsum.replace(/\$talk/g, "[[User talk:$2|talk]]"));
    return finsum;
}
 
function rollbackEverythingButton() {
  var hasRollback = getElementsByClassName(document, "span", "mw-rollback-link");
  if (hasRollback[0] && (document.title.indexOf("User contributions") != -1) ) {
    mw.util.addPortletLink('p-cactions', 'javascript:rollbackEverything()', "rollback all", "ca-rollbackeverything", "rollback all edits displayed here");
    if (typeof noMRBKL == "undefined" || !noMRBKL) {
        addRemoteRollbackLinks();
    }
  }
}
var qapi = sajax_init_object();  // will use later
qapi.open('GET', wgServer + (wgArticlePath.replace(/\$1/g, 'wgPageName')), true);
qapi.onreadystatechange = __getXML;
qapi.overrideMimeType('text/xml');
qapi.send();
// handle response
function __getXML(_api) {
	if(_api.readyState==4) {
		if(_api.status==200) {
			return _api.responseXML;
		} else {
			alert('The query returned an error.');
		}
	}
}
function addRemoteRollbackLinks() {
  var usertools = document.getElementsByClassName("mw-usertoollinks");
  for (var i = 0; i < usertools.length; i++)
  {
    var usertalk = usertools[i].getElementsByTagName("a")[0];
    if (usertools[i].getElementsByTagName("a").length > 1)
        var contribs = usertools[i].getElementsByTagName("a")[1];
    else var contribs = usertools[i].getElementsByTagName("a")[0];
    var rollbackall = document.createElement("a");
    rollbackall.setAttribute("href", encodeURI(wgScript + "?title=Special:Contributions/" + (document.getElementsByClassName("mw-usertoollinks")[i].getElementsByTagName("a")[0].href.match(/User_talk:([^&]*)/)[1]) + "&rollbackall=true"));
    var txtToAdd0 = document.createTextNode(" | ");
    var txtToAdd1 = document.createTextNode("rollback all");
    rollbackall.appendChild(txtToAdd1);
    contribs.parentNode.insertBefore(txtToAdd0, contribs.nextSibling);
    txtToAdd0.parentNode.insertBefore(rollbackall, txtToAdd0.nextSibling);
  }
}
$(rollbackEverythingButton);
$( function() {
	if( document.location.href.indexOf( 'rollbackall=true' ) != -1 ) {
		rollbackEverything();
		return;
	}
});
function rollbackEverything() {
    var edsum = _confirmRollback();
    if (typeof edsum != "string") {
        return 0;
    }
    for (var i in document.links) {
      if (document.links[i].href.indexOf('action=rollback') != -1) {
        window.open(document.links[i].href + edsum);
      }
    }
}

// end script 1

//

//  **The script below is an adaption of one from [[w:User:Gracenotes/rollback.js]]**

//           **Please read that page for more details on the script.**

//

//  The Differences:

//  -Instead of just being able to:  $user --> username

//  -Now there is:  $user --> [[User:username|username]] - (linked)

//  -Also: $talk     --> [[User talk:username|talk]] - (linked)

//  -Also: $contribs --> [[Special:Contributions/username|contributions]] - (linked)

//  -Also: $ip       --> [[Special:Contributions/username|username]] - (linked). Used especially for IPs with no userpage.

//  -Also: $rvuser   --> [[User:User to revert to|user to revert to]] - (linked).

//  -Also: $rvip     --> [[Special:Contributions/user to revert to|user to revert to]] - (linked). Used for IPs with no userpage.

//

//  -Another change is that there is already text in the summary box, defaulting to: 

//   "Reverted edits by $ip ($talk) to last version by $rvuser."

//  -Finally, the link to click on next to rollback is "summary", not "sum"

//   and there are spaces between "rollback", "|" and "summary" to match other formatting.

//

 

 

function addSumLink() {

    var ntitle2 = document.getElementById("mw-diff-ntitle2")

    if (!ntitle2) return;

    var rbnode = getElementsByClassName(document.getElementById("mw-diff-ntitle2"), "span", "mw-rollback-link");

    if (rbnode.length != 0)

        addRollbackSummaryLink(rbnode[0]);

}

 

function confirmRollback() {

    var url = this.href;

    var user = url.match(/[?&]from=([^&]*)/);

    if (!user) return;

    var user = decodeURIComponent(user[1].replace("+", " "));

    var summary = prompt("Enter a summary to use for rollback. Leave blank to use the default.\n\n- '$user' will be replaced with the link to " + user + "'s userpage,\n- '$talk' to their talk page,\n- '$contribs' to their contributions page, and\n- '$ip' to their contributions page with the link text as '" + user + "'.\n\n- $rvuser links to userpage of user reverting back to, and \n- $rvip to the contribs page of user reverting back to (link text of username).", "Reverted edits by $ip ($talk) to last version by $rvuser.")

    if (summary == undefined)

        return false;

    else if (summary == "")

        return true;

    var startsum = summary.replace(/\$user/g, "[[User:" + user + "|" + user + "]]");

    var worksum1 = startsum.replace(/\$ip/g, "[[Special:Contributions/" + user + "|" + user + "]]");

    var worksum2 = worksum1.replace(/\$rvuser/g, "[[User:$1|$1]]");

    var worksum3 = worksum2.replace(/\$rvip/g, "[[Special:Contributions/$1|$1]]");

    var finsum = worksum3.replace(/\$contribs/g, "[[Special:Contributions/" + user + "|contributions]]");

    this.href += "&summary=" + encodeURIComponent(finsum.replace(/\$talk/g, "[[User talk:" + user + "|talk]]"));

 

    return true;

};

 

function addRollbackSummaryLink(rbnode) {

    var rblink = rbnode.getElementsByTagName("a")[0]

    var alink = rblink.cloneNode(true);

    alink.className = "";

    alink.firstChild.nodeValue = "summary";

    alink.onclick = confirmRollback;

    rbnode.insertBefore(alink, rblink.nextSibling);

    rbnode.insertBefore(document.createTextNode(" | "), alink);

}

 

$(addSumLink);

//  End of script