User:Rory096/monobook.js

In today's world, User:Rory096/monobook.js is an issue that has become increasingly relevant in society. Since its emergence, it has impacted different aspects of daily life, generating debates, controversies and significant transformations. Its influence extends to different areas, from the political to the cultural, and has managed to capture the attention of experts and citizens alike. Given the diversity of opinions and perspectives, it is crucial to analyze in detail and critically the role that User:Rory096/monobook.js currently plays, as well as its possible implications for the future. That is why in this article we propose to exhaustively and objectively examine the different aspects related to User:Rory096/monobook.js, in order to offer a comprehensive vision that allows us to understand its importance and impact on contemporary society.
 // -----------------------------------------------------------------------------
 // God-like Monobook skin
 // (c) 2005 Sam Hocevar <[email protected]>
 // $Id: godmode-light.js 1029 2006-01-09 11:05:19Z sam $
 // Several customizations have been made by User:Peruvianllama
 // Several customizations have been added from User:Freakofnurture 
 //http://en.wikipedia.org/w/index.php?title=User%3AFreakofnurture%2Fmonobook.js&diff=30220662&oldid=30119499
 // -----------------------------------------------------------------------------

 // -----------------------------------------------------------------------------
 // Removed multiple language support; see original for this feature.
 // -----------------------------------------------------------------------------
 var rollbacklink = 'rollback';
 var cantrollback = 'Cannot revert edit; last contributor is only author of this page.';
 var alreadyrolled = 'Cannot rollback last edit of ] by ] (]); someone else has edited or rolled back the page already. Last edit was by ] (]). ';
 var revertpage = 'Reverted edits by ] (]) to last version by $1';

 // Most of the following edittypes were stolen from User:Freakofnurture/monobook.js, as of Dec. 10, 2005
 var edittype = 'edits';
 abbrev = Array();
 abbrev = 'personal attacks';
 abbrev = 'personal attacks';
 abbrev = 'blanking';
 abbrev = 'blanking';
 abbrev = 'blanking';
 abbrev = 'illegal chess move';
 abbrev = 'flagrant vandalism';
 abbrev = 'flagrant vandalism';
 abbrev = 'flagrant vandalism';
 abbrev = 'flagrant vandalism';
 abbrev = 'image changes';
 abbrev = 'misinformation';
 abbrev = '] attempt'; 
 abbrev = '] attempt'; 
 abbrev = '] attempt'; 
 abbrev = 'unnecessary external linkage';
 abbrev = 'unnecessary external linkage';
 abbrev = 'nonsense';
 abbrev = 'profane language';
 abbrev = 'profane language';
 abbrev = 'profane language';
 abbrev = 'redirection';
 abbrev = 'redirection';
 abbrev = 'spam/advertisement';
 abbrev = 'experimental edits';
 abbrev = 'typing practice';
 abbrev = 'typing practice';
 abbrev = 'unexplained removal of text';
 abbrev = 'unexplained removal of text';
 abbrev = 'unexplained removal of a template';
 abbrev = 'vandalism';
 abbrev = 'vandalism';
 abbrev = 'vandalism';
 abbrev = 'probable vanity entry';
 abbrev = 'probable vanity entry';

 // -----------------------------------------------------------------------------
 // XMLHttpRequest support
 // -----------------------------------------------------------------------------
 if (document.implementation.createDocument) {
   var gml_xmlparser = new DOMParser();
 }

 function gml_XMLParse(string) {
  if (document.implementation.createDocument) {
    return gml_xmlparser.parseFromString(string, "text/xml");
  } else if (window.ActiveXObject) {
    var gml_xmldoc = new ActiveXObject("Microsoft.XMLDOM");
    gml_xmldoc.async = "false";
    ret = gml_xmldoc.loadXML(string);      
    if (!ret)
      return null;
    return gml_xmldoc.documentElement;
  }
  return null;
 }

 var gml_xmlhttp;

 function HTTPClient() {
  var gml_http;
  if(window.XMLHttpRequest) {
    gml_http = new XMLHttpRequest();
  } else if (window.ActiveXObject) {
    try {
      gml_http = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        gml_http = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
        gml_http = false;
      }
    }
  }
  return gml_http;
 }

 // -----------------------------------------------------------------------------
 // MD5 hash calculator
 // -----------------------------------------------------------------------------
 // Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
 // Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
 // Distributed under the BSD License
 // See http://pajhome.org.uk/crypt/md5 for more info.
 // -----------------------------------------------------------------------------
 var hexcase = 0;
 var b64pad  = "";
 var chrsz   = 8;

 function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}

 function core_md5(x, len)
 {
  x |= 0x80 << ((len) % 32);
  x = len;

  var a =  1732584193;
  var b = -271733879;
  var c = -1732584194;
  var d =  271733878;

  for(var i = 0; i < x.length; i += 16)
  {
    var olda = a;
    var oldb = b;
    var oldc = c;
    var oldd = d;

    a = md5_ff(a, b, c, d, x, 7 , -680876936); d = md5_ff(d, a, b, c, x, 12, -389564586); c = md5_ff(c, d, a, b, x, 17,  606105819); b = md5_ff(b, c, d, a, x, 22, -1044525330); a = md5_ff(a, b, c, d, x, 7 , -176418897); d = md5_ff(d, a, b, c, x, 12,  1200080426); c = md5_ff(c, d, a, b, x, 17, -1473231341); b = md5_ff(b, c, d, a, x, 22, -45705983); a = md5_ff(a, b, c, d, x, 7 ,  1770035416); d = md5_ff(d, a, b, c, x, 12, -1958414417); c = md5_ff(c, d, a, b, x, 17, -42063); b = md5_ff(b, c, d, a, x, 22, -1990404162); a = md5_ff(a, b, c, d, x, 7 ,  1804603682); d = md5_ff(d, a, b, c, x, 12, -40341101); c = md5_ff(c, d, a, b, x, 17, -1502002290); b = md5_ff(b, c, d, a, x, 22,  1236535329);

    a = md5_gg(a, b, c, d, x, 5 , -165796510); d = md5_gg(d, a, b, c, x, 9 , -1069501632); c = md5_gg(c, d, a, b, x, 14,  643717713); b = md5_gg(b, c, d, a, x, 20, -373897302); a = md5_gg(a, b, c, d, x, 5 , -701558691); d = md5_gg(d, a, b, c, x, 9 ,  38016083); c = md5_gg(c, d, a, b, x, 14, -660478335); b = md5_gg(b, c, d, a, x, 20, -405537848); a = md5_gg(a, b, c, d, x, 5 ,  568446438); d = md5_gg(d, a, b, c, x, 9 , -1019803690); c = md5_gg(c, d, a, b, x, 14, -187363961); b = md5_gg(b, c, d, a, x, 20,  1163531501); a = md5_gg(a, b, c, d, x, 5 , -1444681467); d = md5_gg(d, a, b, c, x, 9 , -51403784); c = md5_gg(c, d, a, b, x, 14,  1735328473); b = md5_gg(b, c, d, a, x, 20, -1926607734);

    a = md5_hh(a, b, c, d, x, 4 , -378558); d = md5_hh(d, a, b, c, x, 11, -2022574463); c = md5_hh(c, d, a, b, x, 16,  1839030562); b = md5_hh(b, c, d, a, x, 23, -35309556); a = md5_hh(a, b, c, d, x, 4 , -1530992060); d = md5_hh(d, a, b, c, x, 11,  1272893353); c = md5_hh(c, d, a, b, x, 16, -155497632); b = md5_hh(b, c, d, a, x, 23, -1094730640); a = md5_hh(a, b, c, d, x, 4 ,  681279174); d = md5_hh(d, a, b, c, x, 11, -358537222); c = md5_hh(c, d, a, b, x, 16, -722521979); b = md5_hh(b, c, d, a, x, 23,  76029189); a = md5_hh(a, b, c, d, x, 4 , -640364487); d = md5_hh(d, a, b, c, x, 11, -421815835); c = md5_hh(c, d, a, b, x, 16,  530742520); b = md5_hh(b, c, d, a, x, 23, -995338651);

    a = md5_ii(a, b, c, d, x, 6 , -198630844); d = md5_ii(d, a, b, c, x, 10,  1126891415); c = md5_ii(c, d, a, b, x, 15, -1416354905); b = md5_ii(b, c, d, a, x, 21, -57434055); a = md5_ii(a, b, c, d, x, 6 ,  1700485571); d = md5_ii(d, a, b, c, x, 10, -1894986606); c = md5_ii(c, d, a, b, x, 15, -1051523); b = md5_ii(b, c, d, a, x, 21, -2054922799); a = md5_ii(a, b, c, d, x, 6 ,  1873313359); d = md5_ii(d, a, b, c, x, 10, -30611744); c = md5_ii(c, d, a, b, x, 15, -1560198380); b = md5_ii(b, c, d, a, x, 21,  1309151649); a = md5_ii(a, b, c, d, x, 6 , -145523070); d = md5_ii(d, a, b, c, x, 10, -1120210379); c = md5_ii(c, d, a, b, x, 15,  718787259); b = md5_ii(b, c, d, a, x, 21, -343485551);

    a = safe_add(a, olda);
    b = safe_add(b, oldb);
    c = safe_add(c, oldc);
    d = safe_add(d, oldd);
  }
  return Array(a, b, c, d);

 }

 function md5_cmn(q, a, b, x, s, t) { return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b); }
 function md5_ff(a, b, c, d, x, s, t) { return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); }
 function md5_gg(a, b, c, d, x, s, t) { return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); }
 function md5_hh(a, b, c, d, x, s, t) { return md5_cmn(b ^ c ^ d, a, b, x, s, t); }
 function md5_ii(a, b, c, d, x, s, t) { return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); }

 function safe_add(x, y)
 {
  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return (msw << 16) | (lsw & 0xFFFF);
 }

 function bit_rol(num, cnt)
 {
  return (num << cnt) | (num >>> (32 - cnt));
 }

 function str2binl(str)
 {
  var bin = Array();
  var mask = (1 << chrsz) - 1;
  for(var i = 0; i < str.length * chrsz; i += chrsz)
    bin |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
  return bin;
 }

 function binl2hex(binarray)
 {
  var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
  var str = "";
  for(var i = 0; i < binarray.length * 4; i++)
  {
    str += hex_tab.charAt((binarray >> ((i%4)*8+4)) & 0xF) +
           hex_tab.charAt((binarray >> ((i%4)*8  )) & 0xF);
  }
  return str;
 }

 // -----------------------------------------------------------------------------
 // Our nice Revert functions
 // -----------------------------------------------------------------------------
 var gml_vandal, gml_editor, gml_url;

 function PerformRevert() {
  var l, token = '', revert = false;
  // Look for '&fakeaction=rollback' in URL
  gml_url = location.pathname;
  l = location.search.substring(1).split('&');
  for (i = 0; i < l.length; i++) {
    var n = l.indexOf('=');
    var name = l.substring(0, n);
    if (name == 'fakeaction') {
      if (l.substring(n + 1) == 'rollback'){
        revert = true;
        edittype = window.prompt("What type of edit?");
        if (edittype.substr(0,2) == "c ") {  //Allow for "custom" edit summary"
          edittype = edittype.substr(2,edittype.length);
        } else if (abbrev) {
          edittype = abbrev;
        } else {
          edittype = 'edits';
        }
      }
    } else if (name == 'vandal') {
      gml_vandal = unescape(l.substring(n + 1));
    } else if (name == 'token') {
      token = unescape(l.substring(n + 1));
    } else if (name == 'title') {
      gml_url += '?' + l;
    }
  }
  if (!revert)
    return;
  document.getElementById('bodyContent').innerHTML = 'Please wait, reverting edits by ' + gml_vandal + '...';
  // Avoid XSS kiddies by using a special token
  if (token == '' || token != hex_md5(gml_url + gml_vandal + document.cookie)) {
    document.getElementById('bodyContent').innerHTML += '<br />Bad authentication token!';
    return;
  }

  gml_xmlhttp = HTTPClient();
  if (!gml_xmlhttp)
    return;
  history_url = gml_url + '&action=history&limit=20';
  document.getElementById('bodyContent').innerHTML += '<br />Getting article history (' + history_url + ')...';
  gml_xmlhttp.open("GET", history_url, true);
  gml_xmlhttp.onreadystatechange = RevertStepTwo;
  gml_xmlhttp.send(null);
 }

 function RevertStepTwo() {
  if (gml_xmlhttp.readyState != 4)
    return;
  var l;
  var oldid;
  // Get the vandal and new editor names
  gml_vandal = gml_vandal.replace(/_/g, ' ');
  gml_editor = '';
  // Hack for a MediaWiki bug
  xml = gml_xmlhttp.responseText.replace(/<body.*"ns-4">/, '<body class="ns-4">');
  doc = gml_XMLParse(xml);
  if (!doc || !doc.getElementById('pagehistory')) {
    document.getElementById('bodyContent').innerHTML += '<br />Failed to parse XML data returned by the server.';
    document.getElementById('bodyContent').innerHTML += '<br /><b>Hint: try to disable both "Enable section editing by right-clicking on section titles (JavaScript)" and "Edit pages on double click (JavaScript)" in your editing preferences until a proper fix is found</b>.';
    document.getElementById('bodyContent').innerHTML += '<br />Dump of the unparseable page : <br />' + xml.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
    return;
  }
  l = doc.getElementById('pagehistory').getElementsByTagName('li');
  //l = doc.selectSingleNode('//*').getElementsByTagName('li');
  for (i = 0; i < l.length; i++) {
    var name = l.getElementsByTagName('span').getElementsByTagName('a').innerHTML.replace(/_/g, ' ');
    if (i == 0 && name != gml_vandal) {
      document.getElementById('bodyContent').innerHTML += '<br />Error: Last editor is ' + name + ', not ' + gml_vandal + '!';
      return;
    } else if (i > 0 && name != gml_vandal) {
      oldid = l.getElementsByTagName('input').value;
      gml_editor = name;
      break;
    }
  }
  if (gml_editor == '') {
    document.getElementById('bodyContent').innerHTML += '<br />Error: ' + gml_vandal + ' is the only editor!';
    return;
  }

  gml_xmlhttp = HTTPClient();
  if (!gml_xmlhttp)
    return;
  document.getElementById('bodyContent').innerHTML += '<br />Getting article edit form (GET' + gml_url + '&action=edit&oldid=' + oldid + ')...';
  gml_xmlhttp.open('GET', gml_url + '&action=edit&oldid=' + oldid, true);
  gml_xmlhttp.onreadystatechange = RevertStepThree;
  gml_xmlhttp.send(null);
 }

 function RevertStepThree() {
  if (gml_xmlhttp.readyState != 4)
    return
  var form, newform, l;
  // Insert the downloaded form in our current page, using
  // only hidden form inputs.
  doc = gml_XMLParse(gml_xmlhttp.responseText);
  form = doc.getElementById('editform');
  newform = document.createElement('form');
  l = form.getElementsByTagName('textarea');
  for (i = l.length; i--; ) {
    var t = document.createElement('input');
    t.type = 'hidden';
    t.name = l.name;
    t.value = l.value;
    newform.appendChild(t);
  }
  l = form.getElementsByTagName('input');
  for (i = l.length; i--; ) {
    if (l.name == 'wpSummary') {
      var revertpage = 'Reverted ' + edittype + ' by ] (]) to last version by $1';
      l.value = revertpage.replace(/\$1/g, gml_editor).replace(/\$2/g, gml_vandal);
    } else if (l.name == 'wpMinoredit') {
      l.value = '1';
    } else if (l.name == 'wpWatchthis') {
      if (!l.checked)
        continue; // Don’t touch the "watch" status
      l.value = "on";
    } else if (l.name == 'wpPreview') {
      continue;
    } else if (l.name == 'wpDiff') {
      continue;
    }
    l.type = 'hidden';
    newform.appendChild(l);
  }
  newform.name = form.name;
  newform.method = form.method;
  newform.id = form.id;
  newform.action = form.action;
  document.getElementById('bodyContent').innerHTML += '<br />Submitting form...';
  document.getElementById('bodyContent').appendChild(newform);
  // Submit the form
  newform.submit();
  opentalk(gml_vandal);
 }

 // -----------------------------------------------------------------------------
 // Add revert buttons to the page
 // -----------------------------------------------------------------------------
 function AddRevertButtons() {
  var l, article = '', vandal;
  // Add 'revert' links to a diff page
  l = document.getElementById('bodyContent').getElementsByTagName('td');
  for (i = 0; i < l.length; i++) {
    if (l.className == 'diff-otitle') {
      article = l.getElementsByTagName('a').href.split('&').replace(/*\/\/*/, '');
    } else if (l.className == 'diff-ntitle') {
      var toplink = l.getElementsByTagName('a').href;
      vandal = l.getElementsByTagName('a').title.split(':');
      if (vandal.indexOf('&') > -1)
        vandal = vandal.split('&');
      var t = l.innerHTML
      n = t.indexOf('</a>) <br') + t.indexOf('</A>) <BR') + 1; // XXX: WOW HACK!!!!
      if (n >= 0 && article != '' && toplink.indexOf('oldid=') == -1) {
        l.innerHTML = t.substring(0, n + 5) + ' &nbsp;&nbsp;&nbsp;<strong></strong> ' + t.substring(n + 5, t.length);
      }
    }
  }
  // Add 'revert' links to a contributions page
  if (location.href.indexOf(':Contributions') != -1) {
    var c = document.getElementById('contentSub');
    var a = c.getElementsByTagName('a');
    if (a.length == 4) {
      vandal = a.innerHTML;
    } else {
      vandal = c.innerHTML.replace(/ \(.*/, '').replace(/.* /, '');
    }
    l = document.getElementById('bodyContent').getElementsByTagName('li');
    for (i = 0; i < l.length; i++) {
      var t = l.innerHTML
      // If we are already a sysop on this wiki, abort
      if (t.indexOf('>' + rollbacklink + '</a>]') != -1)
          break;
      //if (t.indexOf('&amp;diff=0') != -1) {
      if (t.indexOf('<strong> (') != -1) {
        article = l.getElementsByTagName('a').href.split('&').replace(/*\/\/*/, '');
        l.innerHTML += ' ';
      }
    }
  }
 }


 // --------------------------------------------------
 // Drop-dead simple function to open a new window with the vandal's talk page, for test/test-n warnings
 // Firefox users, see the following URL to force Firefox to open "new windows" in new tabs instead:
 // http://www.mozilla.org/support/firefox/tips#beh_tabbedbrowsingoptions
 // Do note that FireFox interprets this as a "pop-up" window. To get around this, either enable 
 // popups for http://en.wikipedia.org, or place:  onClick="javascript:opentalk(....
 // within both of the rollback links (inside function AddRevertButtons())
 // --------------------------------------------------
 function opentalk(vandal) {
  window.open('http://en.wikipedia.org/w/index.php?title=User_talk:' + vandal + '&action=edit', '_VandalTalk' + vandal);
 }


 // -----------------------------------------------------------------------------
 // Modify the page once it is loaded
 // -----------------------------------------------------------------------------
 if (window.addEventListener) {
  window.addEventListener("load", PerformRevert, false);
  window.addEventListener("load", AddRevertButtons, false);
 } else if (window.attachEvent) {
  window.attachEvent("onload", PerformRevert);
  window.attachEvent("onload", AddRevertButtons);
 }








<!--BEGIN USER CACTIONS-->
// Script from ]
document.write('<script type="text/javascript" src="' 
             + 'http://en.wikipedia.org/w/index.php?title=User:Haza-w/cactions.js' 
             + '&action=raw&ctype=text/javascript&dontcountme=s"></script>');
var ctOriginalTabs = 1;
<!--END USER CACTIONS-->








<!--BEGIN TEST TABS-->
//

function tnaddlilink(url, name)
{
  var na = document.createElement('a');
  na.setAttribute('href', url);

  var txt = document.createTextNode(name);
  na.appendChild(txt);

  var li = document.createElement('li');
  li.appendChild(na);
  return li;
}

function testn(number)
{
  var page = prompt("Vandalism to which article?")
  var f = document.editform, t = f.wpTextbox1;
  if (t.value.length > 0)
    t.value += '\n';
  t.value += "{{subst:" + "test" + number + "-n|" + page + "}} ~" + "~" + "~" + "~";
  f.wpSummary.value = "Vandalism to ] - warning " + number;
}

function add_testn_tabs()
{
  var c1 = document.getElementById('column-one');
  var tabs = c1.getElementsByTagName('div').getElementsByTagName('ul');

  // Only add for pages with "Editing User talk:" somewhere in the title
  if (document.title.indexOf("Editing User talk:") != -1)
    {
      tabs.appendChild(tnaddlilink('javascript:testn(1)',"t1"));
      tabs.appendChild(tnaddlilink('javascript:testn(2)',"t2"));
      tabs.appendChild(tnaddlilink('javascript:testn(3)',"t3"));
      tabs.appendChild(tnaddlilink('javascript:testn(4)',"t4"));
    }
}

$(add_testn_tabs);

//
<!--END TEST TABS-->









<!--BEGIN ARV-->
function inc (file) {
  mw.loader.load('/w/index.php?title='+file+'&action=raw&ctype=text/javascript&dontcountme=s');
}
inc("User:Lightdarkness/aiv.js");
<!--END ARV-->





<!--BEGIN AUTO-AFD-->
//

//Auto AFD script

//Please include the two following lines
//Modified version of AutoVFD script to work with AFD
//Script Modified by User:Jtkiefer

//<nowiki>
// This needs to change depending on skin used.
function add_link(url, name)
{
  var na = document.createElement('a');
  na.setAttribute('href', url);
  na.appendChild(document.createTextNode(name));

  var li = document.createElement('li');
  li.appendChild(na);

  var tabs = document.getElementById('p-cactions').getElementsByTagName('ul');
  tabs.appendChild(li);
}

function strip_namespace(target)
{
  var colon = target.indexOf(':');
  if (colon != -1)
    {
      var spaces = new Array('User', 'Wikipedia', 'Image', 'MediaWiki', 'Template', 'Help', 'Category');
      var ns = target.substring(0, colon);
      if (ns == '' || ns == 'Talk')
        return target.substring(colon + 1);
      else
        for (var i = 0; i < spaces.length; ++i)
          {
            if (ns == spaces
                || ns == spaces + '_talk')
              return target.substring(colon + 1);
          }
    }

  return target;
}

function afd()
{
  document.editform.wpTextbox1.value = '{{' + 'subst:afd}}\n' + document.editform.wpTextbox1.value;
  document.editform.wpSummary.value = 'afd';

  var target = document.editform.action;
  target = target.substring(target.indexOf('title=') + 6,
                            target.lastIndexOf('&action=submit'));

  var months = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
  var date = new Date();
  date = date.getUTCFullYear() + '_' + months + '_' + date.getUTCDate();

  var pagename = strip_namespace(target);

  window.open('/w/index.php?title=Wikipedia:Articles_for_deletion/' + pagename + '&action=edit&fakeaction=afdsub&faketarget=' + target,
              'Afd ' + unescape(target),
              'status,toolbar,location,menubar,directories,resizeable,scrollbars');
  window.open('/w/index.php?title=Wikipedia:Articles_for_deletion/Log/' + date + '&action=edit&fakeaction=afdlist&faketarget=' + pagename,
              'AfdLog ' + unescape(target),
              'status,toolbar,location,menubar,directories,resizeable,scrollbars');
}

function autoafd()
{
  if (document.title.indexOf('Editing ') == 0)
    {
      var action = '';
      var target = '';
      if (location.search)
        {
          var l = location.search.substring(1).split('&');
          for (var i = 0; i < l.length; ++i)
            {
              var eq = l.indexOf('=');
              var name = l.substring(0, eq);
              if (name == 'fakeaction')
                action = l.substring(eq + 1);
              else if (name == 'faketarget')
                target = unescape(l.substring(eq + 1)).replace(/_/g, ' ');
            }
        }

      if (action == 'afdlist')
        {
          document.editform.wpTextbox1.value += '{{' + 'Wikipedia:Articles for deletion/' + target + '}}\n';
          document.editform.wpSummary.value = ']';
        }
      else if (action == 'afdsub')
        {
          if (document.editform.wpTextbox1.value.length > 0)
            {
              target = document.editform.action;
              target = unescape(target.substring(target.indexOf('title=') + 6, target.lastIndexOf('&action=submit'))).replace(/_/g, ' ');
              window.alert("There's an old afd at the default location already.\n\n" +
                           'Please either move it out of the way (and update existing links to it), or file the Afd by hand in another location (such as ]).');
            }
          else
            document.editform.wpTextbox1.value += '===]===\n' +
              'Reason for nomination. ~~' + '~~\n*\n*\n*\n';
        }
      else
        add_link('javascript:afd()', 'Afd');
    }
}

$(autoafd);

//</nowiki>
<!--END AUTO-AFD-->
















<!--BEGIN EDIT COUNT CRAP-->
// see http://paperlined.org/apps/wikipedia/Tool2/ for instructions on adding this to your monobook.js

// To run this tool on other servers:
// 1. copy this script to the target server (this is required because of javascript cross-site security restrictions)

// 2. update the following URL
// for example: "User:Interiot/Tool2/code.js"
var tool2_url = "User:Interiot/Tool2/code.js";

// 3. update this namespace list, extracted from something like http://en.wikiquote.orghttps://wikifreehand.com/en/Special:Export//
// These *should not* have colons after them.
var namespaces = [
"Talk",
"User",
"User talk",
"Wikiquote",
"Wikiquote talk",
"Image",
"Image talk",
"MediaWiki",
"MediaWiki talk",
"Template",
"Template talk",
"Help",
"Help talk",
"Category",
"Category talk",
 // 3b. these two project project entries are not added by Special:Export, and might or might not need to be updated
"Wikipedia",
"Wikipedia talk"
];

// 4. update this date-parser to match the format and language of your specific wiki.  Feel free to contact Interiot regarding this, if you can't find another
// copy of this script that uses the same language.
// input: a text string from Special:Contributions.    output: a javascript Date object
// documentation:  http://www.quirksmode.org/js/introdate.html#parse, http://www.elated.com/tutorials/programming/javascript/dates/
function date_parse(text) {
 var matches = text.match(/^(+), +(+) +(+) +(+)$/i);
 if (!matches) {
 //dump_text("XXX"); // for debugging
 return matches;
 }

 parseme = matches + ", " + matches + " "  + matches + " " + matches + ":00";

 //dump_text(parseme); // for debugging

 var dt = new Date();
 dt.setTime( Date.parse(parseme));

 //dump_text(dt.toLocaleString()); // for debugging

 return dt;
}

// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ end of server-specific configuration ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^



// TODO:
// - the current document.location method doesn't work when the page is accessed sans-mod_rewrite
// - test with non-ASCII characters
// - non-ascii usernames
// - ??



var prefix = "";
var params = parse_params();

addOnloadFunction(function() {
  var path_len = document.location.pathname.length;
  // trigger once we view the right page
  if (document.location.pathname.substring(path_len - tool2_url.length, path_len) == tool2_url) {
    // get the prefix (needs to be fixed to work sans-mod_rewrite
    prefix = document.location.protocol + "//" + document.location.host + "/"
            + document.location.pathname.substring(1, path_len - tool2_url.length);

    // blank the inner contents of the page
    var bodyContent = document.getElementById("bodyContent");
    while (bodyContent.childNodes.length > 0) bodyContent.removeChild(bodyContent.lastChild);

    if (document.location.search.length == 0) {
      generate_input_form(bodyContent);
    } else {
      generate_main_report(bodyContent);
    }
  }
});


function generate_input_form(bodyContent) {
  if (navigator.userAgent.toLowerCase().indexOf('msie')+1)
  {
  bodyContent.innerHTML = "This counter does not currently work in Internet Explorer.  Please <a href='http://www.getfirefox.com'>get Firefox</a> or use <a href='http://en.wikipedia.orghttps://wikifreehand.com/en/Wikipedia:WikiProject_edit_counters/Flcelloguy%27s_Tool'>Flcelloguy's Tool</a> instead.";
  }
  else
  {
  bodyContent.innerHTML =
            "<form><table><tr><td>Username <td><input maxlength=128 name=username value='' id=username title='username'>" +
            "             <tr><td>         <td><input type=submit value='Submit'>" +
            "</table></form>";

  var form = bodyContent.getElementsByTagName("form");
  form.method = "get";
  form.action = document.location;

  document.getElementById("username").focus();
  }
}

function generate_main_report() {
  fetch_data(params.replace(/\+/g, " "),
 "", output_main_report, 0, );
}


 function add_stats_row(left_col, right_col) {
 var row = document.createElement("tr");
 var left = document.createElement("td");
 var right = document.createElement("td");
 
 document.getElementById("basic_stats").appendChild(row);
 row.appendChild(left);
 row.appendChild(right);
 //left.innerHTML = left_col;
 left.appendChild( document.createTextNode(left_col) );
 right.appendChild( document.createTextNode(right_col) );
 return row;
 }

function output_main_report(history) {
 // -- generate summary statistics
 var unique_articles = new Array();
 var namespace_numedits = new Array();
 for (var i=0; i<namespaces.length; i++) {
 namespace_numedits ] = 0;
 }
 namespace_numedits = 0;
 for (var i=0; i<history.length; i++) {
 var h = history;
 unique_articles ]++;
 namespace_numedits ]++;
 }
 var unique_articles_keys = keys(unique_articles);

 // -- output report
 var table = document.createElement("table");
 table.id = "basic_stats";
 document.getElementById("bodyContent").appendChild(table);

 add_stats_row("Username", params.replace(/\+/g, " "));
 add_stats_row("Total edits", history.length);
 add_stats_row("Distinct pages edited", unique_articles_keys.length);
 add_stats_row("Average edits/page", new Number(history.length / unique_articles_keys.length).toFixed(3));
 add_stats_row("First edit", history );

 // add a blank row
 add_stats_row("", "").childNodes.style.height = "1em";

 add_stats_row("(main)", namespace_numedits);
 for (var i=0; i<namespaces.length; i++) {
 var nmspc = namespaces;
 if (namespace_numedits) {
 add_stats_row(nmspc, namespace_numedits);
 }
 }
}



