User:CQJ/monobook.js

From Wikipedia, the free encyclopedia

If a message on your talk page led you here, please be wary of who left it. The code below could contain malicious content capable of compromising your account; if your account appears to be compromised, it will be blocked. If you are unsure whether the code is safe, you can ask at the appropriate village pump.
Note: After saving, you have to bypass your browser's cache to see the changes. In Internet Explorer and Firefox, hold down the Ctrl key and click the Refresh or Reload button. Opera users have to clear their caches through Tools→Preferences, see the instructions for Opera. Konqueror and Safari users can just click the Reload button.
//<pre><nowiki>
//---------------------------------------------------------
//|                                                       |
//|  VOA MONOBOOK IMPLEMENTATION                          |
//|  9/14/2006                                            |
//|                                                       |
//|  Hardcoded installation - please see the              |
//|  original developer's user page for details.          |
//|                                                       |
//---------------------------------------------------------
// =-=-=- HELPER FUNCTIONS -=-=-=
// -----------------------------------------------------------------------------
// XMLHttpRequest support
// -----------------------------------------------------------------------------
if (document.implementation.createDocument) 
{
  var gml_xmlparser = new DOMParser();
}
 
//<nowiki> Helper tools
document.write('<script type="text/javascript" src="' 
             + 'http://en.wikipedia.org/w/index.php?title=User:Voice_of_All/Addtabs/monobook.js' 
             + '&action=raw&ctype=text/javascript&dontcountme=s"></script>');
//</nowiki>
 
//UTC clock (purges too)
document.write('<script type="text/javascript" src="' 
             + 'http://en.wikipedia.org/w/index.php?title=User:Voice_of_All/UTCclock.js' 
             + '&action=raw&ctype=text/javascript&dontcountme=s"></script>');
//END
 
///////////////////////////////PAGE ROLLBACK///////////////////////////////
 
// -----------------------------------------------------------------------------
// POV rollback
// -----------------------------------------------------------------------------
var prollbacklink = ' <strong><span style="color:black;">[</span><span style="color:darkblue;">rollback (AGF)</span><span style="color:black;">]</span> </strong></strong>';
var cantrollback = 'Cannot revert edit; last contributor is only author of this page.';
var alreadyrolled = 'Cannot rollback last edit of [[$1]] by [[User:$2|$2]] ([[User talk:$2|Talk]]); someone else has edited or rolled back the page already. Last edit was by [[User:$3|$3]] ([[User talk:$3|Talk]]). ';
//this is not used:
var preverted = "Reverted [[WP:AGF|good faith]] edits by [[Special:Contributions/$2|$2]] per policy concerns. Please read up on [[WP:POL#Key_policies|policies and guidelines]]. Thanks!";
//
 
// -----------------------------------------------------------------------------
// Normal rollback
// -----------------------------------------------------------------------------
var qrollbacklink = '<span style="color:black;">[</span>rollback<span style="color:black;">]<span>';
var nrollbacklink = '<strong><span style="color:black;">[</span>rollback<span style="color:black;">]<span></strong>';
var cantrollback = 'Cannot revert edit; last contributor is only author of this page.';
var alreadyrolled = 'Cannot rollback last edit of [[$1]] by [[User:$2|$2]] ([[User talk:$2|Talk]]); someone else has edited or rolled back the page already. Last edit was by [[User:$3|$3]] ([[User talk:$3|Talk]]). ';
//this is not used:
var nreverted = 'JS: Reverted edits by [[Special:Contributions/$2|$2]] to last version by $1';
 
// -----------------------------------------------------------------------------
// Vandal rollback
// -----------------------------------------------------------------------------
var rollbacklink = '<strong><span style="color:black;">[</span><span style="color:red;">rollback (vandal)</span><span style="color:black;">]</strong><br></span>';
var cantrollback = 'Cannot revert edit; last contributor is only author of this page.';
var alreadyrolled = 'Cannot rollback last edit of [[$1]] by [[User:$2|$2]] ([[User talk:$2|Talk]]); someone else has edited or rolled back the page already. Last edit was by [[User:$3|$3]] ([[User talk:$3|Talk]]). ';
//this is not used:
var vreverted = 'JS: Reverted [[Wikipedia:Vandalism|vandalism]] by [[Special:Contributions/$2|$2]] to last version by $1.';
//
 
//failsafe rollback method
addOnloadHook(IEhistory_revert)
function IEhistory_revert()
{
//
var cant_rollback = '<br><strong><span style="color:red;">Page rollback error:</span> Could not find a version of this page that is not by the user you attempted to rollback from.' + '<br>' + 'Most likely, the user is the only author of the page, so you may want to have the page deleted.' + '<br>' + '<span style="color:red;">Note:</span> This revert function only looks at the last 12 page edits, so you may be able look back further and use "restore".';
var not_topuser = '<strong><span style="color:red;">Page rollback error:</span> Last editor is <span style="color:blue;">' + '<<top_user>>' + '</span>, not <span style="color:blue;">' + '<<vandal>>' + '</span>. The user may have already been reverted.</strong>';
//
var body = document.getElementById('bodyContent');
if (location.href.indexOf('&action=history&limit=12&jsaction=IEnormalrevert&user=') != -1)
  { 
  var found = 0;
  var token = location.href.split('&token=')[1];
  var user_name = document.getElementById('pt-userpage').getElementsByTagName('a')[0].innerHTML;
  var pagename = location.href.split('title=')[1].split('&action=history')[0];
  var vandal = unescape(location.href.split('&jsaction=IEnormalrevert&user=')[1].split('&token=')[0]);
//confirm token
  if (token != hex_md5(pagename + vandal + user_name))
  {body.innerHTML = '<strong><span style="color:red;">Page rollback error:</span> Invalid token!</strong>'; return;}
//get top user
  var l = document.getElementById('pagehistory').getElementsByTagName('li');
  if (l[0].innerHTML.indexOf('(cur) (last) ') ==0)
    {var top_user = l[0].getElementsByTagName('a')[1].innerHTML;}
  else
    {var top_user = l[0].getElementsByTagName('a')[2].innerHTML;}
  if (top_user != vandal)
    {body.innerHTML = not_topuser; return;}
  for (i = 1; i < l.length; i++)
      {
     if (!l[i].getElementsByTagName('a')[3])
         {body.innerHTML = '<strong><span style="color:red;">Page rollback error:</span> Format cannot be parsed!</strong>'; return;}
//get user and ID names
     if (l[i].innerHTML.indexOf('(cur) (last) ') !=-1)
         {test_user = l[i].getElementsByTagName('a')[1].innerHTML; var pagehref = l[i].getElementsByTagName('a')[0].href;}
     else if (l[i].innerHTML.indexOf(') (last) <') !=-1)
         {test_user = l[i].getElementsByTagName('a')[2].innerHTML; var pagehref = l[i].getElementsByTagName('a')[1].href;}
     else
         {test_user = l[i].getElementsByTagName('a')[3].innerHTML; var pagehref = l[i].getElementsByTagName('a')[2].href;}
//
     if (test_user != vandal)
         {
     var good_user = test_user;
     var URL = pagehref + "&action=edit&jsaction=autorevertnorm&byuser=" + escape(user_name) + "&oldrvtouser=" + escape(good_user) + "&revertfromuser=" + escape(vandal);
     body.innerHTML = '<strong>Page rollback status:<span style="color:blue;"> Getting article history ... </span>done</strong>';
     location.href = URL;
     found = 1;
     break;
         }
      }
   if (found == 0)
  {body.innerHTML = cant_rollback.replace('<<top_user>>',top_user).replace('<<vandal>>',vandal); return;}
   }
else if (location.href.indexOf('&action=history&limit=12&jsaction=IErollback&vandal=') != -1)
  { 
  var found = 0;
  var token = location.href.split('&token=')[1];
  var user_name = document.getElementById('pt-userpage').getElementsByTagName('a')[0].innerHTML;
  var pagename = location.href.split('title=')[1].split('&action=history')[0];
  var vandal = unescape(location.href.split('&jsaction=IErollback&vandal=')[1].split('&token=')[0]);
//confirm token
  if (token != hex_md5(pagename + vandal + user_name))
  {body.innerHTML = '<strong><span style="color:red;">Page rollback error:</span> Invalid token!</strong>'; return;}
//get top user
  var l = document.getElementById('pagehistory').getElementsByTagName('li');
  if (l[0].innerHTML.indexOf('(cur) (last) ') ==0)
    {var top_user = l[0].getElementsByTagName('a')[1].innerHTML;}
  else
    {var top_user = l[0].getElementsByTagName('a')[2].innerHTML;}
  if (top_user != vandal)
    {body.innerHTML = not_topuser; return;}
  for (i = 1; i < l.length; i++)
      {
     if (!l[i].getElementsByTagName('a')[3])
         {body.innerHTML = '<strong><span style="color:red;">Page rollback error:</span> Format cannot be parsed!</strong>'; return;}
//get user and ID names
     if (l[i].innerHTML.indexOf('(cur) (last) ') !=-1)
         {test_user = l[i].getElementsByTagName('a')[1].innerHTML; var pagehref = l[i].getElementsByTagName('a')[0].href;}
     else if (l[i].innerHTML.indexOf(') (last) <') !=-1)
         {test_user = l[i].getElementsByTagName('a')[2].innerHTML; var pagehref = l[i].getElementsByTagName('a')[1].href;}
     else
         {test_user = l[i].getElementsByTagName('a')[3].innerHTML; var pagehref = l[i].getElementsByTagName('a')[2].href;}
//
     if (test_user != vandal)
         {
     var good_user = test_user;
     var URL = pagehref + "&action=edit&jsaction=autorevertvandal&byuser=" + escape(user_name) + "&oldrvtouser=" + escape(good_user) + "&revertfromuser=" + escape(vandal);
     body.innerHTML = '<strong>Page rollback status:<span style="color:blue;"> Getting article history ... </span>done</strong>';
     location.href = URL;
     found = 1;
     break;
         }
      }
   if (found == 0)
  {body.innerHTML = cant_rollback.replace('<<top_user>>',top_user).replace('<<vandal>>',vandal); return;}
   }
else if (location.href.indexOf('&action=history&limit=12&jsaction=IEnicerevert&user=') != -1)
  { 
  var found = 0;
  var token = location.href.split('&token=')[1];
  var user_name = document.getElementById('pt-userpage').getElementsByTagName('a')[0].innerHTML;
  var pagename = location.href.split('title=')[1].split('&action=history')[0];
  var vandal = unescape(location.href.split('&jsaction=IEnicerevert&user=')[1].split('&token=')[0]);
//confirm token
  if (token != hex_md5(pagename + vandal + user_name))
  {body.innerHTML = '<strong><span style="color:red;">Page rollback error:</span> Invalid token!</strong>'; return;}
//get top user
  var l = document.getElementById('pagehistory').getElementsByTagName('li');
  if (l[0].innerHTML.indexOf('(cur) (last) ') ==0)
    {var top_user = l[0].getElementsByTagName('a')[1].innerHTML;}
  else
    {var top_user = l[0].getElementsByTagName('a')[2].innerHTML;}
  if (top_user != vandal)
     {body.innerHTML = not_topuser; return;}
  for (i = 1; i < l.length; i++)
      {
     if (!l[i].getElementsByTagName('a')[3])
         {body.innerHTML = '<strong><span style="color:red;">Page rollback error:</span> Format cannot be parsed!</strong>'; return;}
//get user and ID names
     if (l[i].innerHTML.indexOf('(cur) (last) ') !=-1)
         {test_user = l[i].getElementsByTagName('a')[1].innerHTML; var pagehref = l[i].getElementsByTagName('a')[0].href;}
     else if (l[i].innerHTML.indexOf(') (last) <') !=-1)
         {test_user = l[i].getElementsByTagName('a')[2].innerHTML; var pagehref = l[i].getElementsByTagName('a')[1].href;}
     else
         {test_user = l[i].getElementsByTagName('a')[3].innerHTML; var pagehref = l[i].getElementsByTagName('a')[2].href;}
//
     if (test_user != vandal)
         {
     var good_user = test_user;
     var URL = pagehref + "&action=edit&jsaction=autorevertnice&byuser=" + escape(user_name) + "&oldrvtouser=" + escape(good_user) + "&revertfromuser=" + escape(vandal);
     body.innerHTML = '<strong>Page rollback status:<span style="color:blue;"> Getting article history ... </span>done</strong>';
     location.href = URL;
     found = 1;
     break;
         }
      }
   if (found == 0)
  {body.innerHTML = cant_rollback.replace('<<top_user>>',top_user).replace('<<vandal>>',vandal); return;}
   }
}
///////////////////////////////
 
