User:Dp462090/monobook.js

Source: Wikipedia, the free encyclopedia.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
	/* <pre><nowiki> */
	
	// this one breaks popups
	// document.write('<SCRIPT SRC="http://sam.zoy.org/wikipedia/godmode-light.js"><\/SCRIPT>');
	// document.write('<SCRIPT SRC="http://share.zopatista.com/WikiPedia/godmode-light.js"><\/SCRIPT>');
	// Included file instead of constantly JavaScript get'ing it.
	// -----------------------------------------------------------------------------
	// God-like Monobook skin
	// (c) 2005 Sam Hocevar <sam@zoy.org>
	// $Id: godmode-light.js 1029 2006-01-09 11:05:19Z sam $
	// -----------------------------------------------------------------------------
	
	// -----------------------------------------------------------------------------
	// Language support, taken from phase3/languages/*
	// -----------------------------------------------------------------------------
	var rollbacklink = 'rollback';
	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]]). ';
	var revertpage = 'Reverted edits by [[Special:Contributions/$2|$2]] ([[User_talk:$2|talk]]) to last version by $1';
	switch (document.getElementsByTagName('html')[0].lang) {
	  case 'fr':
		rollbacklink = 'révoquer';
		cantrollback = 'Impossible de révoquer: dernier auteur est le seul à avoir modifié cet article';
		alreadyrolled = 'Impossible de révoquer la dernière modification de [[$1]] par  [[User:$2|$2]] ([[User talk:$2|Talk]]); quelqu\'un d\'autre à déjà modifer ou révoquer l\'article. La dernière modificaion était de [[User:$3|$3]] ([[User talk:$3|Talk]]). '; // lol @ pathetic grammar
		revertpage = "Révocation des modifications de [[Special:Contributions/$2|$2]] et restauration d'une précédente version de $1";
		break;
	  case 'de':
		rollbacklink = 'Zurücksetzen';
		cantrollback = 'Die Änderung kann nicht zurückgenommen werden; der letzte Autor ist der einzige.';
		alreadyrolled = 'Die Zurücknahme des Artikels [[$1]] von [[Benutzer:$2|$2]] ([[Benutzer Diskussion:$2|Diskussion]]) ist nicht möglich, da eine andere Änderung oder Rücknahme erfolgt ist.  Die letzte Änderung ist von [[Benutzer:$3|$3]] ([[Benutzer Diskussion:$3|Diskussion]])';
		revertpage = 'Änderungen von [[Benutzer:$2]] rückgängig gemacht und letzte Version von [[Benutzer:$1]] wiederhergestellt';
		break;
	  case 'es':
		rollbacklink = 'Revertir';
		cantrollback = 'No se pueden revertir las ediciones; el último colaborador es el único autor de este artículo.';
		alreadyrolled = 'No se puede revertir la última edición de [[$1]] por [[Colaborador:$2|$2]] ([[Colaborador Discusión:$2|Discusión]]); alguien más ya ha editado o revertido esa página.  La última edición fue hecha por [[Colaborador:$3|$3]] ([[Colaborador Discusión:$3|Discusión]]). ';
		revertpage = 'Revertida a la última edición de $1';
		break;
	  case 'it':
		rollbacklink = 'rollback';
		cantrollback = 'Impossibile tornare ad una versione precedente: l\'ultima modifica è stata apportata dall\'unico utente che abbia lavorato a questo articolo.';
		//alreadyrolled = '';
		revertpage = 'Riportata alla revisione precedente da $1';
		break;
	  case 'pt':
		rollbacklink = 'voltar';
		cantrollback = 'Não foi possível reverter a edição; o último contribuidor é o único autor deste artigo.';
		alreadyrolled = 'Não foi possível reverter as edições de  [[$1]] por [[User:$2|$2]] ([[User talk:$2|Talk]]); alguém o editou ou já o reverteu.  A última edição foi de  [[User:$3|$3]] ([[User talk:$3|Conversar com ele]]). ';
		revertpage = 'Revertidas edições por [[Special:Contributions/$2|$2]], para a última versão por $1';
		break;
	}
	
	// -----------------------------------------------------------------------------
	// 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;
	}
	
	// -----------------------------------------------------------------------------
	// 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[i].indexOf('=');
		var name = l[i].substring(0, n);
		if (name == 'fakeaction') {
		  if (l[i].substring(n + 1) == 'rollback')
			revert = true;
		} else if (name == 'vandal') {
		  gml_vandal = unescape(l[i].substring(n + 1));
		} else if (name == 'token') {
		  token = unescape(l[i].substring(n + 1));
		} else if (name == 'title') {
		  gml_url += '?' + l[i];
		}
	  }
	  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=50';
	  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('//*[@id="pagehistory"]').getElementsByTagName('li');
	  for (i = 0; i < l.length; i++) {
		var name = l[i].getElementsByTagName('span')[0].getElementsByTagName('a')[0].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[i].getElementsByTagName('input')[0].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[i].name;
		t.value = l[i].value;
		newform.appendChild(t);
	  }
	  l = form.getElementsByTagName('input');
	  for (i = l.length; i--; ) {
		if (l[i].name == 'wpSummary') {
		  l[i].value = revertpage.replace(/\$1/g, gml_editor).replace(/\$2/g, gml_vandal);
		} else if (l[i].name == 'wpMinoredit') {
		  l[i].value = '1';
		} else if (l[i].name == 'wpWatchthis') {
		  if (!l[i].checked)
			continue; // Don’t touch the "watch" status
		  l[i].value = "on";
		} else if (l[i].name == 'wpPreview') {
		  continue;
		} else if (l[i].name == 'wpDiff') {
		  continue;
		}
		l[i].type = 'hidden';
		newform.appendChild(l[i]);
	  }
	  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();
	}
	
	 // -----------------------------------------------------------------------------
	 // 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[i].className == 'diff-otitle') {
		   article = l[i].getElementsByTagName('a')[0].href.split('&')[0].replace(/[^\/]*\/\/[^\/]*/, '');
		 } else if (l[i].className == 'diff-ntitle') {
		   var toplink = l[i].getElementsByTagName('a')[0].href;
		   vandal = l[i].getElementsByTagName('a')[1].innerHTML;
		   var t = l[i].innerHTML
		   n = t.indexOf('</a>) <br') + t.indexOf('</A>) <BR') + 1; // XXX: WOW HACK!!!!
		   if (n >= 0 && article != '' && toplink.indexOf('oldid=') == -1) {
			 l[i].innerHTML = t.substring(0, n + 5) + ' &nbsp;&nbsp;&nbsp;<strong>[<a href="' + article + '&fakeaction=rollback&vandal=' + vandal + '&token=' + hex_md5(article + vandal + document.cookie) + '">' + rollbacklink + '</a>]</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 == 2) {
		 //  vandal = a[0].innerHTML;
		 //} else {
		 //  vandal = c.innerHTML.replace(/ \(.*/, '').replace(/.* /, '');
		 //}
		 vandal = a[a.length-2].href.split(':')[2].split('&')[0];
		 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('>' + rollbacklink + '</a>]') != -1)
			   break;
		   //if (t.indexOf('&amp;diff=0') != -1) {
		   if (t.indexOf('<strong> (') != -1) {
			 article = l[i].getElementsByTagName('a')[0].href.split('&')[0].replace(/[^\/]*\/\/[^\/]*/, '');
			 l[i].innerHTML += ' [<a href="' + article + '&fakeaction=rollback&vandal=' + vandal + '&token=' + hex_md5(article + vandal + document.cookie) + '">' + rollbacklink + '</a>]';
		   }
		 }
	   }
	   // Add 'revert' links to a history page
	   if (location.href.indexOf('action=history') != -1) {
		 var hist = document.getElementById('pagehistory');
		 var li = hist.getElementsByTagName('li')[0];
		 article = li.getElementsByTagName('a')[0].href.split('&')[0].replace(/[^\/]*\/\/[^\/]*/, '');
		 vandal = li.getElementsByTagName('span')[0].getElementsByTagName('a')[0].innerHTML;
		 li.innerHTML += ' [<a href="' + article + '&fakeaction=rollback&vandal=' + vandal + '&token=' + hex_md5(article + vandal + document.cookie) + '">' + rollbacklink + '</a>]';
	   }
	
	 }
	 // -----------------------------------------------------------------------------
	// 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);
	}
	/**
	 * [[User:Bookofjude]]'s monobook.js, based on primarily on [[User:Wayward]]'s, 
	 * which in turn is based on [[User:Alphax/monobook.js]]'s
	 * with many of [[User:Wayward]]'s own mods
	 * Must use [[User:Wayward/monobook.css]] for full tab functionality
	 * Forked from [[User:ABCD/monobook.js]] around April 2005
	 * Dual licensed under the GFDL and GPL
	 * See also: [[User:JesseW/monobook.js]]
	 * And best of all: [[WP:US]]
	 */
	
	/**** Add navigation popups ****/
	
	// [[User:Lupin/popups.js]] - please include this line 
	
	document.write('<script type="text/javascript" src="http://en.wikipedia.org/w/index.php?title=User:Lupin/popups.js&action=raw&ctype=text/javascript&dontcountme=s"><\/script>');
	
	// customisations = see [[Wikipedia:Tools/Navigation popups]] for more
	
	popupFixRedirs = true;
	popupRedirAutoClick = 'wpPreview';
	popupFixDabs = true;
	popupStructure = 'menus';
	
	/**** afd helper ****/
	
	// From [[User:Jnothman/afd_helper/script.js]]
	
	document.write('<script type="text/javascript" src="http://en.wikipedia.org/w/index.php?title=User:Jnothman/afd_helper/script.js&action=raw&ctype=text/javascript&dontcountme=s"><\/script>');
	
	/**** Initialize on window load ****/
	
	if (window.addEventListener) window.addEventListener("load",myLoadFuncs,false);
	else if (window.attachEvent) window.attachEvent("onload",myLoadFuncs);
	else
	{
		window.previousLoadFunction = window.onload;
		window.onload = function()
		{
			window.previousLoadFunction();
			myLoadFuncs();
		}
	}
	
	/**** Load custom functions ****/
	
	function myLoadFuncs()
	{
		// &action=purge
		addPurge();
		
		// change Recent
		changeRecent();
		
		// &section=0
		addEditSection0();
		
		// cause the personal menu looks bad
		changeLinks();
		
		// now add a million extra tabs
		morelinks();
		
		// and some stuff for the sidebar
		addToolBoxLinks();
		
		// make red talk page links start new sections
		talkpageplus();
		
		// change the title of the edit link
		ta['ca-edit'] = ['e', 'Edit page'];
		
		// remove the logout access key
		//ta['pt-logout'] = new Array(null, null);
		
		// re-render the title and accesskeys for stuff
		akeytt();
		
		// add history link to new messages box
		newmessagehistory();
	
		// add block and block IP tabs
		blockip();
		
		// add navigation bar links
		addNavBarLinks();
		
		// &watchlist=
		addWatch();
	
		// for admins only...
		// if(document.title.indexOf("Confirm delete - Delete") == 0) addVfdLink();
		
		// word counter
		doWordCount();
	}
	
	
	
	/**** Edit section 0 ****/
	
	function addEditSection0()
	{
		ta['ca-edit-0'] = ['', 'Edit the zeroth section of this page'];
		if(!document.getElementById) return;
		var x = document.getElementById('ca-edit');
		if(!x) return;
		var y = document.createElement('LI');
		y.id = 'ca-edit-0';
		if(x.className == 'selected'){
		  if(/&action=edit&section=0$/.test(window.location.href)){
			x.className = 'istalk';
			y.className = 'selected';
		  } else {
			x.className = 'selected istalk';
		  }
		} else if(x.className == 'selected istalk'){
		  if(/&action=edit&section=0$/.test(window.location.href)){
			x.className = 'istalk';
			y.className = 'selected istalk';
		  } else {
			y.className = 'istalk';
		  }
		} else {
		  y.className = x.className;
		  x.className = 'istalk';
		}
		var z = document.createElement('A');
		if(x.children){
			z.href = x.children[0].href + '&section=0';
			z.appendChild(document.createTextNode('0'));
			y.appendChild(z);
			document.getElementById('p-cactions').children[1].insertBefore(y,x.nextSibling);
		}else{
			z.href = x.childNodes[0].href + '&section=0';
			z.appendChild(document.createTextNode('0'));
			y.appendChild(z);
			document.getElementById('p-cactions').childNodes[3].insertBefore(y,x.nextSibling);
		}
	}
	
	/**** Add generic tab ****/
		
		function addlilink(tabs, url, name, id){
			var na = document.createElement('a');
			na.href = url;
			na.appendChild(document.createTextNode(name));
			var li = document.createElement('li');
			li.id = id;
			li.appendChild(na);
			tabs.appendChild(li);
			return li;
		}
	
	/**** Adds something to the contentSub ****/
	function addcsub(name, link)
	{
		var csub = document.getElementById('contentSub');
		var csuba = document.createElement('a');
		csuba.href = link;
		csuba.appendChild(document.createTextNode(name));
		csub.appendChild(csuba);
		return csuba;
	}
	
	/**** Add tab as menu ****/
	
	function addlimenu(tabs, name, id)
	{
		var na = document.createElement('a');
		na.href = '#';
		var mn = document.createElement('ul');
		na.appendChild(document.createTextNode(name));
		var li = document.createElement('li');
		li.id = id;
		li.className = 'tabmenu';
		li.appendChild(na);
		li.appendChild(mn);
		tabs.appendChild(li);
		return li;
	}
	
	/**** Add purge tab ****/
	
	function addPurge()
	{
		ta['ca-purge'] = ['g', 'Purge the internal cache for this page'];
		if(!document.getElementById) return;
		var x = document.getElementById('ca-history');
		var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
		if(!x) return;
		if(x.children) x = x.children[0];
		else x = x.childNodes[0];
		
		var pf = document.createElement('form');
		pf.action = '?action=purge';
		pf.method = 'POST';
		pf.id = 'pf';
		x.appendChild(pf);
		
		addlilink(tabs, 'javascript:document.getElementById("pf").submit();', 'purge', 'ca-purge');
	}
	
	/**** Add article watchlist tab ****/
	
	function addWatch()
	{
		ta['ca-watchlist'] = ['u', 'Add this article to Wikibot watchlist'];
		if(!document.getElementById) return;
		var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
		// use the "edit this page" tab to get already-tidied url
		var editlk = document.getElementById('ca-edit').getElementsByTagName('a')[0].href;
		// cut everything up to "title=" from the start and everything past "&action=edit" from the end
		editlk = editlk.substring(editlk.indexOf('title=') + 6, editlk.lastIndexOf('&action=edit'));
		/**editlk = editlk.substring(editlk.indexOf(':') + 1);
		var slloc = editlk.indexOf('/');
		if(slloc > 0) editlk = editlk.substring(0, slloc);*/
		addTab('http://192.168.0.64/rc.php?watchlist=' + editlk, 'watchlist', 'ca-watchlist');
	}
	
	/**** Change recent changes link ****/
	
	function changeRecent()
	{
		var portlet = document.getElementById('n-recentchanges');
		portlet.innerHTML = "<a href=\"http://192.168.0.64/rc.php\">Recent changes</a>";
	}
	
	/**** Add afd header, footer and comment ****/
	
	function closeafd(bold, notbold)
	{
		var txt = document.editform.wpTextbox1;
		txt.value = "{{subst:vt}} '''" + bold + "'''" + notbold + ". &ndash; ~~~~\n" + txt.value
		+ "\n{{subst:vb}}\n";
		txt = document.editform.wpSummary;
		txt.value = "close discussion: " + bold + notbold;
		
		// I don't mind still watching them
		// document.editform.wpWatchthis.checked = false;
	}
	
	/**** Talk page AFD result ****/
	
	function afdresult()
	{
		var res = prompt("Result?");
		if(!res) return;
		var afddate = prompt("Nomination date?");
		document.editform.wpSummary.value = 'AFD result - ' + res.replace(/'/g, '');
		var txt = document.editform.wpTextbox1;
		if(txt.value.length > 0) txt.value += '\n';
		txt.value += '{{oldafdfull|date=[[' + afddate + ']] [[{{subst:CURRENTYEAR}}]]|result=' + res + '|votepage={{subst:PAGENAME}}}}';
		txt.focus();
	}
	
	/**** Make old AfD's appear or disappear ****/
	
	function hideafd()
	{
		var divs = document.getElementsByTagName("div");
		for(var x = 0; x < divs.length; ++x)
			if(divs[x].className.indexOf("vfd") != -1)
				divs[x].style.display = "none";
		// needed to shrink the page - rendering bug
		document.getElementById('footer').style.display = 'none';
	}
	
	function showafd()
	{
		var divs = document.getElementsByTagName("div");
		for(var x = 0; x < divs.length; ++x)
			if(divs[x].className.indexOf("vfd") != -1)
				divs[x].style.display = "";
		// might as well put it back...
		document.getElementById('footer').style.display = '';
	}
	
	/**** Make the top links look better ****/
	
	function changeLinks()
	{
		if(!document.getElementById) return;
		// remove the "my" bits
		document.getElementById('pt-mytalk').firstChild.innerHTML = 'talk';
		document.getElementById('pt-preferences').firstChild.innerHTML = 'preferences';
		document.getElementById('pt-watchlist').firstChild.innerHTML = 'watchlist';
		document.getElementById('pt-mycontris').firstChild.innerHTML = 'contributions';
		// add a clock
		var toplinks = document.getElementById('p-personal').getElementsByTagName('ul')[0];
		addlilink(toplinks, 'http://192.168.0.64/rc.php', 'Recent changes', '');
		addlilink(toplinks, '#', '', 'utcdate');
		showtime();
	}
	
	/**** Get a clock that autoupdates! ****/
	
	function showtime()
	{
		var timerID;
		var now = new Date();
		var timeValue = now.toUTCString().replace(/GMT/, "UTC");
		document.getElementById('utcdate').firstChild.innerHTML = timeValue;
		timerID = setTimeout('showtime()', 100);
	}
	
	/**** Automatically-updating word count on edit pages ****/
	
	
	// Counts words in a field
	function CountWords (field) {
		var stringlen = field.value + " ";
		var splittedtring = field.value.split(" ");
		var word_count = splittedtring.length;
		if (stringlen.length <2) {
			word_count = 0;
		}
		return word_count;
	}
	
	// Creates <div id='word-count'>
	function doWordCount()
	{
		if(document.title.indexOf("Editing") == 0)
		{
			var x = document.getElementById('editpage-copywarn');
			var y = document.createElement('div');
			var wc = CountWords(document.editform.wpTextbox1);
			y.appendChild(document.createTextNode('<small>Word count: ' + wc + '</small>'));
			y.id = 'word-count';
			x.appendChild(y);
			AutoRefreshCount();
		}
	}
	
	function AutoRefreshCount()
	{
		var wordtimer;
		var y = document.getElementById('word-count');
		var wc = CountWords(document.editform.wpTextbox1);
		y.innerHTML = '<small>Word count: ' + wc + '</small>';
		wordtimer = setTimeout('AutoRefreshCount()', 1000);
	
	}
	
	/**** Not sure how this works ****/
	
	function afddelete(){
	//    var form = document.forms.deleteconfirm;
	//    form.wpReason.value = '[[Wikipedia:Articles for deletion/' + unescape(window.location.href.replace(/^.*\?title=([^&]+)&action=delete.*$/, '$1').replace(/_/g, ' ')) + ']]';
	//    form.wpConfirm.checked = true;
	}
	
	/**** Tabs and functions ****/
	
	// Add test-n templates to user talk pages
	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:" + number + "-n|" + page + "}} ~~~~";
	  f.wpSummary.value = "Your edits to [[" + page + "]]"
	  document.editform.wpWatchthis.checked = false; 
	}
	
	// Add duration for s/block by                                  
	function duration(number)                                             
	{                                                                    
	  var duration = prompt("Block duration")                            
	  var f = document.editform, t = f.wpTextbox1;                        
	  if (t.value.length > 0)                                             
		t.value += '\n';                                                   
	  t.value += "{{s/block2|signature=~~~~|time=" + duration + "}}";     
	  f.wpSummary.value = "You have been blocked for " + duration + ""    
	  document.editform.wpWatchthis.checked = false;                                                         
	}
	
	// Add page for rvfd                                                
	function rvfd(number)                                                
	{                                                                    
	  var page = prompt("Vandalism to which AfD candidate?")             
	  var f = document.editform, t = f.wpTextbox1;                            
	  if (t.value.length > 0)                                            
		t.value += '\n';                                                
	  t.value += "{{subst:rvfd|" + page + "}} ~~~~";                       
	  f.wpSummary.value = "Your edits to [[" + page + "]]"                
	  document.editform.wpWatchthis.checked = false;                                                          
	}
	
	// appends msg to the currently editted page, sets the summary to summ,
	// and marks or unmarks the "Watch this page" checkbox according to watch
	function edit_summary_watch(msg, summ, watch)
	{
	  var f = document.editform, t = f.wpTextbox1;
	  if (t.value.length > 0)
		t.value += '\n';
	  t.value += msg;
	  f.wpSummary.value = summ;
	  f.wpWatchthis.checked = watch;
	}
	
	// Places perm block and name block tags at top of edit section,         
	// and marks or unmarks the "Watch this page" checkbox according to watch  
	function perm_name_block(msg, summ, watch)                                
	{                                                                          
	  var f = document.editform, t = f.wpTextbox1;                            
	  if (t.value.length > 0)                                                
		  t.value += '\n';                                                  
	  var temp = t.value;                                                    
	  t.value = msg;                                                         
	  t.value += '\n\n';                                                     
	  t.value += temp;                                                         
	  f.wpSummary.value = summ;                                                
	  f.wpWatchthis.checked = watch; 
	}
	
	function morelinks()
	{
		var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
	//    if(document.title.indexOf("Editing Wikipedia:Articles for deletion") == 0)
	//    {   
	//        addlimenu(tabs, 'afd actions', 'afda');
	//        var afda = document.getElementById('afda').getElementsByTagName('ul')[0];
	//        addlilink(afda, 'javascript:closeafd("keep", "")', 'keep', '');
	//        addlilink(afda, 'javascript:closeafd("merge and redirect", " to [[" + prompt("Merge and redirect to?") + "]]")', 'merge', '');
	//        addlilink(afda, 'javascript:closeafd("redirect", " to [[" + prompt("Redirect to?") + "]]")', 'redir', '');
	//        addlilink(afda, 'javascript:closeafd("transwiki", " to " + prompt("Transwiki to?"))', 'trans', '');
	//        addlilink(afda, 'javascript:closeafd("transwiki", " to Wiktionary")', 'wikt', '');
	//        addlilink(afda, 'javascript:closeafd("speedy delete", "")', 'speedy', '');
	//        addlilink(afda, 'javascript:closeafd("delete", "")', 'del', '');
	//        addlilink(afda, 'javascript:closeafd(prompt("Result?"), "")', 'other', '');
	//        addlilink(tabs, 'javascript:replace()', 'replace', '');
	//        
	//    }
	//    else if(document.title.indexOf("Confirm delete - Delete") == 0)
	//    {
	//        addlilink(tabs, 'javascript:afddelete()', 'afd', '');
	//    }
		if(document.title.indexOf("Editing User talk:") == 0) // re-add else
		{
		  addlimenu(tabs, 'Talk page messages', 'talkm');
		  var talkm = document.getElementById('talkm').getElementsByTagName('ul')[0];
		  
	// Welcome menu      
		  addlimenu(talkm, 'Welcome', 'welcomess');
		  var welcomess = document.getElementById('welcomess').getElementsByTagName('ul')[0];
		  addlilink(welcomess,'javascript:edit_summary_watch("{{subst:User:Bookofjude/Welcome}}  ~~~~", "Welcome to Wikipedia!", true, 1)','Welcome', '');
		  addlilink(welcomess,'javascript:edit_summary_watch("{{subst:Anon}}  ~~~~", "Welcome to Wikipedia!", true, 1)','Anon', '');
	// Test menu
		  addlimenu(talkm, 'Test[x]', 'testx');
		  var testx = document.getElementById('testx').getElementsByTagName('ul')[0];
		  addlilink(testx,'javascript:testn("nn-test")','Non-notable test', '');
		  addlilink(testx,'javascript:testn("test0")', 'Test0', '');
		  addlilink(testx,'javascript:testn("test1")', 'Test1', '');
		  addlilink(testx,'javascript:testn("test2")','Test2', '');
		  addlilink(testx,'javascript:testn("test2a")','Test2a', '');
		  addlilink(testx,'javascript:testn("test3")','Test3', '');
		  addlilink(testx,'javascript:testn("test4")','Test4', '');
		  addlilink(testx,'javascript:testn("User:Bookofjude/tpv1-n")','Talk page vandalism 1', '');
		  addlilink(testx,'javascript:edit_summary_watc("{{subst:wr}}  ~~~~", "Blanking your talk page", false, 1)', 'Warning blankings 1', '');
	// Blatant vandalism
		  addlimenu(talkm, 'Blatant vandalism', 'bv')
		  var bv = document.getElementById('bv').getElementsByTagName('ul')[0];
		  addlilink(bv,'javascript:testn("vw")','Blatant vandalism 1', '');
		  addlilink(bv,'javascript:testn("bv")','Blatant vandalism 2', '');
		  addlilink(bv,'javascript:edit_summary_watch("{{subst:blanking}}  ~~~~", "Blanking pages", false, 1)','blanking', '');
	// Spam
		  addlimenu(talkm, 'Spam', 'spam');
		  var spam = document.getElementById('spam').getElementsByTagName('ul')[0];
		  addlilink(spam,'javascript:edit_summary_watch("{{subst:spam1}}  ~~~~", "Adding links to Wikipedia", false, 1)','Spam1', '');
		  addlilink(spam,'javascript:edit_summary_watch("{{subst:spam2}}  ~~~~", "Spamming", false, 1)','Spam2', '');
		  addlilink(spam,'javascript:edit_summary_watch("{{subst:spam3}}  ~~~~", "Last warning for spamming", false, 1)','Spam3', '');
		  addlilink(spam,'javascript:edit_summary_watch("{{subst:spam4}}  ~~~~", "You have been blocked for spamming", false, 1)','Spam4', '');
	// Talk page messages
		  addlimenu(talkm, 'Talk messages', 'tkm');
		  var tkm = document.getElementById('tkm').getElementsByTagName('ul')[0];
		  addlilink(tkm,'javascript:edit_summary_watch("{{subst:Summary}}  ~~~~", "Edit summaries", false, 1)','Edit summary 1', '');
		  addlilink(tkm,'javascript:edit_summary_watch("{{subst:Mess2}}  ~~~~", "Messages in articles", false, 1)','Messages 1', '');
		  addlilink(tkm,'javascript:edit_summary_watch("{{subst:Comment2}}  ~~~~", "Messages in articles", false, 1)','Messages 2', '');
		  addlilink(tkm,'javascript:edit_summary_watch("{{subst:Comment3}}  ~~~~", "Messages in articles", false, 1)','Messages 3', '');
		  addlilink(tkm,'javascript:edit_summary_watch("{{subst:Vanity|}}  ~~~~", "About the page you created", false, 1)','Vanity', '');
		  addlilink(tkm,'javascript:edit_summary_watch("{{subst:nothanks|}}  ~~~~", "About your edits", false, 1)','nothanks', '');
		  addlilink(tkm,'javascript:edit_summary_watch("{{subst:nothanks-sd|pg=page name|url=url of source}}  ~~~~", "{{nothanks-sd}}", false, 1)','nothanks-sd', '');
		  addlilink(tkm,'javascript:rvfd(1)', 'rvfd', ''); 
	// Block messages
		  // addlilink(talkm,'javascript:duration(1)', 'Temp Block', ''); // added by [[User:Bookofjuded]]
		  // addlilink(talkm,'javascript:perm_name_block("{{s/block3|signature=~~~~}}", "You have been indefinitely blocked", true, 1)','Perm Block', ''); 
		  // addlilink(talkm,'javascript:perm_name_block("{{subst:nameblock}} ~~~~", "{{nameblock}}", true, 1)','Name Block', ''); 
		}
		else if(document.title.indexOf("Editing ") == 0)
		{
		   // addlilink(tabs, 'javascript:replace()', 'replace', '');
		   // addlilink(tabs, 'javascript:afdresult()', 'afd result', '');
		}
		else if(document.title.indexOf("Wikipedia:Articles for deletion") == 0)
		{
			addlilink(tabs, 'javascript:hideafd()', 'hide closed', 'ca-hide');
			ta['ca-hide'] = ['', 'Hide closed AFDs'];
			addlilink(tabs, 'javascript:showafd()', 'show closed', 'ca-show');
			ta['ca-show'] = ['', 'Show closed AFDs'];
		}
	}
	
	/**** Add links to the toolbox ****/
	
	function addToolBoxLinks()
	{
		if(document.title.indexOf("User:") == 0)
		{
		var tb = document.getElementById('p-tb').getElementsByTagName('ul')[0];
		addlilink(tb, '/wiki/Special:Ipblocklist', 'IPBlocklist', '');
		addlilink(tb, '/wiki/Wikipedia:Template messages/User_talk_namespace', 'Talk templates', '');
		addlilink(tb, '/wiki/Wikipedia:Template_messages', 'Templates', '');
		addlilink(tb, '/wiki/WP:CSD', 'SD criteria', '');
		//addlilink(tb, '/wiki/Special:Log/delete', 'Delete log', '');
		//addlilink(tb, '/wiki/Category:Wikipedia spam cleanup', 'Spam cleanup', '');
		username_a = document.URL.match(/:.*:(.*)/);
		username=username_a[1];
		addlilink(tb, 'http://www.math.ucla.edu/~aoleg/wp/rfa/edit_summary.cgi?user=' + username + '&lang=en', 'User\'s edit summary calculations');
		addlilink(tb, 'http://tools.wikimedia.de/~interiot/cgi-bin/count_edits?dbname=enwiki_p&user=' + username, 'User\'s edit count', '');
		var username=document.getElementById("pt-userpage").textContent;
		addlilink(tb, 'http://www.math.ucla.edu/~aoleg/wp/rfa/edit_summary.cgi?user=' + username + '&lang=en', 'My edit summary calculations');
		addlilink(tb, 'http://tools.wikimedia.de/~interiot/cgi-bin/count_edits?dbname=enwiki_p&user=' + username, 'My edit count', '');
		addlilink(tb, '/wiki/Special:Log', 'Log', '');
		addlilink(tb, '/wiki/Category:Requests for unblock', 'Unblock requests', '');
		}
	}
	
	/**** Add navigation bar links ****/
	
	function addNavBarLinks()
	{   
		var navbar = document.getElementById('p-navigation').getElementsByTagName('ul')[0];
		var afdtime = new Date();
		var months = ['January', 'February', 'March', 'April', 'May', 'June',
			'July', 'August', 'September', 'October', 'November', 'December'];
		addlilink(navbar, '/w/index.php?title=Special:Recentchanges&hidemyself=1&hideminor=1&hideliu=1', 'Recent changes 2', '');
		addlilink(navbar, '/wiki/Wikipedia:Articles_for_deletion/Log/' + afdtime.getUTCFullYear()
			+ '_' + months[afdtime.getUTCMonth()] + '_' + afdtime.getUTCDate(), 'Today\'s AfD', '');
		afdtime.setUTCDate(afdtime.getUTCDate() - 5);
		addlilink(navbar, '/wiki/Wikipedia:Articles_for_deletion/Log/' + afdtime.getUTCFullYear()
			+ '_' + months[afdtime.getUTCMonth()] + '_' + afdtime.getUTCDate(), '5-day-old AfD', '');
		var username=document.getElementById("pt-userpage").textContent;
	  //addlilink(navbar, '/w/index.php?title=User:' + username + '/Status&action=edit', 'Edit my status', '');
		addlilink(navbar, '/w/index.php?title=User:' + username + '/monobook.js&action=edit', 'My monobook.js', '');   
		addlilink(navbar, '/w/index.php?title=User:' + username + '/monobook.css&action=edit', 'My monobook.css', ''); 
		addlilink(navbar, '/wiki/User:Bookofjude/Sandbox', 'My sandbox', ''); 
	}
	
	
	/**** Auto start new topics when hitting empty talk pages from the content page ****/
	
	function talkpageplus()
	{
		var talkpagelink = document.getElementById('ca-talk');
		if (talkpagelink.className == 'new')
		{
			talkpagelink.firstChild.href += '&section=new';
		}
	}
	
	/**** Add history link to the "You have new messages" box ****/
	
	function newmessagehistory()
	{
		var divs = document.getElementsByTagName('div');
		var talkmessagebox;
		
		for(var x = 0; x < divs.length; ++x)
		{
			if(divs[x].className.indexOf('usermessage') != -1)
			{
				talkmessagebox = divs[x];
				x = divs.length; // force break
			}
		}
		
		divs = ''; // release divs?
		if(!talkmessagebox) return false;
		
		var newmessagelink = talkmessagebox.getElementsByTagName('a')[0];
		
		var historylink = document.createElement('a');
		historylink.href = newmessagelink.href.replace(/\/wiki\//, '/w/index.php?title=') + '&action=history';
		historylink.className = 'extiw';
		historylink.appendChild(document.createTextNode('changes'));
		
		// var talkmessagetext = 'You have ';
		// talkmessagebox.innerHTML = talkmessagetext;
		// talkmessagebox.appendChild(newmessagelink);
		talkmessagebox.appendChild(document.createTextNode(' ('));
		talkmessagebox.appendChild(historylink);
		talkmessagebox.appendChild(document.createTextNode(')'));
	}
	
	function addTab(url, name, id, title, key){ 
		var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
		addlilink(tabs, url, name, id, title, key);
	}
	
	// Adds a "blocklog" tab and fills in the username field on Special:Blockip, if a "&ip=username" is present.
	function do_blockip_stuff(){
		var form = document.getElementById('blockip');
		// focus on Reason field
		form.wpBlockReason.focus();
		var target = getParam('ip');
		if(target == '') return;
	
		// add "blocklog" tab
		addTab('/wiki/Special:Log/block?page=User:' + target, 'blocklog', 'ca-blocklog');
	}
	
	// Adds "block" and "blocklog" tabs to User: and User talk: pages.
	function add_block_tab(){
		var c1 = document.getElementById('column-one');
		var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
	
		// use the "edit this page" tab to get already-tidied url
		var editlk = document.getElementById('ca-edit').getElementsByTagName('a')[0].href;
		// cut everything up to "title=" from the start and everything past "&action=edit" from the end
		editlk = editlk.substring(editlk.indexOf('title=') + 6, editlk.lastIndexOf('&action=edit'));
		editlk = editlk.substring(editlk.indexOf(':') + 1);
		var slloc = editlk.indexOf('/');
		if(slloc > 0) editlk = editlk.substring(0, slloc);
	
		// add "block" tab
		// addTab('/wiki/Special:Blockip/' + editlk, 'block', 'ca-block');
	
		// add "blocklog" tab
		// addTab('/wiki/Special:Log/block?page=User:' + editlk, 'blocklog', 'ca-blocklog');
		addTab('/wiki/Special:Contributions/' + editlk, 'contributions', 'ca-contribs');
		addTab('http://192.168.0.64/rc.php?whitelist=' + editlk, 'whitelist');
		addTab('http://192.168.0.64/rc.php?blacklist=' + editlk, 'blacklist');
		
	}
	
	function do_recent_stuff(){
		var recent = document.getElementById('recent');
		recent.innerHTML += '<b>This is a test.</b>';
			xmlhttp = new HTTPClient();
			xmlhttp.open("GET", "http://www.google.com",true);
			xmlhttp.onreadystatechange=function() {
			 if (xmlhttp.readyState==4) {
			   var recent = document.getElementById('recent');
			   recent.innerHTML += xmlhttp.responseText;
			 }
			}
			xmlhttp.send(null)
	
	}
	
	function blockip()
	{
	  if(document.title.indexOf('User:') == 0 || document.title.indexOf('User talk:') == 0) 
		  add_block_tab();
	  else if(document.title.indexOf('Block user') == 0) // could stand to be more robust
		  do_blockip_stuff();
	  
	  if(document.title.indexOf('User:Bookofjude/Recentchanges') == 0)
		  do_recent_stuff();
	}
	
	function getParam(name){
		if(location.search){
			for(var x in location.search.substring(1).split('&')){
				var eq = x.indexOf('=');
				if(x.substring(0, eq) == name) return x.substring(eq + 1);
			}
		}
		return '';
	}
	
	
	function replace() {
		var s = prompt("Search regexp?");
		if(s) {
			var r = prompt("Replace regexp?");
			if(!r && r != '') return;
			var txt = document.editform.wpTextbox1;
			txt.value = txt.value.replace(new RegExp(s, "g"), r);
		}
	}
	
	addOnloadHook(function () {
		if(document.forms.editform) {
			addLink('p-cactions', 'javascript:replace()', 'replace', 'ca-replace', 'Regexp replace for the edit window', '', 'ca-history');
		}
	});
	function addLink(where, url, name, id, title, key, after){
		//* where is the id of the toolbar where the button should be added;
		//   i.e. one of "p-cactions", "p-personal", "p-navigation", or "p-tb".
		//
		//* url is the URL which will be called when the button is clicked.
		//   javascript: urls can be used to do more complex things.
		//
		//* name is what will appear as the name of the button.
		//
		//* id is the id of the button; it's best to define one.  
		//   Use a prefix to make sure its unique. Optional.
		//
		//* title is the tooltip title that gives a longer description 
		//   of the button; if you define a accesskey, mention it here. Optional.
		//
		//* key is the char you want for the accesskey. Optional.
		//
		//* after is the id of the button you want to follow this one. Optional.
		//
		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);
		var tabs = document.getElementById(where).getElementsByTagName('ul')[0];
		if(after) {
			tabs.insertBefore(li,document.getElementById(after));
		} else {
			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;
	}
		
	function addForceSummary()
	{
		if(!/&action=edit/.test(window.location.href) && !/&action=submit/.test(window.location.href)) return;
		if(/&section=new/.test(window.location.href)) return;
		if(!document.forms.editform) return;
		document.forms.editform.wpSave.onclick = forceSummary;
	}
	
	function forceSummary()
	{
		if(!document.forms.editform.wpSummary.value.replace(/^(?:\/\\*.*\\*\/)? *(.*) *$/,'$1'))
		{
			var r = prompt('Are you sure you want to submit without adding a summary?\nTo add a summary, type it in the box below:',document.forms.editform.wpSummary.value);
			if(r == null) { return false; }
			document.forms.editform.wpSummary.value = r;
		}
		return true;
	}
	
	addOnloadHook(addForceSummary);
	
	/* </nowiki></pre> */


function addToolboxLink(url, name, id){
    var tb = document.getElementById('p-tb').getElementsByTagName('ul')[0];
    addlilink(tb, url, name, id);
}

// 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.org/wiki/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"
];