// ===================================== HTML-scraping backend =========================================

function add_loading_notice() {
 if (document.getElementById("loading_notice"))
 return;
 var loading = document.createElement("div");
 loading.id = "loading_notice";
 loading.innerHTML = "<br><br>Retrieving data<blink>...</blink>";
 document.getElementById("bodyContent").appendChild(loading);
}
function remove_loading_notice() {
 var loading = document.getElementById("loading_notice");
 if (!loading) return;
 loading.parentNode.removeChild(loading);
}

var offset_regexp = /href="+:Contributions+offset=(\d+)/gi;
function fetch_data(username, end_date, handler, offset, page_list) {
 add_loading_notice();
 var url = prefix + "Special:Contributions/" + username + "?offset=" + offset + "&limit=5000";
 loadXMLDoc(url, 
 function (request) {
 var next_offset = 0;
 if (request.readyState != 4)   return;
 if (request.status == 200) {
 page_list.push(request.responseText);
 //dump_text(request.responseText);

 // see if there's another pageful to get
 var matches = map( function(p){
 return p.match( /(\d+)$/ );
 }, request.responseText.match( offset_regexp ) );
 for (var i=0; i<matches.length; i++) {
 var v = matches * 1;
 if (v != 0 && (offset == 0 || v < offset)) {
 next_offset = v;
 break;
 }
 }
 }

 //next_offset = 0; // for testing only, retrieve just the first page of results

 if (next_offset == 0) {
 parse_data(page_list, handler);
 } else {
 // tail recurse
 fetch_data(username, end_date, handler, next_offset, page_list);
 }
 });
}