// -----------------------------------------------------------------------------
// 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[len >> 5] |= 0x80 << ((len) % 32);
  x[(((len + 64) >>> 9) << 4) + 14] = 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[i+ 0], 7 , -680876936); d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819); b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426); c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416); d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); c = md5_ff(c, d, a, b, x[i+10], 17, -42063); b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682); d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);
 
    a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); c = md5_gg(c, d, a, b, x[i+11], 14,  643717713); b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083); c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438); d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501); a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473); b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
 
    a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562); b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353); c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632); b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640); a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174); d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222); c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979); b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189); a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); c = md5_hh(c, d, a, b, x[i+15], 16,  530742520); b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
 
    a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415); c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571); d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606); c = md5_ii(c, d, a, b, x[i+10], 15, -1051523); b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799); a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359); d = md5_ii(d, a, b, c, x[i+15], 10, -30611744); c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380); b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649); a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259); b = md5_ii(b, c, d, a, x[i+ 9], 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[i>>5] |= (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>>2] >> ((i%4)*8+4)) & 0xF) +
           hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);
  }
  return str;
}
 
// -----------------------------------------------------------------------------
// Add revert buttons to the page
// -----------------------------------------------------------------------------
addOnloadHook(AddRevertButtonsnorm)
function AddRevertButtonsnorm()
{
  var l, article = '', vandal;
 // Add 'revert' links to a diff page [[Category:VoA scripted admins]]
  var user_name = document.getElementById('pt-userpage').getElementsByTagName('a')[0].innerHTML;
  l = document.getElementById('bodyContent').getElementsByTagName('td');
  for (i = 0; i < l.length; i++) 
  {
    if (l[i].className == 'diff-otitle') 
     {
      if (!l[i].getElementsByTagName('a')[0]){return;}
      article = l[i].getElementsByTagName('a')[0].href;
      pagename = article.split('title=')[1];
     } 
    else if (l[i].className == 'diff-ntitle')
     {
      var toplink = l[i].getElementsByTagName('a')[0].href;
      vandal = l[i].getElementsByTagName('a')[2].innerHTML;
      var t = l[i].innerHTML;
      n = t.indexOf('</a>) <br') + t.indexOf('</A>) <BR') + 1; // XXX: WOW HACK!!!!
      if (article != '' && toplink.indexOf('oldid=') == -1)
       {
        l[i].innerHTML = ' <strong><a href="' + article + '&action=history&limit=12&jsaction=IEnicerevert&user=' + escape(vandal) + '&token=' + hex_md5(pagename + vandal + user_name) + '">' + prollbacklink + '</strong></a> || <strong><a href="' + article + '&action=history&limit=12&jsaction=IErollback&vandal=' + escape(vandal) + '&token=' + hex_md5(pagename + vandal + user_name) + '">' + rollbacklink + '</a></strong> ' + t.substring(0,n + 5) + ' &nbsp;&nbsp;&nbsp;<strong><a href="' + article + '&action=history&limit=12&jsaction=IEnormalrevert&user=' + escape(vandal) + '&token=' + hex_md5(pagename + vandal + user_name) + '">' + nrollbacklink + '</strong></a>' + t.substring(n + 5,t.length);
       }
    }
  }
  // Add 'revert' links to a contributions page
  if (document.title.indexOf('User contributions') == 0) 
  {
    var c = document.getElementById('contentSub');
    var a = c.getElementsByTagName('a');
    vandal = a[0].innerHTML;
    //bug fix
    if (vandal == 'Talk')
      {vandal = document.getElementById('contentSub').innerHTML.split(' (<a')[0].split(' (<A')[0].split('For ')[1];}
    l = document.getElementById('bodyContent').getElementsByTagName('li');
    for (i = 0; i < l.length; i++) 
     {
      var t = l[i].innerHTML;
      // If we are already a sysop on this wiki, abort
      if (t.indexOf('action=rollback') != -1)
          break;
        if (t.indexOf(')</strong>') != -1)
        {
        article = l[i].getElementsByTagName('a')[0].href.split('&action=history')[0];
        pagename = article.split('title=')[1];
        l[i].innerHTML += ' <a href="' + article + '&action=history&limit=12&jsaction=IEnormalrevert&user=' + escape(vandal) + '&token=' + hex_md5(pagename + vandal + user_name) + '">' + qrollbacklink + '</a>';
        }
     }
  }
}
////////////////////////
 
// ============= test-n.js ==============
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 IPnote = '';
  if (document.title.split(' - ')[0].split('.').length == 4)
  {IPnote = "''If this is an [[IP address]], and it is shared by multiple users, ignore this warning if you did not make any [[Wikipedia:vandalism|unconstructive]] edits.'' ";}
  var varticle = '';
  if (location.href.indexOf('&vanarticle=') != -1)
  {varticle = ' to [[' + unescape(location.href.split('&vanarticle=')[1]) + ']]';}
  var f = document.editform, t = f.wpTextbox1;
  if (t.value.length > 0)
    t.value += '\n';
  t.value +="====" + "Regarding edits made during [[{{subst:CURRENTMONTHNAME}} {{subst:CURRENTDAY}}]] [[{{subst:CURRENTYEAR}}]] ([[UTC]])" + varticle + "====" + "\n" + "{{subst:" + "test" + number + "}} " + IPnote + "~" + "~" + "~" + "~";
  f.wpSummary.value = "User notice:" + " test" + number;
}
 
function warningn()
{
  var IPnote = '';
  if (document.title.split(' - ')[0].split('.').length == 4)
  {IPnote = "''If this is an [[IP address]], and it is shared by multiple users, ignore this warning if you did not make any [[Wikipedia:vandalism|unconstructive]] edits.'' ";}
  var varticle = '';
  if (location.href.indexOf('&vanarticle=') != -1)
  {varticle = ' to [[' + unescape(location.href.split('&vanarticle=')[1]) + ']]';}
  var f = document.editform, t = f.wpTextbox1;
  if (t.value.length > 0)
    t.value += '\n';
  t.value +="====" + "Regarding edits made during [[{{subst:CURRENTMONTHNAME}} {{subst:CURRENTDAY}}]] [[{{subst:CURRENTYEAR}}]] ([[UTC]])" + varticle + "====" + "\n" + "{{subst:" + "bv" + "}} " + IPnote + "~" + "~" + "~" + "~";
  f.wpSummary.value = "User notice:" + " bv";
}
 
