<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://anotherwiki.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-massrollback.js</id>
	<title>MediaWiki:Gadget-massrollback.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://anotherwiki.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-massrollback.js"/>
	<link rel="alternate" type="text/html" href="https://anotherwiki.org/index.php?title=MediaWiki:Gadget-massrollback.js&amp;action=history"/>
	<updated>2026-04-26T22:22:49Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://anotherwiki.org/index.php?title=MediaWiki:Gadget-massrollback.js&amp;diff=3156&amp;oldid=prev</id>
		<title>Jarandhel: Created page with &quot;  /* Ajax mass user-rollback, version [0.0.1b] Originally from: http://en.wikipedia.org/wiki/User:Splarka/ajaxmassrollback.js   Notes: * Oh god this is ugly code. Haha. * This...&quot;</title>
		<link rel="alternate" type="text/html" href="https://anotherwiki.org/index.php?title=MediaWiki:Gadget-massrollback.js&amp;diff=3156&amp;oldid=prev"/>
		<updated>2013-01-17T15:34:02Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;  /* Ajax mass user-rollback, version [0.0.1b] Originally from: http://en.wikipedia.org/wiki/User:Splarka/ajaxmassrollback.js   Notes: * Oh god this is ugly code. Haha. * This...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
/* Ajax mass user-rollback, version [0.0.1b]&lt;br /&gt;
Originally from: http://en.wikipedia.org/wiki/User:Splarka/ajaxmassrollback.js&lt;br /&gt;
 &lt;br /&gt;
Notes:&lt;br /&gt;
* Oh god this is ugly code. Haha.&lt;br /&gt;
* This does not revert moves but thinks it does. Not sure how to skip them either. BE AWARE.&lt;br /&gt;
* This only goes back 7 (configurable) days by default, but should work with any number of contribs in that timeframe.&lt;br /&gt;
 &lt;br /&gt;
Operation:&lt;br /&gt;
* Gets user&amp;#039;s contribs (query-continues until reaching the time limit).&lt;br /&gt;
** For each contrib that is (top) and not (new) it leaves a checkbox (and info/links).&lt;br /&gt;
* After selecting which to rollback via checkboxes, it iterates over these checkboxes.&lt;br /&gt;
** For each revid, it gets the rollback token, title, and user.&lt;br /&gt;
*** Upon getting the token, it attempts rollback.&lt;br /&gt;
**** If successful, checkbox is unchecked and next is selected (after 1 second delay).&lt;br /&gt;
 &lt;br /&gt;
To do:&lt;br /&gt;
* Delete link for pages created by user? Maybe.&lt;br /&gt;
* Rewrite for efficiency when generator=usercontribs becomes implemented! Oh yah.&lt;br /&gt;
* Markbot optional?&lt;br /&gt;
* Reason field?&lt;br /&gt;
*/&lt;br /&gt;
 &lt;br /&gt;
var amrNumContribs;&lt;br /&gt;
if(!window.amrNumDays) var amrNumDays = 7&lt;br /&gt;
var amrWorking = false;&lt;br /&gt;
 &lt;br /&gt;