// input: a list of strings, each string containing the HTML from a single page
// output: a list, where each individual entry is a specific edit from history
function parse_data(page_list, handler) {
 //var total_len = 0;
 //for (var i=0; i<page_list.length; i++) total_len += page_list.length;
 //alert("parsing " + page_list.length + " pages comprising " + total_len + " total bytes");

 var last_history_ent = ;
 last_history_ent = "";
 last_history_ent = "";

 var edit_history = new Array();
 for (var pagecnt=0; pagecnt<page_list.length; pagecnt++) {
 var matches = page_list.match( /^<li>+\(<a href="+action=history.*/gim );
 //dump_lines(matches);
 for (var matchcnt=0; matchcnt<matches.length; matchcnt++) {
 var history_text = matches;

 var history_entry = new Array();
 history_entry = history_text.match( /^<li>(+)/i )
 .replace( / +$/, "");
 history_entry = date_parse( history_entry );
 history_entry = history_text.match( /title="(+)"/i )
 .replace( /&quot;/g, "\"")
 .replace( /&amp;/g, "&");
 var find_comment = history_text.replace(/<span class="autocomment">.*?<\/span> ?/, "");
 history_entry = ifmatch(find_comment.match( /<span class='comment'>(.*?)<\/span>/ ))
 .replace(/^\((.*)\)$/, "$1");
 history_entry = /<span class="minor"/.test(history_text);
 history_entry = ifmatch(history_text.match(/oldid=(+)/i));

 history_entry = "";
 for (var nmspc_ctr=0; nmspc_ctr<namespaces.length; nmspc_ctr++) {
 var nmspc = namespaces + ":";
 if (history_entry.substring(0, nmspc.length) == nmspc) {
 history_entry = namespaces;
 break;
 }
 }

 //dump_object(history_entry);

 if (history_entry != last_history_ent || history_entry != last_history_ent)
 edit_history.push(history_entry);
 last_history_ent = history_entry;
 }
 }

 remove_loading_notice();

 handler(edit_history);
}




// ===================================== test/debug functions =========================================

function dump_text(text) {
  //alert("dump_text, with text of size " + text.length);

  var pre = document.createElement("pre");

  var div = document.createElement("div");
  div.style.width = "60em";
  div.style.maxHeight = "40em";
  div.style.overflow = "auto";

  pre.appendChild(document.createTextNode(text));
  div.appendChild(pre);
  document.getElementById("bodyContent").appendChild(div);
}

function dump_lines(ary) {
  dump_text("--> " + ary.join("\n--> "));
}

function dump_object(obj) {
 var toString = "";
 for (var prop in obj) {
 toString += prop + ": " + obj + "\n";
 }
 dump_text(toString);
}


// ===================================== utility functions =========================================

function addOnloadFunction(f) {
  if (window.addEventListener) window.addEventListener("load",f,false);
  else if (window.attachEvent) window.attachEvent("onload",f);
  else {
    var oldOnload='_old_onload_'+addOnloadFunction.uid;
    addOnloadFunction = window.onload ? window.onload : function () {};
    window.onload = function() { addOnloadFunction();  f(); }
    ++addOnloadFunction.uid;
  }
}


function parse_params() {
  var pairs = document.location.search.substring(1).split("&");
  var ret = ;
  for (var i=0; i < pairs.length; i++) {
    var values = pairs.split("=");
    ret] = unescape(values);
  }
  return ret; 
}


function loadXMLDoc(url, handler)
{
    // branch for native XMLHttpRequest object
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest();
 req.onreadystatechange = function () {handler(req)};
        req.open("GET", url, true);
        req.send(null);
    // branch for IE/Windows ActiveX version
    } else if (window.ActiveXObject) {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req) {
            req.onreadystatechange = function () {handler(req)};
            req.open("GET", url, true);
            req.send();
        }
    }
}