function testbl(number)
{
  var IPnote = '';
  if (document.title.split(' - ')[0].split('.').length == 4)
  {IPnote = "''If this is an [[IP address]], and it is shared by multiple users, ignore this warning if you did not make any [[Wikipedia:vandalism|unconstructive]] edits.'' ";}
  var varticle = '';
  if (location.href.indexOf('&vanarticle=') != -1)
  {varticle = ' to [[' + unescape(location.href.split('&vanarticle=')[1]) + ']]';}
  var f = document.editform, t = f.wpTextbox1;
  if (t.value.length > 0)
    t.value += '\n';
  t.value +="====" + "Regarding edits made during [[{{subst:CURRENTMONTHNAME}} {{subst:CURRENTDAY}}]] [[{{subst:CURRENTYEAR}}]] ([[UTC]])" + varticle + "====" + "\n" + "{{subst:" + "Blank" + number + "}} " + IPnote + "~" + "~" + "~" + "~";
  f.wpSummary.value = "User notice:" + " Blank" + number;
}
 
function spam()
{
  var IPnote = '';
  if (document.title.split(' - ')[0].split('.').length == 4)
  {IPnote = "''If this is an [[IP address]], and it is shared by multiple users, ignore this warning if you did not make any [[Wikipedia:vandalism|unconstructive]] edits.'' ";}
  var varticle = '';
  if (location.href.indexOf('&vanarticle=') != -1)
  {varticle = ' to [[' + unescape(location.href.split('&vanarticle=')[1]) + ']]';}
  var f = document.editform, t = f.wpTextbox1;
  if (t.value.length > 0)
    t.value += '\n';
  t.value +="====" + "Regarding edits made during [[{{subst:CURRENTMONTHNAME}} {{subst:CURRENTDAY}}]] [[{{subst:CURRENTYEAR}}]] ([[UTC]])" + varticle + "====" + "\n" + "{{subst:" + "spam}} " + IPnote + "~" + "~" + "~" + "~";
  f.wpSummary.value = "User notice:" + " spam";
}
 
function spamn(number)
{
  var IPnote = '';
  if (document.title.split(' - ')[0].split('.').length == 4)
  {IPnote = "''If this is an [[IP address]], and it is shared by multiple users, ignore this warning if you did not make any [[Wikipedia:vandalism|unconstructive]] edits.'' ";}
  var varticle = '';
  if (location.href.indexOf('&vanarticle=') != -1)
  {varticle = ' to [[' + unescape(location.href.split('&vanarticle=')[1]) + ']]';}
  var f = document.editform, t = f.wpTextbox1;
  if (t.value.length > 0)
    t.value += '\n';
  t.value +="====" + "Regarding edits made during [[{{subst:CURRENTMONTHNAME}} {{subst:CURRENTDAY}}]] [[{{subst:CURRENTYEAR}}]] ([[UTC]])" + varticle + "====" + "\n" + "{{subst:" + "spam" + number + "}} " + IPnote + "~" + "~" + "~" + "~";
  f.wpSummary.value = "User notice:" + " spam" + number;
}
 
//************
//LAST DIFF TAB
function lastdiff() 
    {
    if (document.title.indexOf("Editing ") != -1)
    {return;}
    z=document.getElementById("content").childNodes;
    for (var n=0;n<z.length;n++) { 
      if (z[n].className=="firstHeading") 
      {
  var pname = URLEncoding(z[n].innerHTML);
      }
    }
    var l=addTab("http://en.wikipedia.org/w/index.php?title=" + pname + "&diff=cur&oldid=prev", 'last', '');
    l.lastChild.title="Show most recent diff";
}
 
//Quick warning tabs
addOnloadHook(add_testn_tabs);
function add_testn_tabs() 
{ 
var c1 = document.getElementById('column-one'); 
var tabs = c1.getElementsByTagName('div')[0].getElementsByTagName('ul')[0];
if(document.getElementById('ca-history'))
{lastdiff();}
if (document.title.indexOf("Editing User talk:") != -1)
    {
      tabs.appendChild(tnaddlilink('javascript:testn(1)',"t"));
      tabs.appendChild(tnaddlilink('javascript:testn(2)',"t2"));
      tabs.appendChild(tnaddlilink('javascript:testn(3)',"v"));
      tabs.appendChild(tnaddlilink('javascript:warningn()',"w"));
      tabs.appendChild(tnaddlilink('javascript:testbl(2)',"b"));
      tabs.appendChild(tnaddlilink('javascript:testbl(3)',"b2"));
      tabs.appendChild(tnaddlilink('javascript:spam()',"s"));
      tabs.appendChild(tnaddlilink('javascript:spamn(2)',"s2"));
      if(document.getElementById('ca-delete'))
      {
        document.getElementById('ca-delete').firstChild.innerHTML = '[d]';
      }  
      if(document.getElementById('ca-move'))
      {
      document.getElementById('ca-move').firstChild.innerHTML = '[m]';
      }  
      if(document.getElementById('ca-watch'))
      {
      document.getElementById('ca-watch').firstChild.innerHTML = '[w]';
       }  
      if(document.getElementById('ca-unwatch'))
      {
      document.getElementById('ca-unwatch').firstChild.innerHTML = '[uw]';
      }
      if(document.getElementById('ca-edit'))
      {
        document.getElementById('ca-edit').firstChild.innerHTML = 'Edit';
      }
      if(document.getElementById('ca-talk'))
      {
        document.getElementById('ca-talk').firstChild.innerHTML = 'Talk';
      }
      if(document.getElementById('ca-protect'))
      {
        document.getElementById('ca-protect').firstChild.innerHTML = 'P (off)';
      }
      if(document.getElementById('ca-unprotect'))
      {
        document.getElementById('ca-unprotect').firstChild.innerHTML = 'P (on)';
      }
    }
}
 
//---------------------------------------------------------
//|                                                       |
//|  LUPIN'S POPUPSDEV SCRIPT                             |
//|  9/14/2006                                            |
//|  popupStructure = original                            |
//|  popupMaxWidth= 500                                   |
//|  popupSubpopups = true                                |
//|                                                       |
//|  Using a template installation - please see the       |
//|  original developer's user page for details.          |
//|                                                       |
//---------------------------------------------------------
 
 
// [[User:Lupin/popupsdev.js]] - please include this line 
//document.write('<script type="text/javascript" src="' 
//             + 'http://en.wikipedia.org/w/index.php?title=User:Lupin/popupsdev.js' 
//             + '&action=raw&ctype=text/javascript&dontcountme=s"></script>');
//popupStructure='original';
//popupMaxWidth='500';
//popupSubpopups=true;
//END
 
//---------------------------------------------------------
//|                                                       |
//|  LUPIN'S RC PATROL SCRIPT                             |
//|  9/14/2006                                            |
//|                                                       |
//|  Using a hardcode installation - please see the       |
//|  original developer's user page for details.          |
//|                                                       |
//---------------------------------------------------------
 
//re adding the recent script.
 
//Straight hard-code of the lupin recent2 script
 
recent2={
  // Edit these to your liking.
  // Make sure there's a comma at the end of each line.
  badwordsUrl:          'User:Lupin/badwords',
  filterPage:           'User:Lupin/Filter_recent_changes',
  allRecentPage:        'User:Lupin/All_recent_changes',
  recentIPPage:         'User:Lupin/Recent_IP_edits',
  monitorWatchlistPage: 'User:Lupin/Monitor_my_watchlist',
  spelldictUrl:         'Wikipedia:Lists_of_common_misspellings/For_machines',
  spelldictPage:        'User:Lupin/Live_spellcheck',
 
  // leave this alone
  dummy: null
};
 
recent2.download=function(bundle) {
  // mandatory: bundle.url
  // optional:  bundle.onSuccess (xmlhttprequest, bundle)
  // optional:  bundle.onFailure (xmlhttprequest, bundle)
  // optional:  bundle.otherStuff OK too, passed to onSuccess and onFailure
 
  var x = window.XMLHttpRequest ? new XMLHttpRequest()
	: window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP")
	: false;
 
  if (x) {
    x.onreadystatechange=function() {
      x.readyState==4 && recent2.downloadComplete(x,bundle);
    };
    x.open("GET",bundle.url,true);
    x.send(null);
  }
  return x;
}
 
recent2.downloadComplete=function(x,bundle) {
  x.status==200 && ( bundle.onSuccess && bundle.onSuccess(x,bundle) || true )
  || ( bundle.onFailure && bundle.onFailure(x,bundle) || alert(x.statusText));
}
 
window.gettingBadWords=false;
window.badWords=null;
 
recent2.getBadWords=function() {
  window.gettingBadWords=true;
  recent2.download({ url: 'http://' + document.location.hostname +
	'/w/index.php?title=' + recent2.badwordsUrl + '&action=raw&ctype=text/css',
	onSuccess: recent2.processBadWords, onFailure: function () { setTimeout(recent2.getBadWords, 15000); return true;}});
}
 