namespaces[100] = "Portal";
namespaces[101] = "Portal 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(/^([0-9:]+), +([0-9]+) +([a-z]+) +([0-9]+)$/i);
	if (!matches) {
		//dump_text("XXX");			// for debugging
		return matches;
	}

	parseme = matches[3] + ", " + matches[2] + " "  + matches[4] + " " + matches[1] + ":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.org/wiki/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")[0];
  form.method = "get";
  form.action = document.location;

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

function generate_main_report() {
  fetch_data(params["username"].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[ namespaces[i] ] = 0;
	}
	namespace_numedits[""] = 0;
	for (var i=0; i<history.length; i++) {
		var h = history[i];
		unique_articles[  h["title"] ]++;
		namespace_numedits[  h["namespace"] ]++;
	}
	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["username"].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[ history.length-1 ]["date_text"] );

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

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



// ===================================== 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+)$/ )[0];
					}, request.responseText.match( offset_regexp ) );
				for (var i=0; i<matches.length; i++) {
					var v = matches[i] * 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[i].length;
	//alert("parsing " + page_list.length + " pages comprising " + total_len + " total bytes");

	var last_history_ent = [];
	last_history_ent["title"] = "";
	last_history_ent["oldid"] = "";

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

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

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

			//dump_object(history_entry);

			if (history_entry["title"] != last_history_ent["title"] || history_entry["oldid"] != last_history_ent["oldid"])
				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[prop] + "\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[oldOnload] = window.onload ? window.onload : function () {};
    window.onload = function() { addOnloadFunction[oldOnload]();  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[i].split("=");
    ret[values[0]] = unescape(values[1]);
  }
  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[i] = handler( list[i] );
    // ret.push( handler( list[i] ) );
  }
  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[1];
	} else {
		return "";
	}
}

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