// see http://search.cpan.org/dist/perl/pod/perlfunc.pod#map
function map (handler, list) {
  var ret = new Array();
  for (var i=0; i<list.length; i++) {
    ret = handler( list );
    // ret.push( handler( list ) );
  }
  return ret;
}

// see http://search.cpan.org/dist/perl/pod/perlfunc.pod#keys
function keys (obj) {
 var ret = new Array();
 for (var key in obj) {
 ret.push(key);
 }
 return ret;
}


function ifmatch(ary) {
 if (ary && ary.length >= 2) {
 return ary;
 } else {
 return "";
 }
}
<!--END EDIT COUNT CRAP-->





















<!--BEGIN CACYCLE'S EDIT TOOL-->
// include comfortable javascript editor by cacycle

// levels of undo (each level holds the whole text)
undoBufferMax = 20;

// style for preview box
stylePreviewBox = 'background-color: #f9f9f9;';

// style for custom edit buttons
styleButtons = 'font-size: smaller; padding-left: 0.1em; padding-right: 0.1em';

// presets for input field dropdown options
findHistoryLength = 10;

// preset for combo box select options
presetOptions = ;
presetOptions = [
  'Copyedit',
  'Linkfix',
  'Reverting vandalism',
  'Formatting source text'
];

// expiration time span for history cookies in seconds
cookieExpireSec = (365 * 24 * 60 * 60);