recent2.processBadWords=function(d) {
  var data=d.responseText.split('\n');
  var ret=[];
  for (var i=0; i<data.length; ++i) {
    var s=data[i];
    if (s.length==0) continue;
    if (RegExp('^/.*/\\s*$').test(s)) {
      s=s.replace(RegExp('^/'), '').replace(RegExp('/\\s*$'), '');
      s=s.replace(RegExp('[(]([^?])', 'g'), '(?:$1');
      try { var r=new RegExp(s); }
      catch (err) {
	var errDiv=newOutputDiv('recent2_error', recent2.outputPosition);
	errDiv.innerHTML='Warning: ignoring odd-looking regexp on line '+i
	  +' of <a href="/wiki/' + recent2.badwordsUrl + '">badwords</a>:<pre>' + s + '</pre>';
	continue;
      }
      ret.push(s);
      continue;
    }
    if (s.charAt(0)=='<') continue;
    ret.push(s.replace(RegExp('([-|.()\\+:!,?*^${}\\[\\]])', 'g'), '\\$1'));
  }
  //                                                     123                       3       2|       4                     415           5
  //                                                     (((    repeatedchar       )       )|       ( ...  | ... | ...    ))( bdy       )
  window.badWords=RegExp("<td>[+]</td>\\s*<td .*?>\\s*.*?((([^-{}.\\s'=wI:*#0-9A-F])\\3{2,})|[^/]\\b(" + ret.join('|') + "))(\\b[^/]|[|]).*\\s*</td>", 'im');
}
 
window.gettingWatchlist=false;
recent2.watchlist=null;
recent2.getWatchlist=function() {
  window.gettingWatchlist=true;
  recent2.download({url: 'http://' + document.location.hostname + '/wiki/Special:Watchlist/edit',
	      onSuccess: recent2.processWatchlist, onFailure: function () { setTimeout(getWatchlist, 15000); return true; }});
}
recent2.processWatchlist=function(req, bundle) {
  var watchlist={};
  var lines=req.responseText.split('\n');
  for (var i=0; i<lines.length; ++i) {
    if (lines[i].indexOf('<li><input type="checkbox" name="id[]" value=') > -1) {
      var article=lines[i].replace(/.*title="(.*?)">.*/, '$1');
      watchlist[article]=true;
    }
  }
  window.watchlist=watchlist;
}
 
window.gettingSpelldict=false;
window.spelldict=null;
recent2.getSpelldict=function() {
  window.gettingSpelldict=true;
  recent2.download({url: 'http://' + document.location.hostname + '/w/index.php?title=' + recent2.spelldictUrl + '&action=raw&ctype=text/css',
	      onSuccess: recent2.processSpelldict, onFailure: function () { setTimeout(getSpelldict, 15000); return true; }});
}
recent2.processSpelldict=function(req, bundle) {
  var spelldict={};
  var lines=req.responseText.split('\n');
  var a=[];
  for (var i=0; i<lines.length; ++i) {
    var split=lines[i].split('->');
    if (split.length<2) { continue; }
    split[1]=split.slice(1).join('->').split(/, */);
    split[0]=split[0].toLowerCase().replace(/^\s*/, '');
    spelldict[split[0]]=split[1];
    a.push(split[0]);
  }
  window.spelldict=spelldict;
  window.spellRe=RegExp('<td>[+]</td>\\s*<td .*?>\\s*.*?\\b(' + a.join('|') + ')\\b', 'i');
}
 
 
 
var feed='http://' + document.location.hostname + '/w/index.php?title=Special:Recentchanges&feed=rss';
 
window.newOutputDiv=function(klass, position, immortal) {
  var h1=document.getElementsByTagName('h1')[0];
  var ret=document.createElement('div');
  if (klass) { ret.className=klass; }
  if (!position) { position='bottom'; }
  switch(position) {
  case 'top':
    h1.parentNode.insertBefore(ret, h1.nextSibling);
    break;
  case 'bottom':
    h1.parentNode.appendChild(ret);
    break;
  default:
    if (!newOutputDiv.alerted) {
      alert('Unknown position '+position+' in recent2.js, newOutputDiv');
      window.newOutputDiv.alerted=true;
    }
    return newOutputDiv(klass, 'bottom');
  }
  if (!immortal) { ret.id=newOutputDiv.uid++; }
  window.outputDivs.push(ret);
  return ret;
}
window.newOutputDiv.alerted=false;
window.newOutputDiv.uid=0;
window.outputDivs=[];
 
window.grabRecentChanges=function(feed) {
  if (! window.badWords && recent2.filter_badwords ) {
    if ( ! window.gettingBadWords ) { recent2.getBadWords(); }
    return setTimeout(function(){grabRecentChanges(feed);}, 500);
  }
  if (! window.watchlist && recent2.filter_watchlist) {
    if (! window.gettingWatchlist ) recent2.getWatchlist();
    return setTimeout(function(){grabRecentChanges(feed);}, 500);
  }
  if (! window.spelldict && recent2.filter_spelling) {
    if (! window.gettingSpelldict) recent2.getSpelldict();
    return setTimeout(function(){grabRecentChanges(feed);}, 500);
  }
  var pos=recent2.outputPosition;
  if (recent2.outputPosition=='top') {
    var output=newOutputDiv('recent2.lines', pos);
    var status=newOutputDiv('recent2.status', pos);
  } else {
    var status=newOutputDiv('recent2.status', pos);
    var output=newOutputDiv('recent2.lines', pos);
  }
  status.style.borderStyle='solid';
  status.style.borderColor='orange';
  status.innerHTML=greyFont+'(' + recent2.count + ') updating...</font>';
 
  // this abort stuff doesn't work properly for some reason...
  //recent2.lastFeedDownload && recent2.lastFeedDownload.abort(); // } catch (summatNasty) { /* do nothing */ }
  recent2.lastFeedDownload=recent2.download(
    {url: feed, onSuccess: processRecentChanges, output: output, status: status, onFailure: feedFailed});
}
 
var greyFont='<font color="#777">';
 
window.feedFailed=function(x,bundle) {
  try { bundle.status.innerHTML+=greyFont+'failed: '+x.statusText + '</font>'; }
  catch (err) { bundle.status.innerHTML+=greyFont+'failed badly: '+err+'</font>'; }
  return true;
}
 
recent2.newWindows=true;
 
window.linkmaker=function(url, text) {
  var s='<a href="' + url + '"';
  recent2.newWindows && (s += ' target="_blank"');
  s += '>' + text + '</a>';
  return s;
}
 
 
recent2.ipUserRegex=RegExp('(User:)?((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])');
recent2.outputSeparator='<hr>';
 
recent2.delayedLines={};
recent2.delay=0;
recent2.namespaces={'Media':1, "Special":1, "User":1, "User talk":1, "Wikipedia":1,
		    "Wikipedia talk":1, "Image":1, "Image talk":1, "MediaWiki":1,
		    "MediaWiki talk":1, "Template":1, "Template talk":1, "Help":1,
		    "Help talk":1, "Category":1, "Category talk":1, "Portal":1, "Portal talk":1};