// Filter changes live
// [[User:Lupin/recent2.js]] - please include this line
document.write('<script type="text/javascript" src="' 
             + 'http://en.wikipedia.org/w/index.php?title=User:Lupin/recent2.js' 
             + '&action=raw&ctype=text/javascript&dontcountme=s"></script>');

function externISBN() {
  for (var i = 0; i < document.links.length; i++) 
    {       
         var ln = document.links[i].href.match(/isbn=(.*)/);
         if (ln) {
           document.links[i].href='http://www.amazon.com/exec/obidos/ASIN/'+RegExp.$1;
         }
    }

}

$(externISBN);

// Useful stuff from [[Wikipedia:WikiProject_User_scripts]]

function addToolboxLink(url, name, id){
  var tb = document.getElementById('p-tb').getElementsByTagName('ul')[0];
  addlilink(tb, url, name, id);
}

function addlilink(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;
}

function addTab(url, name, id, title, key){
    var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
    addlilink(tabs, url, name, id, title, key);
}

function addPurge(){
    ta['ca-purge'] = ['g', 'Purge the internal cache for this page'];
    var x = document.getElementById('ca-history');
    if(!x) return;
    if(x.children) x = x.children[0].href;
    else x = x.childNodes[0].href;
    addTab(x.replace(/=history/, "=purge"), 'purge', 'ca-purge');
    akeytt();
}