// enable cursor horizontal position memory
cursorMemory = true;

// show at least this number of lines ahead of cursor movement
scrollMargin = 1;

// show at least this number of lines ahead of cursor movement for
findMargin = 2;

// find ahead checkbox selected by default
findAheadSelected = true;

// css for change indicators
styleDelete = 'font-weight: normal; text-decoration: none; color: #ffffff; background-color: #990033;';
styleInsert = 'font-weight: normal; text-decoration: none; color: #ffffff; background-color: #009933;';
styleMoved  = 'font-weight: bold; vertical-align: text-bottom; font-size: xx-small; padding: 0; border: solid 1px;';
styleBlock  = [
        'background-color: #ffff44;',
        'background-color: #b0ff90;',
        'background-color: #ffcc99;',
        'background-color: #99ffff;',
        'background-color: #99ccff;',
        'background-color: #cc99ff;',
        'background-color: #ff99cc;',
        'background-color: #ffd040;',
        'background-color: #d0d0d0;'
];

// html for change indicators, {number} is replaced by the block number, {block} is replaced by the block style
htmlMovedRight  = '<input type="button" value=">" style="' + styleMoved + ' {block}">';
htmlMovedLeft   = '<input type="button" value="<" style="' + styleMoved + ' {block}">';

htmlBlockStart  = '<span style="{block}">';
htmlBlockEnd    = '</span>';