window.processRecentChanges=function(req, bundle){
  var initialId=processRecentChanges.id;
  var doc=req.responseXML.documentElement;
  var items=doc.getElementsByTagName('item');
  var latest=processRecentChanges.lastDate;
  for (var i=items.length - 1; i>=0; --i) {
    var timestamp = Date.parse(getFirstTagContent(items[i],'pubDate'));
    if (timestamp <= processRecentChanges.lastDate) continue;
    latest = (timestamp > latest) ? timestamp : latest;
    var diffText=getFirstTagContent(items[i],'description').split('</tr>').join('</tr>\n');
    var editSummary=diffText.replace(RegExp('^<p>(.*?)</p>[\\s\\S]*'), '$1');
    var editor=getFirstTagContent(items[i], 'creator') || getFirstTagContent(items[i], 'dc:creator');
 
    var article=getFirstTagContent(items[i], 'link');
    if (recent2.delayedLines[article] && recent2.delayedLines[article].editor != editor) {
      delete recent2.delayedLines[article];
    }
 
    if (recent2.filter_anonsOnly && !recent2.ipUserRegex.test(editor)) continue;
 
    var articleTitle=getFirstTagContent(items[i], 'title');
    if (recent2.hideNonArticles) {
      var namespace=articleTitle.replace(/:.*/, '');
      if (recent2.namespaces[namespace]) continue;
    }
    if (! recent2.show_talkpages && articleTitle && /^Talk:|^[^:]*?[_ ]talk:/.test(articleTitle)) continue;
    if (recent2.filter_watchlist && articleTitle &&
	! window.watchlist[articleTitle.replace(/^Talk:/, '').replace(/[ _]talk:/, ':')]) continue;
    if (recent2.filter_badwords) {
      var badMatch=null;
      if (window.vandals[editor] > 0) { badMatch=['', '', '[previously rolled back this editor]']; }
      else { badMatch=badWords.test(diffText); }// .test() is meant to be faster than a full match
      if (badMatch) {
	if (badMatch===true) { badMatch=diffText.match(badWords); }
	articleTitle=getFirstTagContent(items[i], 'title');
	var badWord=badMatch[2] || badMatch[4];
	if (articleTitle.toLowerCase().indexOf(badWord.toLowerCase())>-1) { continue; } // avoid "Oral sex matched Oral sex"
	// highlighting
	badMatch[0]=badMatch[0].split(badWord).join('<span style="background-color: #FF6">'+badWord+'</span>');
	recent2.delayedLines[article]={timestamp: timestamp, article:article, count:recent2.count, articleTitle:articleTitle,
				       editor:editor, badWord:badWord, badDiffFragment:badMatch[0], diff:diffText,
				       summary:editSummary};
      }
    } else if (recent2.filter_spelling) {
      var splMatch=spellRe.test(diffText);
      if (splMatch) {
	splMatch = diffText.match(spellRe);
	var misspelling = splMatch[1]; //.replace(/^\s*/, '');
	var badWord = '<a href=\'javascript:recent2.correctSpelling("' + articleTitle.split("'").join("%27") +
	  '","'+misspelling.split("'").join("%27")+'")\'>'+ misspelling + '</a>';
	diffText = diffText.replace(RegExp('('+misspelling+')', 'gi'), '<span style="background-color: #FF6">$1</span>');
	recent2.delayedLines[article] = {timestamp: timestamp, article:article, count:recent2.count, articleTitle:articleTitle,
					 editor:editor, badWord:badWord, badDiffFragment:'', diff:diffText, summary: editSummary};
      }
    } else {
      var article=getFirstTagContent(items[i], 'link');
      var articleTitle=getFirstTagContent(items[i], 'title');
      if (recent2.CustomFilter &&
	  ! recent2.CustomFilter({timestamp:timestamp, article:article, articleTitle:articleTitle,
		editor:editor, diff:diffText, summary:editSummary})) continue;
      recent2.delayedLines[article]={timestamp: timestamp, article:article, count:recent2.count, articleTitle:articleTitle,
				     editor:editor, diff:diffText, summary:editSummary};
    }
  } /* end for loop */
  var output=recent2.getDelayedLineOutput();
  var outputString='';
  if (recent2.outputPosition=='top') {
    outputString=output.join(recent2.outputSeparator);
  }
  else {
    for (var i=output.length-1; i>=0; --i) {
      outputString+=output[i] + (i>0 ? recent2.outputSeparator : '') ;
    }
  }
  bundle.output.innerHTML+=outputString;
  setTimeout(function() {recent2.doPopups(bundle.output)}, 300);
  processRecentChanges.lastDate=latest; // - 1; // overlap better than missing some out, i think; FIXME do this properly
  var statusTail=greyFont+'done up to ' + formatTime(latest) + '</font>';
  if (processRecentChanges.id > initialId) {
    statusTail+=' <a href="javascript:showHideDetailRange(' + initialId + ',' + processRecentChanges.id  + ')">toggle these details</a> |';
    if (recent2.autoexpand) {
      setTimeout( function() {
	  /* document.title=initialId+' '+processRecentChanges.id; */
	  showHideDetailRange(initialId, processRecentChanges.id); }, 250 );
    }
  }
  statusTail += ' <a href="javascript:deleteEarlierOutputDivs(' + bundle.status.id + ')">remove earlier output</a>';
  statusTail+='<br>';
  bundle.status.innerHTML+=statusTail;
}
processRecentChanges.lastDate=0;
processRecentChanges.id=0;
 
recent2.getDelayedLineOutput=function() {
  var ret=[];
  var id=processRecentChanges.id;
  for (var a in recent2.delayedLines) {
    if (recent2.delayedLines[a] && typeof recent2.delayedLines[a].count == typeof 1 &&
	recent2.count - recent2.delayedLines[a].count >= recent2.delay) {
      recent2.delayedLines[a].id=id++;
      ret.push(recent2.doLine(recent2.delayedLines[a]));
      delete recent2.delayedLines[a];
    }
  }
  processRecentChanges.id=id;
  return ret;
}
 
window.deleteEarlierOutputDivs=function(cur) {
  for(var i=0; i<outputDivs.length; ++i) {
    if (!outputDivs[i] || !outputDivs[i].id) continue;
    if (outputDivs[i].id >= 0 && outputDivs[i].id < cur) {
      // FIXME BUG: if we go from the bottom up, then we'll delete one too many or too few, or something :-)
      outputDivs[i].parentNode.removeChild(outputDivs[i]);
      outputDivs[i]=null;
    }
  }
  // scroll to the top if we're appending output to the bottom, to keep the div we've clicked visible after the deletions
  if (recent2.outputPosition!='top') document.location='#';
}
 
window.showHideDetailRange=function(start,end) {
  // use the first div to see if we should show or hide
  var div=document.getElementById('diff_div_' + start);
  if (!div) {alert('no such div: diff_div_' + start); return; }
  var state=false; // hide
  if (div.style.display=='none') state=true; // show
  for (var i=start; i<end; ++i) {
    showHideDetail(i, true, state);
  }
}
 
window.toggleSysopEdits=function() {
  var divs=document.getElementsByTagName('div');
  for (var i=0; i<divs.length; ++i) {
    if (divs[i].className=='sysop_edit_line') divs[i].style.display= ( toggleSysopEdits.hidden ? 'none' : 'inline' );
  }
  toggleSysopEdits.hidden = ! toggleSysopEdits.hidden;
}
 
window.bundles={};
 
window.vandalColour = function(vandal) {
  var num=window.vandals[vandal];
  if (!num) return '';
  switch (num) {
  case 1: return '#DDFFDD';
  case 2: return '#BBFFBB';
  }
  var i= 9-(num - 3) *2;
  if (i < 0) i=0;
  return '#' + i + i + 'FF' + i + i;
}
 
window.clickDetails=function(action, max) {
  if(!action) action='show';
  if (!max) max = document.links.length;
  var count=0;
  for (var i=0; i<document.links.length && count < max; ++i) {
    if(document.links[i].innerHTML==action + ' details' && document.links[i].href.indexOf('javascript:') == 0) {
      ++count;
      eval(document.links[i].href.replace('javascript:', ''));
    }
  }
}
 
 
recent2.pendingLines=[];
 
recent2.togglePausedOutput=function() {
  if (!recent2.pausedOutput) { recent2.pausedOutput = true; return true; }
  else recent2.pausedOutput=false;
  var outputBuffer='';
  while (recent2.pendingLines.length) {
    outputBuffer+=recent2.doLine(recent2.pendingLines.pop());
  }
  var pos=recent2.outputPosition;
  var output=newOutputDiv('recent2.lines', pos);
  output.innerHTML=outputBuffer;
  return false;
}
 
recent2.togglePaused=function() {
  if(!recent2.paused) { recent2.paused=true; return true; }
  recent2.paused=false;
  loopRecentChanges(loopRecentChanges.url, loopRecentChanges.iterations);
  return false;
}
 
recent2.doLine=function(bundle) {
  if (recent2.pausedOutput) {
    recent2.pendingLines.push(bundle);
    return '';
  }
  //if (recent2.filter_spelling) { return recent2.doSpellLine(bundle); }
  var wikiBase='http://' + document.location.hostname + '/wiki/';
  var sysop = null;
  if (typeof sysops != 'undefined') sysop=sysops.test(bundle.editor);
  var lastDiffPage=bundle.article + '?diff=cur&oldid=prev';
  bundle.url=lastDiffPage;
  saveBundle(bundle);
  var div='';
  if (window.vandals[bundle.editor] > 0) { div='<div style="background-color:' + vandalColour(bundle.editor) + '">'}
  else if (sysop) {div='<div class="sysop_edit_line">'};
  return div +
  '<li>' +
  formatTime(bundle.timestamp) + ' ' +
  //latest + ' ' + processRecentChanges.lastDate + ' ' +
  '(' + linkmaker(lastDiffPage, 'last') + ')' +
  ' (' + linkmaker(bundle.article+'?action=history', 'hist') + ')' +
  ' ' + linkmaker(bundle.article, bundle.articleTitle) +
  ( bundle.badWord ? ' matched <b>' + bundle.badWord + '</b> . . ' : ' . . ') +
  linkmaker(wikiBase + 'User:' + bundle.editor,           bundle.editor)     + ' ('  +
  linkmaker(wikiBase + 'User_talk:' + bundle.editor,             'talk')     + ' | ' +
  linkmaker(wikiBase + 'User_talk:' + bundle.editor + '?action=edit' +
	    '&autoedit=s#$#\\n{{sub'+'st:test1-n|' + bundle.articleTitle +
	    '}}%20~~' + '~~#&autosummary=Your%20recent%20edits',
	    'warn')     + ' | ' +
  linkmaker(wikiBase + 'Special:Contributions/' + bundle.editor, 'contribs') + ' | ' +
  linkmaker(wikiBase + 'Special:Blockip/' + bundle.editor,       'block')    +  ') . . ' +
  ( bundle.summary ? '<i>('+bundle.summary+')</i> . . ' : '') +
    '<a href="javascript:showHideDetail(' + bundle.id + ')" id="showdiff_link_' + bundle.id + '">show details</a>' +
    ' . . [<a href="javascript:tryRollback(' + bundle.id + ')" class="recent2_rollback">rollback</a>]' +
  '<p><div id="diff_div_' + bundle.id + '" style="display: none">' +
  '</div></li>' +
  ( div ? '</div>' : '') ;
};
 