if((wgNamespaceNumber == 2 || wgNamespaceNumber == 3) &amp;amp;&amp;amp; wgTitle.indexOf(&amp;#039;/&amp;#039;) == -1 &amp;amp;&amp;amp; (wgAction != &amp;#039;edit&amp;#039; || wgAction != &amp;#039;submit&amp;#039;) &amp;amp;&amp;amp; wgEnableAPI) addOnloadHook(function() {&lt;br /&gt;
  addPortletLink(&amp;#039;p-cactions&amp;#039;,&amp;#039;/wiki/Special:BlankPage?blankspecial=ajaxmr&amp;amp;user=&amp;#039; + encodeURIComponent(wgTitle),&amp;#039;Mass Rollback&amp;#039;,&amp;#039;p-mr&amp;#039;);&lt;br /&gt;
});&lt;br /&gt;
 &lt;br /&gt;
if(wgCanonicalSpecialPageName &amp;amp;&amp;amp; wgCanonicalSpecialPageName == &amp;#039;Contributions&amp;#039; &amp;amp;&amp;amp; wgEnableAPI) addOnloadHook(function() {&lt;br /&gt;
  var ucfrm = document.getElementsByTagName(&amp;#039;form&amp;#039;)[0];&lt;br /&gt;
  var targ = &amp;#039;&amp;#039;;&lt;br /&gt;
  if(ucfrm.target &amp;amp;&amp;amp; ucfrm.target.value != &amp;#039;&amp;#039;) {&lt;br /&gt;
    targ = &amp;#039;&amp;amp;user=&amp;#039; + encodeURIComponent(ucfrm.target.value);&lt;br /&gt;
  }&lt;br /&gt;
  addPortletLink(&amp;#039;p-cactions&amp;#039;,&amp;#039;/wiki/Special:BlankPage?blankspecial=ajaxmr&amp;#039; + targ,&amp;#039;Mass Rollback&amp;#039;,&amp;#039;p-mr&amp;#039;);&lt;br /&gt;
});&lt;br /&gt;
 &lt;br /&gt;
if(wgCanonicalSpecialPageName &amp;amp;&amp;amp; wgCanonicalSpecialPageName.toLowerCase() == &amp;#039;blankpage&amp;#039; &amp;amp;&amp;amp; queryString(&amp;#039;blankspecial&amp;#039;) == &amp;#039;ajaxmr&amp;#039;) {&lt;br /&gt;
  document.title = &amp;#039;Ajax Mass Rollback&amp;#039;;&lt;br /&gt;
  addOnloadHook(amrForm);&lt;br /&gt;
  appendCSS(&amp;#039;#amr-contriblist {border:2px solid black;margin:.7em .1em;padding:.5em;height:20em;overflow:auto;}&amp;#039;&lt;br /&gt;
  + &amp;#039;\n#amr-contriblist li {white-space:nowrap;} .amr-step1 {background-color:#ffff99;} .amr-step2 {background-color:#9999ff;} .amr-step3 {background-color:#99ff99;}&amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function amrForm() {&lt;br /&gt;
  //subvert this Special: page to our own needs.&lt;br /&gt;
  var con = document.getElementById(&amp;#039;content&amp;#039;) || document.getElementById(&amp;#039;mw_content&amp;#039;);&lt;br /&gt;
  var bcon = document.getElementById(&amp;#039;bodyContent&amp;#039;) || document.getElementById(&amp;#039;mw_contentholder&amp;#039;);&lt;br /&gt;
  var fh = getElementsByClassName(con,&amp;#039;h1&amp;#039;,&amp;#039;firstHeading&amp;#039;)[0];&lt;br /&gt;
  while(fh.firstChild) fh.removeChild(fh.firstChild)&lt;br /&gt;
  fh.appendChild(document.createTextNode(&amp;#039;Ajax Mass Rollback&amp;#039;));&lt;br /&gt;
  for(var i=0;i&amp;lt;bcon.childNodes.length;i++) {&lt;br /&gt;
    bcur = bcon.childNodes[i];&lt;br /&gt;
    if(bcur.id != &amp;#039;siteSub&amp;#039; &amp;amp;&amp;amp; bcur.id != &amp;#039;contentSub&amp;#039; &amp;amp;&amp;amp; bcur.className != &amp;#039;visualClear&amp;#039;) {&lt;br /&gt;
      while(bcur.firstChild) bcur.removeChild(bcur.firstChild)&lt;br /&gt;
      if(bcur.nodeType == 3) bcur.nodeValue = &amp;#039;&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  var form = document.createElement(&amp;#039;form&amp;#039;);&lt;br /&gt;
  form.setAttribute(&amp;#039;action&amp;#039;,&amp;#039;javascript:void(0)&amp;#039;);&lt;br /&gt;
   var lab1 = document.createElement(&amp;#039;label&amp;#039;);&lt;br /&gt;
    lab1.setAttribute(&amp;#039;for&amp;#039;,&amp;#039;amr-user&amp;#039;)&lt;br /&gt;
    lab1.appendChild(document.createTextNode(&amp;#039;User (vandal): &amp;#039;));&lt;br /&gt;
   form.appendChild(lab1);&lt;br /&gt;
   var inp1 = document.createElement(&amp;#039;input&amp;#039;);&lt;br /&gt;
    inp1.style.width = &amp;#039;20em&amp;#039;;&lt;br /&gt;
    inp1.setAttribute(&amp;#039;type&amp;#039;,&amp;#039;text&amp;#039;);&lt;br /&gt;
    if(queryString(&amp;#039;user&amp;#039;)) inp1.setAttribute(&amp;#039;value&amp;#039;,queryString(&amp;#039;user&amp;#039;));&lt;br /&gt;
    inp1.setAttribute(&amp;#039;id&amp;#039;,&amp;#039;amr-user&amp;#039;);&lt;br /&gt;
   form.appendChild(inp1);&lt;br /&gt;
   var sub1 = document.createElement(&amp;#039;input&amp;#039;);&lt;br /&gt;
    sub1.setAttribute(&amp;#039;type&amp;#039;,&amp;#039;button&amp;#039;);&lt;br /&gt;
    sub1.setAttribute(&amp;#039;id&amp;#039;,&amp;#039;amr-getcontribs&amp;#039;);&lt;br /&gt;
    sub1.setAttribute(&amp;#039;value&amp;#039;,&amp;#039;start&amp;#039;);&lt;br /&gt;
    sub1.setAttribute(&amp;#039;onclick&amp;#039;,&amp;#039;amrGetContribs()&amp;#039;);&lt;br /&gt;
   form.appendChild(sub1);&lt;br /&gt;
   var ul = document.createElement(&amp;#039;ul&amp;#039;);&lt;br /&gt;
    ul.setAttribute(&amp;#039;id&amp;#039;,&amp;#039;amr-contriblist&amp;#039;);&lt;br /&gt;
   form.appendChild(ul);&lt;br /&gt;
  bcon.appendChild(form);&lt;br /&gt;
  var pre = document.createElement(&amp;#039;pre&amp;#039;);&lt;br /&gt;
   pre.setAttribute(&amp;#039;id&amp;#039;,&amp;#039;amr-output&amp;#039;);&lt;br /&gt;
  bcon.appendChild(pre);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function amrGetContribs(tsoffset) {&lt;br /&gt;
  var start = &amp;#039;&amp;#039;;&lt;br /&gt;
  if(tsoffset) {&lt;br /&gt;
    start = &amp;#039;&amp;amp;ucstart=&amp;#039; + tsoffset;&lt;br /&gt;
  } else {&lt;br /&gt;
    if(amrWorking) return&lt;br /&gt;
    amrWorking = true;&lt;br /&gt;
    document.getElementById(&amp;#039;amr-user&amp;#039;).setAttribute(&amp;#039;disabled&amp;#039;,&amp;#039;disabled&amp;#039;);&lt;br /&gt;
    injectSpinner(document.getElementById(&amp;#039;amr-getcontribs&amp;#039;),&amp;#039;getcontribs-spin&amp;#039;);&lt;br /&gt;
    var ul = document.getElementById(&amp;#039;amr-contriblist&amp;#039;);&lt;br /&gt;
    while(ul.firstChild) ul.removeChild(ul.firstChild)&lt;br /&gt;
    amrNumContribs = 0;&lt;br /&gt;
  }&lt;br /&gt;
  var user = document.getElementById(&amp;#039;amr-user&amp;#039;).value;&lt;br /&gt;
  var now = new Date();&lt;br /&gt;
  var stop = parseInt(now.getTime() / 1000) - 86400 * amrNumDays;&lt;br /&gt;
  var url = wgScriptPath + &amp;#039;/api.php?action=query&amp;amp;format=json&amp;amp;list=usercontribs&amp;amp;ucprop=flags|title|ids|comment|timestamp&amp;amp;uclimit=50&amp;#039; + start + &amp;#039;&amp;amp;ucend=&amp;#039; + stop + &amp;#039;&amp;amp;ucuser=&amp;#039; + encodeURIComponent(user);&lt;br /&gt;
 &lt;br /&gt;
  var req = sajax_init_object();&lt;br /&gt;
  req.open(&amp;#039;GET&amp;#039;, url, true);&lt;br /&gt;
  req.onreadystatechange = function() {&lt;br /&gt;
    if(req.readyState == 4 &amp;amp;&amp;amp; req.status == 200) {&lt;br /&gt;
      eval(&amp;quot;amrPopulatContribs(&amp;quot; + req.responseText + &amp;quot;,&amp;#039;&amp;quot; + req.responseText.replace(/\&amp;#039;/g,&amp;quot;`&amp;quot;) + &amp;quot;&amp;#039;)&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  req.send(null);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function amrPopulatContribs(obj,txt) {&lt;br /&gt;
  var ul = document.getElementById(&amp;#039;amr-contriblist&amp;#039;);&lt;br /&gt;
  if(obj[&amp;#039;error&amp;#039;]) {&lt;br /&gt;
    ul.parentNode.appendChild(document.createTextNode(&amp;#039;Api error: &amp;#039; + obj[&amp;#039;error&amp;#039;][&amp;#039;code&amp;#039;] + &amp;#039; - &amp;#039; + obj[&amp;#039;error&amp;#039;][&amp;#039;info&amp;#039;] + &amp;#039;\n&amp;#039;));&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  if(!obj[&amp;#039;query&amp;#039;] || !obj[&amp;#039;query&amp;#039;][&amp;#039;usercontribs&amp;#039;]) {&lt;br /&gt;
    ul.parentNode.appendChild(document.createTextNode(&amp;#039;Unexpected response: &amp;#039; + txt + &amp;#039;\n&amp;#039;));&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  var uc = obj[&amp;#039;query&amp;#039;][&amp;#039;usercontribs&amp;#039;];&lt;br /&gt;
  for(var i=0;i&amp;lt;uc.length;i++) {&lt;br /&gt;
    if(uc[i][&amp;#039;new&amp;#039;] == &amp;#039;&amp;#039;) {&lt;br /&gt;
      // delete link?&lt;br /&gt;
    } else if(uc[i][&amp;#039;top&amp;#039;] == &amp;#039;&amp;#039;) {&lt;br /&gt;
      var li = document.createElement(&amp;#039;li&amp;#039;);&lt;br /&gt;
       var inp = document.createElement(&amp;#039;input&amp;#039;);&lt;br /&gt;
        inp.setAttribute(&amp;#039;type&amp;#039;,&amp;#039;checkbox&amp;#039;);&lt;br /&gt;
        inp.setAttribute(&amp;#039;checked&amp;#039;,&amp;#039;checked&amp;#039;);&lt;br /&gt;
        inp.setAttribute(&amp;#039;class&amp;#039;,&amp;#039;amr-cl&amp;#039;);&lt;br /&gt;
        inp.setAttribute(&amp;#039;title&amp;#039;,uc[i].title);&lt;br /&gt;
        inp.setAttribute(&amp;#039;id&amp;#039;,&amp;#039;amr-cl-&amp;#039; + uc[i].revid);&lt;br /&gt;
       li.appendChild(inp);&lt;br /&gt;
       var lab = document.createElement(&amp;#039;label&amp;#039;);&lt;br /&gt;
        lab.setAttribute(&amp;#039;for&amp;#039;,&amp;#039;amr-cl-&amp;#039; + uc[i].revid);&lt;br /&gt;
        lab.appendChild(document.createTextNode(uc[i].timestamp.replace(/[TZ]/g,&amp;#039; &amp;#039;)));&lt;br /&gt;
       li.appendChild(lab);&lt;br /&gt;
       li.appendChild(document.createTextNode(&amp;#039;(&amp;#039;));&lt;br /&gt;
       addlinkchild(li, wgScript + &amp;#039;?curid=&amp;#039; + uc[i].pageid + &amp;#039;&amp;amp;diff=prev&amp;amp;oldid=&amp;#039; + uc[i].revid,&amp;#039;diff&amp;#039;);&lt;br /&gt;
       li.appendChild(document.createTextNode(&amp;#039;) (&amp;#039;));&lt;br /&gt;
       addlinkchild(li, wgScript + &amp;#039;?curid=&amp;#039; + uc[i].pageid + &amp;#039;&amp;amp;action=history&amp;#039;,&amp;#039;hist&amp;#039;);&lt;br /&gt;
       li.appendChild(document.createTextNode(&amp;#039;) . . &amp;#039;));&lt;br /&gt;
       addlinkchild(li, wgScript + &amp;#039;?curid=&amp;#039; + uc[i].pageid,uc[i].title);&lt;br /&gt;
       if(uc[i].comment) li.appendChild(document.createTextNode(&amp;#039; (&amp;#039; + uc[i].comment + &amp;#039;)&amp;#039;))&lt;br /&gt;
      ul.appendChild(li);&lt;br /&gt;
      amrNumContribs++;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  if(obj[&amp;#039;query-continue&amp;#039;] &amp;amp;&amp;amp; obj[&amp;#039;query-continue&amp;#039;][&amp;#039;usercontribs&amp;#039;] &amp;amp;&amp;amp; obj[&amp;#039;query-continue&amp;#039;][&amp;#039;usercontribs&amp;#039;][&amp;#039;ucstart&amp;#039;]) {&lt;br /&gt;
    amrGetContribs(obj[&amp;#039;query-continue&amp;#039;][&amp;#039;usercontribs&amp;#039;][&amp;#039;ucstart&amp;#039;]);&lt;br /&gt;
  } else {&lt;br /&gt;
    amrWorking = false;&lt;br /&gt;
    document.getElementById(&amp;#039;amr-user&amp;#039;).removeAttribute(&amp;#039;disabled&amp;#039;);&lt;br /&gt;
    removeSpinner(&amp;#039;getcontribs-spin&amp;#039;);&lt;br /&gt;
    var li = document.createElement(&amp;#039;li&amp;#039;);&lt;br /&gt;
     li.appendChild(document.createTextNode(amrNumContribs + &amp;#039; top contributions found for user (over last &amp;#039; + amrNumDays + &amp;#039; days). &amp;#039;));&lt;br /&gt;
     var sub = document.createElement(&amp;#039;input&amp;#039;);&lt;br /&gt;
      sub.setAttribute(&amp;#039;type&amp;#039;,&amp;#039;button&amp;#039;);&lt;br /&gt;
      sub.setAttribute(&amp;#039;id&amp;#039;,&amp;#039;amr-startrollbacks&amp;#039;);&lt;br /&gt;
      sub.setAttribute(&amp;#039;value&amp;#039;,&amp;#039;rollback selected&amp;#039;);&lt;br /&gt;
      sub.setAttribute(&amp;#039;onclick&amp;#039;,&amp;#039;amrRollbackContribs()&amp;#039;);&lt;br /&gt;
     li.appendChild(sub);&lt;br /&gt;
    ul.insertBefore(li,ul.firstChild);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function amrRollbackContribs(automated) {&lt;br /&gt;
  var out = document.getElementById(&amp;#039;amr-output&amp;#039;);&lt;br /&gt;
  if(!automated) {&lt;br /&gt;
    if(amrWorking) return&lt;br /&gt;
    amrWorking = true;&lt;br /&gt;
    injectSpinner(document.getElementById(&amp;#039;amr-startrollbacks&amp;#039;),&amp;#039;startrollbacks-spin&amp;#039;);&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  var ul = document.getElementById(&amp;#039;amr-contriblist&amp;#039;);&lt;br /&gt;
  var ucs = getElementsByClassName(ul,&amp;#039;input&amp;#039;,&amp;#039;amr-cl&amp;#039;);&lt;br /&gt;
  var uc = false;&lt;br /&gt;
 &lt;br /&gt;
  for(var i=0;i&amp;lt;ucs.length;i++) {&lt;br /&gt;
    if(ucs[i].checked &amp;amp;&amp;amp; ucs[i].parentNode.className == &amp;#039;&amp;#039;) {&lt;br /&gt;
      uc = ucs[i];&lt;br /&gt;
      break;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  if(!uc) {&lt;br /&gt;
    out.appendChild(document.createTextNode(&amp;#039;* Done!&amp;#039;));&lt;br /&gt;
    amrWorking = false;&lt;br /&gt;
  } else {&lt;br /&gt;
    var id = uc.id.replace(/amr\-cl\-/,&amp;#039;&amp;#039;);&lt;br /&gt;
    uc.parentNode.className = &amp;#039;amr-step1&amp;#039;;&lt;br /&gt;
    uc.removeAttribute(&amp;#039;checked&amp;#039;);&lt;br /&gt;
    var page = uc.title;&lt;br /&gt;
    out.appendChild(document.createTextNode(&amp;#039;&amp;gt; Attempting to rollback [[&amp;#039; + page + &amp;#039;]]\n&amp;#039;));&lt;br /&gt;
    amrGetToken(id,page);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function amrGetToken(id,page) {&lt;br /&gt;
  var out = document.getElementById(&amp;#039;amr-output&amp;#039;);&lt;br /&gt;
  out.appendChild(document.createTextNode(&amp;#039; &amp;gt; Fetching rollback token for [[&amp;#039; + page + &amp;#039;]]\n&amp;#039;));&lt;br /&gt;
  var url = wgScriptPath + &amp;#039;/api.php?action=query&amp;amp;format=json&amp;amp;prop=revisions&amp;amp;indexpageids&amp;amp;rvprop=user|ids&amp;amp;rvtoken=rollback&amp;amp;revids=&amp;#039; + id;&lt;br /&gt;
  var req = sajax_init_object();&lt;br /&gt;
  req.open(&amp;#039;GET&amp;#039;, url, true);&lt;br /&gt;
  req.onreadystatechange = function() {&lt;br /&gt;
    if(req.readyState == 4 &amp;amp;&amp;amp; req.status == 200) {&lt;br /&gt;
      eval(&amp;quot;amrRollback(&amp;quot; + req.responseText + &amp;quot;,&amp;#039;&amp;quot; + req.responseText.replace(/\&amp;#039;/g,&amp;quot;`&amp;quot;) + &amp;quot;&amp;#039;)&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  req.send(null);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function amrRollback(obj,txt) {&lt;br /&gt;
  var out = document.getElementById(&amp;#039;amr-output&amp;#039;);&lt;br /&gt;
  if(obj[&amp;#039;error&amp;#039;]) {&lt;br /&gt;
    out.appendChild(document.createTextNode(&amp;#039; ! Api error: &amp;#039; + obj[&amp;#039;error&amp;#039;][&amp;#039;code&amp;#039;] + &amp;#039; - &amp;#039; + obj[&amp;#039;error&amp;#039;][&amp;#039;info&amp;#039;] + &amp;#039;\n&amp;#039;));&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  if(!obj[&amp;#039;query&amp;#039;] || !obj[&amp;#039;query&amp;#039;][&amp;#039;pageids&amp;#039;] || !obj[&amp;#039;query&amp;#039;][&amp;#039;pages&amp;#039;][obj[&amp;#039;query&amp;#039;][&amp;#039;pageids&amp;#039;][0]]) {&lt;br /&gt;
    out.appendChild(document.createTextNode(&amp;#039;  ? Unexpected response: &amp;#039; + txt + &amp;#039;\n&amp;#039;));&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  var pid = obj[&amp;#039;query&amp;#039;][&amp;#039;pages&amp;#039;][obj[&amp;#039;query&amp;#039;][&amp;#039;pageids&amp;#039;][0]];&lt;br /&gt;
  if(!pid[&amp;#039;title&amp;#039;] || !pid[&amp;#039;revisions&amp;#039;] || !pid[&amp;#039;revisions&amp;#039;][0] || !pid[&amp;#039;revisions&amp;#039;][0][&amp;#039;user&amp;#039;] || !pid[&amp;#039;revisions&amp;#039;][0][&amp;#039;revid&amp;#039;] || !pid[&amp;#039;revisions&amp;#039;][0][&amp;#039;rollbacktoken&amp;#039;]) {&lt;br /&gt;
    out.appendChild(document.createTextNode(&amp;#039;  ?? Unexpected response: &amp;#039; + txt + &amp;#039;\n&amp;#039;));&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  var id = pid[&amp;#039;revisions&amp;#039;][0][&amp;#039;revid&amp;#039;];&lt;br /&gt;
  var uc = document.getElementById(&amp;#039;amr-cl-&amp;#039; + id);&lt;br /&gt;
  if(uc) uc.parentNode.className = &amp;#039;amr-step2&amp;#039;&lt;br /&gt;
  var user = pid[&amp;#039;revisions&amp;#039;][0][&amp;#039;user&amp;#039;];&lt;br /&gt;
  var token = pid[&amp;#039;revisions&amp;#039;][0][&amp;#039;rollbacktoken&amp;#039;];&lt;br /&gt;
  var title = pid[&amp;#039;title&amp;#039;];&lt;br /&gt;
  out.appendChild(document.createTextNode(&amp;#039;  &amp;gt; Token found, attempting rollback\n&amp;#039;));&lt;br /&gt;
 &lt;br /&gt;
  var params = &amp;#039;action=rollback&amp;amp;format=json&amp;amp;markbot=1&amp;amp;token=&amp;#039; + encodeURIComponent(token) + &amp;#039;&amp;amp;title=&amp;#039; + encodeURIComponent(title) + &amp;#039;&amp;amp;user=&amp;#039; + encodeURIComponent(user);&lt;br /&gt;
  var url = wgScriptPath + &amp;#039;/api.php&amp;#039;;&lt;br /&gt;
 &lt;br /&gt;
  var req = sajax_init_object();&lt;br /&gt;
  req.open(&amp;#039;POST&amp;#039;, url, true);&lt;br /&gt;
  req.setRequestHeader(&amp;#039;Content-type&amp;#039;, &amp;#039;application/x-www-form-urlencoded&amp;#039;);&lt;br /&gt;
  req.setRequestHeader(&amp;#039;Content-length&amp;#039;, params.length);&lt;br /&gt;
  req.setRequestHeader(&amp;#039;Connection&amp;#039;, &amp;#039;close&amp;#039;);&lt;br /&gt;
  req.onreadystatechange = function() {&lt;br /&gt;
    if(req.readyState == 4 &amp;amp;&amp;amp; req.status == 200) {&lt;br /&gt;
      eval(&amp;quot;amrRollbackAftermath(&amp;quot; + req.responseText + &amp;quot;,&amp;#039;&amp;quot; + req.responseText.replace(/\&amp;#039;/g,&amp;quot;`&amp;quot;) + &amp;quot;&amp;#039;)&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  req.send(params);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function amrRollbackAftermath(obj,txt) {&lt;br /&gt;
  var out = document.getElementById(&amp;#039;amr-output&amp;#039;);&lt;br /&gt;
  if(obj[&amp;#039;error&amp;#039;]) {&lt;br /&gt;
    out.appendChild(document.createTextNode(&amp;#039;   ! Api error: &amp;#039; + obj[&amp;#039;error&amp;#039;][&amp;#039;code&amp;#039;] + &amp;#039; - &amp;#039; + obj[&amp;#039;error&amp;#039;][&amp;#039;info&amp;#039;] + &amp;#039;\n&amp;#039;));&lt;br /&gt;
  } else if(obj[&amp;#039;rollback&amp;#039;] &amp;amp;&amp;amp; obj[&amp;#039;rollback&amp;#039;][&amp;#039;title&amp;#039;]) {&lt;br /&gt;
    var rb = obj[&amp;#039;rollback&amp;#039;];&lt;br /&gt;
    out.appendChild(document.createTextNode(&amp;#039;   &amp;gt; Page [[&amp;#039; + rb[&amp;#039;title&amp;#039;] + &amp;#039;]] rollbacked (&amp;#039;));&lt;br /&gt;
    addlinkchild(out, wgScript + &amp;#039;?curid=&amp;#039; + rb[&amp;#039;pageid&amp;#039;] + &amp;#039;&amp;amp;diff=next&amp;amp;oldid=&amp;#039; + rb[&amp;#039;old_revid&amp;#039;],&amp;#039;diff&amp;#039;);&lt;br /&gt;
    out.appendChild(document.createTextNode(&amp;#039;).\n&amp;#039;));&lt;br /&gt;
    if(obj[&amp;#039;rollback&amp;#039;][&amp;#039;old_revid&amp;#039;]) {&lt;br /&gt;
      var uc = document.getElementById(&amp;#039;amr-cl-&amp;#039; + obj[&amp;#039;rollback&amp;#039;][&amp;#039;old_revid&amp;#039;]);&lt;br /&gt;
      uc.setAttribute(&amp;#039;disabled&amp;#039;,&amp;#039;disabled&amp;#039;);&lt;br /&gt;
      if(uc) uc.parentNode.className = &amp;#039;amr-step3&amp;#039;&lt;br /&gt;
    }&lt;br /&gt;
  } else {&lt;br /&gt;
    out.appendChild(document.createTextNode(&amp;#039;   ? Unexpected response: &amp;#039; + txt + &amp;#039;\n&amp;#039;));&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  setTimeout(&amp;#039;amrRollbackContribs(true)&amp;#039;,1000);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function addlinkchild(obj,href,text,id,classes) {&lt;br /&gt;
  if(!obj || !href || !text) return false;&lt;br /&gt;
  var a = document.createElement(&amp;#039;a&amp;#039;);&lt;br /&gt;
  a.setAttribute(&amp;#039;href&amp;#039;,href);&lt;br /&gt;
  a.appendChild(document.createTextNode(text));&lt;br /&gt;
  if(id) a.setAttribute(&amp;#039;id&amp;#039;,id);&lt;br /&gt;
  if(classes) a.setAttribute(&amp;#039;class&amp;#039;,classes);&lt;br /&gt;
  obj.appendChild(a);&lt;br /&gt;
  return a;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function queryString(p) {&lt;br /&gt;
  var re = RegExp(&amp;#039;[&amp;amp;?#]&amp;#039; + p + &amp;#039;=([^&amp;amp;#]*)&amp;#039;);&lt;br /&gt;
  var matches;&lt;br /&gt;
  if (matches = re.exec(document.location)) {&lt;br /&gt;
    try { &lt;br /&gt;
      return decodeURI(matches[1]);&lt;br /&gt;
    } catch (e) {&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return null;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Jarandhel</name></author>
	</entry>
</feed>