// culled from [[User:Lupin/popups.js]]

function nichalp_articleFromURL(h) {
  if (typeof h != 'String') h=String(h);
  h=decodeURI(h);
  var m=RegExp('[^:]*://en\\.wikipedia\\.org/(wiki/|w/index\\.php\\?title=)([^&?]*)').exec(h);
  if(m===null) return null;
  return m[2];
}

function nichalp_isIpUser(user) {
  return 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])')
    .test(user);
}

function nichalp_removeAnchor(article) {
  // is there a #? if not, we're done
  var i=article.indexOf('#');
  if (i == -1) return article;
  return article.substring(0,i);
}

function nichalp_userName(article) {
  var i=article.indexOf('User');
  var j=article.indexOf(':');
  if  (i != 0 || j == -1) return null;
  var k=article.indexOf('/');
  if (k==-1) return article.substring(j+1);
  else return article.substring(j+1,k);
}

// do it

function nichalp_customLinks() {
  addPurge();
  var article=nichalp_articleFromURL(document.location.href);
  if (!article) return;
  var user=nichalp_userName(article);
  if(!user) return;
  user=nichalp_removeAnchor(user);
  if (!nichalp_isIpUser(user)) {
    addToolboxLink('http://kohl.wikimedia.org/~kate/cgi-bin/count_edits?dbname=enwiki&user='+user, user+"'s edit count", 'toolbox_katestool');
  }
  var special='http://en.wikipedia.org/w/index.php?title=Special:';
  addToolboxLink(special + 'Log&user='+user, user+"'s log", 'toolbox_userlog');
  addToolboxLink(special + 'Blockip&ip='+user, 'Block '+user, 'toolbox_blockuser'); 
  addToolboxLink(special + 'Special:Ipblocklist&action=unblock&ip='+user, 'Unblock '+user, 'toolbox_unblockuser'); 
}

// make it all happen on page load

if (window.addEventListener) window.addEventListener("load",nichalp_customLinks,false);
else if (window.attachEvent) window.attachEvent("onload",nichalp_customLinks);
else {
  window._old_nichalp_onload = window.onload;
  window.onload = function() { window._old_nichalp_onload();  nichalp_customLinks(); }
}

// 

// [[User:Dschwen/wikiminiatlas2.js]] - please include this line 
document.write('<script type="text/javascript" src="' 
     + 'http://en.wikipedia.org/w/index.php?title=User:Dschwen/wikiminiatlas2.js' 
     + '&action=raw&ctype=text/javascript&dontcountme=s"></script>');

// </nowiki></pre>

// Script from [[User:Lupin/editcount.js]]
document.write('<script type="text/javascript" src="' 
             + 'http://en.wikipedia.org/w/index.php?title=User:Lupin/editcount.js' 
             + '&action=raw&ctype=text/javascript&dontcountme=s"></s'+'cript>');
popupEditCounterTool='custom';
popupEditCounterUrl='http://en.wikipedia.org/wiki/User:$1?ectarget=$1';