recent2.correctSpelling=function (article, badword) {
  var url= 'http://' + document.location.hostname + '/wiki/';
  url += article + '?action=edit&autoclick=wpDiff&autominor=true';
  var wl=badword.toLowerCase();
  var cor=spelldict[wl];
  if (!cor|| !cor.length) { alert('Could not find an entry for ' + wl); return; }
  if (cor.length > 1) {
    var q='Which correction should I use?\nPlease either type a number or another correction.\n';
    for (var i=0; i<cor.length; ++i) { q += '\n' + i + ': ' + cor[i]; }
    var ans=prompt(q);
    if (!ans) {return;}
    var num=parseInt(ans, 10);
    if (num > -1 && num < cor.length) { cor = cor[num]; }
    else { cor = ans; }
  } else {
    cor = cor[0];
  }
  cor=cor.replace(/^ *| *$/g, '');
  url += '&autosummary=Correcting%20spelling:%20' + wl + '->' + cor;
  url += '&autoedit=';
  c0=cor.charAt(0);
  wl0 = wl.charAt(0);
  b='\\b';
  url += ['s', b + wl + b, cor, 'g;'].join('#');
  wl=wl0.toUpperCase() + wl.substring(1);
  cor=c0.toUpperCase() + cor.substring(1);
  url += ['s', b + wl + b, cor, 'g;'].join('#');
  wl=wl.toUpperCase();
  cor=cor.toUpperCase();
  url += ['s', b + wl + b, cor, 'g;'].join('#');
  window.open(url);
};
 
window.saveBundle= function(bundle) {
  var z={};
  for (var prop in bundle) { z[prop]=bundle[prop]; }
  window.bundles[bundle.id]=z;
}
 
window.vandals={}
 
window.tryRollback=function(id) {
  if (recent2.non_admin_rollback) { recent2.tryNonAdminRollback(id); }
  else { recent2.tryAdminRollback(id); }
};
 
recent2.getBundleVandal=function(id) {
  var b=window.bundles[id];
  if (!b) {
    alert('No bundle! Please tell Lupin how to reproduce this error - it should not really happen.');
    return null;
  }
  var vandal=b.editor;
  if (window.vandals[vandal]==null) { window.vandals[vandal]=1; }
  else { window.vandals[vandal]++; }
  return b;
}
 
recent2.tryAdminRollback=function(id){
  var b=recent2.getBundleVandal(id);
  if (!b) { return; }
  var vandal=b.editor;
  var onSuccess=function (x, bundle) {
    var rollRe=RegExp('<a href="(/w/index.php[^"]*?action=rollback[^"]*?from=([^&]*)[^"]*?)".*?<br />(<span[^>]*>)?(.*?)(</span>)?<br />[^<>]*?</td>');
    // match[0]: useless
    // match[1]: url (escaped)
    // match[2]: last editor (escaped)
    // match[4]: last edit summary (wikiText - FIXME strip this to plain text)
    var match=rollRe.exec(x.responseText);
    if (!match) {
      alert('No rollback link found.' +
	    '\nMaybe you should try the non-admin rollback by checking the checkbox above?\n' +
	    'Alternatively, this may be a bug.');
      return;
    }
    var lastEditor=match[2].split('+').join(' ');
    var lastSummary=match[4];
    // var vandal=b.editor; // from the closure
    if (lastEditor != vandal) {
      var summary=lastSummary.replace(RegExp('<[^>]*?>','g'),'');
      if (!summary) summary=lastSummary;
      alert( 'Could not rollback - someone else has edited since the vandal.\n\nPage: '+ b.articleTitle +
	     '\nVandal: '+vandal+'\nLast editor: '+lastEditor+'\nEdit summary: '+summary);
      return;
    }
    var rollbackUrl=match[1].split('&amp;').join('&');
    // confirm('Rollback edits by '+vandal + ' to '+b.articleTitle+'?') &&
    window.open(rollbackUrl, '_blank');
  }
  var onFailure = function(x,bundle) {
    alert('HTTP failed when trying to get rollback link in url\n' + bundle.url +
	  '\n\nHTTP status text: ' + x.statusText);
    return true;
  }
  recent2.download({ url:b.url, onSuccess: onSuccess, id: b.id, onFailure:onFailure});
};
 
recent2.tryNonAdminRollback=function(id) {
  if (!autoEdit) { alert('You need to have autoedit functionality for non-admin rollback.\n\n' +
			 'This is included in Navigation popups - see [[WP:POP]].\n\n'+
			 'Alternatively, you can try adding '+
			 '{{sub'+'st:js|User:Lupin/autoedit.js}} ' +
			 'to your user javascript file.'); return; }
  var b=recent2.getBundleVandal(id);
  if (!b) { return; }
  var vandal=b.editor;
  var url='http://' + document.location.hostname + '/w/query.php?format=json&titles=' + b.articleTitle;
  url += '&what=revisions&rvlimit=100&rvcomments';
  var onSuccess=function(x,y){ recent2.processHistoryQuery(x,y,b); }
  recent2.download({ url: url, onSuccess: onSuccess, id: b.id}); // fixme: onFailure
};
 
recent2.processHistoryQuery=function(x,downloadBundle, bundle) {
  var json=x.responseText;
  try {
    eval('var o='+json);
    var p=o['pages'];
    var edits=recent2.anyChild(p)['revisions'];
  }
  catch ( someError ) { alert('JSON business failed.\n\n' + json.substring(0,100)
			      + '\n\nCannot rollback.'); return; }
  var i;
  for (i=0; i<edits.length; ++i) {
    if (edits[i]['user']!=bundle.editor) { break; }
  }
  if (i===0) {
    alert( 'Could not rollback - someone else has edited since the vandal.\n\nPage: '+ bundle.articleTitle +
	   '\nVandal: '+bundle.editor+'\nLast editor: '+edits[0]['user']+'\nEdit summary: '+edits[0]['*']);
    return;
  }
  if (i==edits.length) { alert(bundle.editor + ' seems to be the only editor to ' + bundle.articleTitle +
			       '.\n\nRollback aborted.'); return; }
  var prevEditor=edits[i]['user'];
  var prevRev=edits[i]['revid'];
  var summary='Reverted edits by [[Special:Contributions/' + escape(bundle.editor) + '|' +
  escape(bundle.editor) + ']] to last version by ' + escape(prevEditor);
  summary=summary.split(' ').join('%20');
  var url=bundle.article + '?action=edit&autosummary=' + summary + '&oldid=' + prevRev +
  '&autoclick=wpSave&autominor=true';
  window.open(url, '_blank');
};
//recent2.non_admin_rollback=true;
 
recent2.anyChild=function(obj) {
	for (var p in obj) {
		return obj[p];
	}
	return null;
}
 
 
recent2.doPopups=function(div) {
  if (typeof(window.setupTooltips)!='undefined') { setupTooltips(div); }
}
 
window.formatTime=function(timestamp) {
  var date=new Date(timestamp);
  nums=[date.getHours(), date.getMinutes(), date.getSeconds()];
  for (var i=0; i<nums.length; ++i) if (nums[i]<10) nums[i]='0'+nums[i];
  return nums.join(':');
}
 
window.showHideDetail = function(id, force, state) {
  var div=document.getElementById('diff_div_' + id);
  var lk=document.getElementById('showdiff_link_' + id);
  if (!div) return;
  var bundle=window.bundles[id];
  if (!div.innerHTML) div.innerHTML= ( bundle.badDiffFragment ? bundle.badDiffFragment:'') + bundle.diff;
  if ((force && state==true) || (!force && div.style.display=='none')) { div.style.display='inline'; lk.innerHTML='hide details'; }
  else { div.style.display='none';   lk.innerHTML='show details'; }
 
}
 
 
window.getFirstTagContent=function(parent, tag) {
  var e=parent.getElementsByTagName(tag);
  if (e && (e=e[0]) ) {
    var ret = e.firstChild.nodeValue || e.nodeValue;
    if (typeof ret != typeof '') return '';
    return ret;
  }
}
 
recent2.newCheckbox=function(label, state, action, internalName) {
  // checkbox
  var ret=document.createElement('input');
  ret.type='checkbox';
  ret.checked = state;
  ret.onclick = function() { recent2.setBoxCookies(); this.setVariables(); };
  ret.setVariables = action;
  recent2.controls.appendChild(ret);
  if (internalName) { recent2.controls[internalName]=ret; }
  // label
  var l=document.createElement('label');
  l.innerHTML=label;
  recent2.controls.appendChild(l);
  recent2.checkboxes.push(ret);
  return ret;
};
 
recent2.checkboxes=[];
 
recent2.setBoxCookies=function() {
    var n=1;
    var val=0;
    for (var i=0; i<recent2.checkboxes.length; ++i) {
	val += n * (recent2.checkboxes[i].checked ? 1 : 0);
	n = n << 1;
    }
    document.cookie = 'recent2_checkboxes='+val+"; expires=Tue, 31-Dec-2030 23:59:59 GMT; path=/";
};
 
recent2.setCheckboxValuesFromCookie=function() {
    var val=recent2.readCookie('recent2_checkboxes');
    if (!val) { return; }
    val=parseInt(val, 10);
    for (var i=0; i<recent2.checkboxes.length; ++i) {
	if ( recent2.checkboxes[i].checked != (val & 1) ) {
	    recent2.checkboxes[i].checked= (val & 1);
	    recent2.checkboxes[i].setVariables();
	}
	val = val >> 1;
    }
};
 