htmlDeleteStart = '<span style="' + styleDelete + '">';
htmlDeleteEnd   = '</span>';

htmlInsertStart = '<span style="' + styleInsert + '">';
htmlInsertEnd   = '</span>';

// minimal number of real words for a moved block (0 for always displaying block move indicators)
blockMinLength = 3;

// exclude identical sequence starts and endings from change marking
wordDiff = true;

// enable recursive diff to resolve problematic sequences
recursiveDiff = true;

// enable block move display
showBlockMoves = true;

// install ] text diff code
document.write('<script type="text/javascript" src="' 
  + 'http://en.wikipedia.org/w/index.php?title=User:Cacycle/diff.js' 
  + '&action=raw&ctype=text/javascript&dontcountme=s"></script>');

// install ] page preview tool
document.write('<script type="text/javascript" src="' 
  + 'http://en.wikipedia.org/w/index.php?title=User:Pilaf/livepreview.js' 
  + '&action=raw&ctype=text/javascript&dontcountme=s"></script>');

// install ] edit tool
document.write('<script type="text/javascript" src="' 
  + 'http://en.wikipedia.org/w/index.php?title=User:Cacycle/editor.js' 
  + '&action=raw&ctype=text/javascript&dontcountme=s"></script>');
<!--END CACYCLE'S EDIT TOOL-->






















<!--BEGIN IMAGE AUTOTAGGER-->
// ]
document.write(
        "<script type='text/javascript' "
        + "src='http://en.wikipedia.org/w/index.php?title=User:Mdd4696/Image Autotagger/script.js"
        + "&action=raw&ctype=text/javascript&dontcountme=s'></script>"
);
// ]
document.write(
        "<script type='text/javascript' "
        + "src='http://en.wikipedia.org/w/index.php?title=User:Mdd4696/Image Autotagger/lib.js"
        + "&action=raw&ctype=text/javascript&dontcountme=s'></script>"
);
<!--END IMAGE AUTOTAGGER-->






















<!--BEGIN IMAGE DELETION THING-->
/**** quick image delete ****/
document.write('<script type="text/javascript"' +
  'src="http://en.wikipedia.org/w/index.php?title=User:Howcheng/quickimgdelete.js' +
  '&action=raw&ctype=text/javascript&dontcountme=s"></script>');

/* This is to keep track of who is using this extension: ] */
<!--END IMAGE DELETION THING-->