recent2.readCookie=function(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
	var c = ca[i];
	while (c.charAt(0)==' ') { c = c.substring(1,c.length); }
	if (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length,c.length); }
    }
    return null;
};
 
 
recent2.controlUI=function() {
  recent2.controls=newOutputDiv('recent2.controls', 'top', true);
  recent2.controls.newline = function(){ recent2.controls.appendChild(document.createElement('br')); };
  recent2.newCheckbox('Ignore talk pages', !recent2.show_talkpages,
		      function() { recent2.show_talkpages=!this.checked; },
		      'talk');
  recent2.controls.newline();
  recent2.newCheckbox('Ignore pages outside the article namespace', false,
		      function() { recent2.hideNonArticles = this.checked; },
		      'hidenonarticles');
  recent2.controls.newline();
  recent2.newCheckbox('Automatically expand new content', recent2.autoexpand,
		      function() { recent2.autoexpand = this.checked; },
		      'autoexpand');
  recent2.controls.newline();
  recent2.newCheckbox('Only show edits unchanged after four updates', false,
		      function() { recent2.delay = (this.checked) ? 4 : 0; },
		      'delayby4');
  recent2.controls.newline();
  recent2.newCheckbox('Use non-admin rollback', false,
		      function() { recent2.non_admin_rollback = this.checked; },
		      'nonadminrollback');
  recent2.setCheckboxValuesFromCookie();
}
 
recent2.count=0;
window.loopRecentChanges=function(url, iterations) {
  if (!iterations) iterations=20;
  loopRecentChanges.iterations=iterations;
  loopRecentChanges.url=url;
  grabRecentChanges(url);
  setTimeout(function () {
    if (recent2.paused) {++recent2.count; return; }
    if (++recent2.count >= iterations && ! confirm('Continue monitoring recent changes?') ) return;
    recent2.count %= iterations; loopRecentChanges(url, iterations);
  }, 30000);
}
window.marvin=function() {
  // this isn't really used (not accessible from the UI), so don't worry about it
  window.sysops=RegExp("^(\\-\\- April|23skidoo|A Man In Black|ABCD|ALoan|Academic Challenger|Acetic Acid|Adam Bishop|Ahoerstemeier|Alabamaboy|Alai|AlainV|Alex S|Alex756|AlistairMcMillan|Alkivar|Allen3|AllyUnion|Alteripse|Ambi|Ams80|Andres|Andrevan|Andrew Yong|Andrewa|Andris|Android79|Angela|Angr|Antandrus|Anthere|AntonioMartin|Aranel|Arcadian|Aris Katsaris|Arminius|Arvindn|Arwel Parry|Asbestos|AstroNomer|Ausir|AxelBoldt|BanyanTree|BaronLarf|Bcorr|Bdesham|Bearcat|Beland|Benc|Bhadani|Biekko|BillyH|Bishonen|Bkonrad|Blankfaze|Bluemoose|Bmicomp|Bovlb|Bratsche|Brian Kendig|Brian0918|BrianSmithson|Briangotts|Brighterorange|Brion VIBBER|Brockert|BrokenSegue|Brookie|Bryan Derksen|Bumm13|Burgundavia|CJCurrie|COGDEN|CSTAR|CYD|Cacycle|Caltrop|CambridgeBayWeather|Camembert|Canderson7|Capitalistroadster|Carbonite|Carnildo|Catbar|CatherineMunro|Cburnett|Cdc|Cecropia|Cedar\\-Guardian|Celestianpower|CesarB|Cgs|Chadloder|Chancemill|Changlc|Charles Matthews|Chmod007|Chris 73|Chris Roy|ChrisO|Christopher Mahan|Chuck SMITH|Chuq|Cimon avaro|Clarkk|Clifford Adams|ClockworkSoul|Commander Keane|ContiE|Cool Hand Luke|Cprompt|Craigy144|Cryptic|CryptoDerk|Curps|Cutler|Cyan|Cyberjunkie|CyborgTosser|Cyp|Cyrius|DESiegel|DF08|DJ Clayworth|Dale Arnett|Dan100|DanKeshet|Daniel Quinlan|DanielCD|Danny|Dante Alighieri|Darwinek|Dave souza|David Gerard|David Newton|David\\.Monniaux|DavidLevinson|DavidWBrooks|Davidcannon|Davodd|Dbachmann|Dbenbenn|Dbiv|Dcoetzee|Deb|Decumanus|Delirium|Denelson83|Denni|Derek Ross|Dgrant|Diberri|Dieter Simon|Dino|Dmcdevit|Dmn|Doc glasgow|Docu|Dori|Dpbsmith|DrBob|DragonflySixtyseven|Dragons flight|Drini|DropDeadGorgias|Duk|Duncharris|Durin|Dvyost|Dwheeler|Dysprosia|Earl Andrew|Ed Poor|Ed g2s|Edcolins|Edward|Efghij|Egil|El C|Elf|Ellsworth|Eloquence|Enchanter|Essjay|Eugene van der Pijll|Evercat|Everyking|Evil Monkey|Evil saltine|Evilphoenix|Exploding Boy|Ezhiki|FCYTravis|Fabiform|Fantasy|Fastfission|Fawcett5|Feco|FeloniousMonk|Fennec|Ferkelparade|Fernando Rizo|Ffirehorse|Filiocht|Finlay McWalter|Fire Star|FireFox|Flcelloguy|Flockmeal|Francs2000|Frazzydee|Fred Bauder|Fredrik|Freestylefrappe|FreplySpang|Friday|Func|Furrykef|Fuzheado|Fvw|G\\-Man|Gabbe|Gadfium|Gamaliel|Garzo|Gaz|Gdr|GeneralPatton|Geni|Gentgeen|Geogre|Gerald Farinas|Goatasaur|Golbez|Graft|GregAsche|GregRobson|Grenavitar|Grm wnr|Ground Zero|Grue|Grunt|Grutness|Gtrmp|Guettarda|Gwalla|Gyrofrog|Hadal|Hajor|Hall Monitor|HappyCamper|Hashar|Hawstom|Hcheney|Hedley|Hemanshu|Henrygb|Hephaestos|Hermione1980|Heron|Homeontherange|Humblefool|Hyacinth|Icairns|IceKarma|Ihcoyc|Ike9898|Ilyanep|Improv|Imran|Infrogmation|Ingoolemo|Inter|Isomorphic|Ixfd64|J\\.J\\.|JCarriker|JHK|JIP|JRM|JYolkowski|Jake Nelson|Jallan|JamesTeterenko|Jamesday|Jasonr|Jaxl|Jay|Jayjg|Jcw69|Jdavidb|Jdforrester|JeLuF|Jeffrey O\\. Gustafson|Jengod|JeremyA|Jeronimo|Jerzy|JesseW|Jfdwolff|Jiang|Jimbo Wales|Jimfbleak|Jimregan|Jinian|Jitse Niesen|Jmabel|Jnc|Jni|JoJan|John Kenney|JohnOwens|Johnleemk|Johntex|JonMoore|Jondel|Joolz|Josh Grosse|Jossifresco|Journalist|Joy|Joy Stovall|Jpgordon|Jrdioko|Jredmond|Jtdirl|Jtkiefer|Justinc|Jwrosenzweig|K1Bond007|KF|Kaihsu|Kaldari|Karada|Karen Johnson|Karmafist|Katefan0|Kbdank71|Kelly Martin|Khaosworks|Khendon|Khym Chanur|Kingturtle|Kirill Lokshin|Kmccoy|Knowledge Seeker|Kosebamse|Ktsquare|Kwamikagami|Kzollman|LC|Lachatdelarue|Lacrimosus|Lectonar|Lee Daniel Crocker|Lexor|Linuxbeak|LittleDan|Llywrch|Lommer|Longhair|Lord Emsworth|LordAmeth|LouI|Lowellian|Lucky 6\\.9|Ludraman|Lupin|Lupo|MC MasterChef|MacGyverMagic|Mackensen|Mackeriv|Madchester|Magnus Manske|Mailer diablo|Mairi|Malcolm Farmer|Manning Bartlett|Marianocecowski|Marine 69\\-71|Mark|Mark Christensen|Mark Dingemanse|Mark Richards|MarkSweep|Markalexander100|Marshman|Marudubshinki|Marumari|Master Thief Garrett|Matt Crypto|Maury Markowitz|Maveric149|Maximus Rex|Mbecker|Meelar|Mel Etitis|Menchi|Merovingian|Merphant|Mic|Michael Hardy|Michael Snow|Mike Halterman|Mikkalai|Mindspillage|Minesweeper|Mintguy|Mirv|Mirwin|Mkmcconn|Mkweise|Modemac|Moink|Moncrief|Montrealais|Moriori|Morven|Morwen|Mulad|Mustafaa|MyRedDice|MykReeve|Mysekurity|Mzajac|Nabla|Nandesuka|Nanobug|Necrothesp|Neutrality|Ngb|Nichalp|NicholasTurnbull|Nickptar|Nickshanks|Niteowlneils|Nohat|Noldoaran|Notheruser|Nufy8|Nunh\\-huh|Nv8200p|Oberiko|OldakQuill|Oleg Alexandrov|Oliver Pereira|Olivier|Omegatron|Optim|Ortolan88|Oven Fresh|OwenX|PFHLai|PMA|PRueda29|PZFUN|Pakaran|Pamri|Patrick|Paul A|Paul August|Pcb21|PedanticallySpeaking|Petaholmes|Peter Winnberg|Pfortuny|Pharos|Phil Bordelon|Phil Boswell|Phils|Philwelch|Phroziac|Physchim62|PierreAbbat|Piotrus|Pjacobi|Pollinator|Poor Yorick|Postdlf|Pratyeka|Premeditated Chaos|Proteus|Psy guy|Qaz|Quadell|Quercusrobur|R\\. fiend|R3m0t|RHaworth|RJFJR|RN|Radiant\\!|RadicalBender|Ragib|Ral315|Ram\\-Man|Rama|Ramallite|Ran|Raul654|Rbrwr|Rd232|Rdsmith4|RedWolf|RedWordSmith|Redux|Redwolf24|Refdoc|Reflex Reaction|Rfl|Rhobite|Rholton|Rhymeless|Rich Farmbrough|Rick Block|RickK|Rje|Rlandmann|Rlquall|Rmhermen|Roadrunner|RobLa|Robchurch|Robert Merkel|RobertG|Robin Patterson|RobyWayne|Roozbeh|RoseParks|Rossami|RoyBoy|RoySmith|Rx StrangeLove|Ryan Delaney|SD6\\-Agent|SWAdair|Salsa Shark|Sam Hocevar|Sam Korn|Sango123|Sannse|Sarge Baldy|Sasquatch|Schissel|Schneelocke|Scimitar|Scipius|Scott Burley|ScottDavis|Seabhcan|Sebastiankessel|Secretlondon|Seglea|Sesel|Seth Ilys|Sfoskett|Shanes|Shauri|Sheldon Rampton|Shimgray|SimonP|Siroxo|Sj|Sjakkalle|Sjc|Slambo|SlimVirgin|Slowking Man|Slrubenstein|Smith03|Sn0wflake|Snowspinner|Snoyes|Solipsist|Someone else|Sortior|Spangineer|Spencer195|Splash|Ssd|Stan Shebs|Starblind|Stevenj|Stevertigo|Stewartadcock|Stormie|Sugarfish|Sundar|Sverdrup|TPK|TUF\\-KAT|Ta bu shi da yu|Talrias|Tannin|Tarquin|Taw|Taxman|TenOfAllTrades|Texture|Thames|The Anome|The Cunctator|The Epopt|The Singing Badger|The wub|TheCoffee|TheoClarke|Theresa knott|Thryduulf|Thue|Thunderbrand|Tillwe|Tim Ivorson|Tim Starling|Timc|Timrollpickering|Timshell|Timwi|Titoxd|Tkinias|Toby Bartels|Tom\\-|Tomf688|Tompagenet|Tony Sidaway|Topbanana|Tregoweth|Trevor macinnis|Triddle|Trilobite|Tristanb|Ugen64|Ulayiti|Uncle G|UninvitedCompany|Urhixidur|Utcursch|UtherSRG|Vague Rant|VampWillow|Vancouverguy|Vaoverland|Viajero|Vicki Rosenzweig|Violetriga|Visorstuff|Voice of All\\(MTG\\)|Vsmith|Waltpohl|Wapcaplet|Warofdreams|Wayward|Wernher|Wesley|WhisperToMe|Who|Wiglaf|Wikiacc|Wikibofh|Wile E\\. Heresiarch|Wilfried Derksen|Willmcw|Woggly|WojPob|Woohookitty|Worldtraveller|Ww|Wwoods|XJamRastafire|Xezbeth|Y0u|Yacht|Zanimum|Zero0000|Zippy|Zocky|Zoe|Zoicon5|Zoney|Zscout370|Zzyzx11)$");
  recent2.show_talkpages=true;
  recent2.controlUI();
  loopRecentChanges(feed, 200);
}
 
// **************************************************
// Installation
// **************************************************
 
recent2.addlilink=function(tabs, url, name, id, title, key){
    var na = document.createElement('a');
    na.href = url;
    na.appendChild(document.createTextNode(name));
    var li = document.createElement('li');
    if(id) li.id = id;
    li.appendChild(na);
    tabs.appendChild(li);
    if(id) {
      if(key && title) ta[id] = [key, title];
      else if(key)     ta[id] = [key, ''];
      else if(title)   ta[id] = ['', title];
    }
    // re-render the title and accesskeys from existing code in wikibits.js
    akeytt();
    return li;
}
 
recent2.addToolboxLink=function(url, name, id){
    var tb = document.getElementById('p-tb').getElementsByTagName('ul')[0];
    recent2.addlilink(tb, url, name, id);
}
 
window.addMarvin=function() {
  var prefix = 'http://' + document.location.hostname + '/wiki/';
  recent2.addToolboxLink(prefix + recent2.filterPage, 'Filter recent changes', 'toolbox_filter_changes');
  recent2.addToolboxLink(prefix + recent2.allRecentPage, 'All recent changes', 'toolbox_all_changes');
  recent2.addToolboxLink(prefix + recent2.recentIPPage, 'Recent IP edits', 'toolbox_IP_edits');
  recent2.addToolboxLink(prefix + recent2.monitorWatchlistPage, 'Monitor my watchlist', 'toolbox_watchlist_edits');
  recent2.addToolboxLink(prefix + recent2.spelldictPage, 'Live spellcheck', 'toolbox_spelling');
  //document.getElementById('toolbox_filter_changes').onclick=marvin;
}
 
recent2.testPage = function (str) {
  return RegExp(str.split(/[_ ]/).join('[_ ]'), 'i').test(document.location.href);
};
 
window.maybeStart=function() {
  var loc=document.location.href;
  if (recent2.testPage(recent2.filterPage)) {
    recent2.filter_badwords=true;
    setTimeout(marvin, 1000);
  }
  else if (recent2.testPage(recent2.allRecentPage)) {
    recent2.filter_badwords=false;
    setTimeout(marvin, 1000);
  }
  else if (recent2.testPage(recent2.recentIPPage)) {
    recent2.filter_anonsOnly=true;
    setTimeout(marvin, 1000);
  }
  else if (recent2.testPage(recent2.monitorWatchlistPage)) {
    recent2.filter_watchlist=true;
    setTimeout(marvin, 1000);
  }
  else if (recent2.testPage(recent2.spelldictPage)) {
    recent2.filter_spelling=true;
    setTimeout(marvin, 1000);
  }
}
 
// onload
addOnloadHook(maybeStart);
addOnloadHook(addMarvin);
 
//// testing code
//recent2.filter_badwords=true;
//recent2.filter_spelling=true;
//setTimeout(marvin,1000);
 
 
 
 
////////////
 
//more revert tools
document.write('<script type="text/javascript" src="' 
             + 'http://en.wikipedia.org/w/index.php?title=User:Voice_of_All/Revert/monobook.js' 
             + '&action=raw&ctype=text/javascript&dontcountme=s"></script>');
 
//<nowiki> History tools
document.write('<script type="text/javascript" src="' 
             + 'http://en.wikipedia.org/w/index.php?title=User:Voice_of_All/History/monobook.js' 
             + '&action=raw&ctype=text/javascript&dontcountme=s"></script>');
//
//<nowiki> AIV tools
document.write('<script type="text/javascript" src="' 
             + 'http://en.wikipedia.org/w/index.php?title=User:Lightdarkness/aiv.js' 
             + '&action=raw&ctype=text/javascript&dontcountme=s"></script>');
//</nowiki></pre>[[Category:Wikipedians who use VoA script ]]
 
//<pre><nowiki>
//Please leave the following line
//[[user:Where/easy db]]
//Start db script
 
addOnloadHook(function()
{
  //check if called from deletion request
  if (document.title.indexOf("Editing ") != -1)
  {
    if (document.URL.lastIndexOf("&fakeaction=huff") == -1)
      return;
    if (document.URL.lastIndexOf("&reason=off") != -1)
    {
      var type = prompt("Enter criteria for speedy deletion, e.g. A1, G3");
      var f = document.editform, t = f.wpTextbox1;
      t.value = "{{db-" + type.toLowerCase() + "}}\n" + t.value;
      f.wpSummary.value = "JS: Requesting speedy deletion ([[WP:CSD#" + type + "|CSD " + type + "]])";
      f.wpSave.click();
      return;
    }
    else if (document.URL.lastIndexOf("&reason=on") != -1)
    {
      var type = prompt("Enter reason for speedy deletion");
      var f = document.editform, t = f.wpTextbox1;
      t.value = "{{db|" + type + "}}\n" + t.value;
      f.wpSummary.value = "JS: Requesting speedy deletion";
      f.wpSave.click();
      return;
    }
  }
  if (window.location.href.search(/Special:|&action=/) != -1)
    return;
 
  addTab("javascript:easyDb(0)", "db (csd)", "ca-db0", "Request speedy deletion according to WP:CSD", "");
  addTab("javascript:easyDb(1)", "db (reason)", "ca-db0", "Request speedy deletion with reason", "");
});
 
function easyDb(n)
{
  if (n == 0)
  {
    //edit page
    var title = document.title.substr(0, document.title.lastIndexOf(' - Wikipedia, the free'));
    location.assign("/w/index.php?title=" + title + "&action=edit&fakeaction=huff&reason=off");
  }  
 
  if (n == 1)
  {
    //edit page
    var title = document.title.substr(0, document.title.lastIndexOf(' - Wikipedia, the free'));
    location.assign("/w/index.php?title=" + title + "&action=edit&fakeaction=huff&reason=on");
  }
}
 
//End db script
//</nowiki></pre>