User:RadioKirk~metawiki/monobook.js

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
//<pre><nowiki>

function inc (file) {
  var lt = String.fromCharCode(60);
  var gt = String.fromCharCode(62);
  document.writeln(lt+'script type="text/javascript" src="/w/index.php?title='+file+'&action=raw&ctype=text/javascript"'+gt+lt+'/script'+gt);
}

inc("User:Lightdarkness/aiv.js");

// Godmode-lite (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>');

// Filter changes live
loadJS('[[User:RadioKirk/recent2.js]]');

// Show diffs on recent changes, history pages and so on
loadJS('[[User:RadioKirk/recentdiffs.js]]');

var isIE=((self.navigator.appName).indexOf("Microsoft")!=-1);
if (!isIE) loadJS('[[User:Zocky/PicturePopups.js]]');

//loadJS('[[User:Zocky/CategoryBrowser.js]]');

loadJS('[[User:RadioKirk/popupsdev.js]]');
popupAdminLinks=true; popupShortcutKeys=true; popupFixDabs=true;
popupPreviewKillTemplates=false; popupPreviewFirstParOnly=false;
popupOnlyArticleLinks=false;
popupEditCounterTool='interiot';
popupExtraUserMenu='<line><<monobook|shortcut=M>>|<<editMonobook|edit>></line>';
popupFixRedirs=true;

//popupLiveOptions=true;

// loadJS('[[User:RadioKirk/editblind.js]]');

loadJS('[[User:RadioKirk/sectionkeys.js]]');
$(function(){window.popupShortcutKeys=true;}); // for testing

if (location.href == "http://en.wikipedia.org/wiki/User:Jitse_Niesen/Client-side_preferences") loadJS('[[User:Jitse_Niesen/Client-side_preferences/Main.js]]'); 

/////////////////////////
// messy stuff
/////////////////////////

$(function(){if (/Special(%3[Aa]|:)(Newpages|Recentchanges)/.test(document.referrer)) document.getElementsByTagName('h1')[0].innerHTML += ' - <a href="http://www.google.com/search?q=' + document.title.split(' - ')[0].split(' ').join('+') + '">FGI</a>';});


function addRefsLinks(btn) {
  var pageTitle=document.getElementsByTagName('h1')[0].innerHTML;
  var lks=document.links;
  var refReq=refsContent(pageTitle);
  for (var i=0; i<lks.length; ++i) {
    var article=articleFromURL(lks[i].href);
    if(!article) continue;
    var talk=null;
    if (!userName(article)) continue;
    talk=talkPage(article);
    if(!talk) continue;
    var a=document.createElement('a');
    a.href=titlebase + talk +
      '&action=edit&autoedit=s#$#\n' + refReq + ' ~~~~#&autoclick=' +
      btn + 
      '&autosummary=References for [['+
      pageTitle+
      ']]';
    var tt=document.createTextNode(' . . ');
    a.innerHTML='request references';
    lks[i].parentNode.appendChild(tt);
    lks[i].parentNode.appendChild(a);
  }
}
function refsContent(pageTitle) {
  var refRequests=['\\n\\n{{subst:unref-talk|%s}}',
    '\\n\\n==Missing refs==\\n\\nHi! I noticed that [[%s]] doesn\'t seem to have any refs, and you\'ve written a fair bit of it. Please could you add some when you get a chance? Thanks!',
    '\\n\\n==Refs?==\\n\\nHello, any chance of adding refs to [[%s]]? Cheers,',
    '\\n\\n==References for [[%s]]==\\n\\nHowdy. Do you remember the references you used when you wrote [[%s]]? If you could add them in, it\'d improve the article. Thanks in advance,',
    '\\n\\n==References needed==\\n\\nHello, I\'d like to verify [[%s]] but have no references. Please could you add the sources you used to write the article? Cheers,',
    '\\n\\n==References==\\n\\nHello! I noticed that [[%s]] doesn\'t have any references or sources. Although the contents of that article do seem like "common knowledge", it would still be helpful if you could mention your sources. Many thanks,',
    '\\n\\n==[[%s]]==\\n\\n...is unsourced. Please fix. Thanks,',
    '\\n\\n==References for [[%s]]==\\n\\nHi! I realise that it\'s been some time since you edited [[%s]], but it would be great if you could remember the references you used and add them to the page. Thanks!'
  ];
  var promptText='Select reference request:';
  for (var i=0; i<refRequests.length; ++i) { promptText += '\n\n'+i+': '+ refRequests[i];}
  var response=parseInt(prompt(promptText));
  if(!response || isNaN(response) || response >= refRequests.length || response < 0) response=0;
  return refRequests[response].split('%s').join(pageTitle);
}

var refs=addRefsLinks;

//ta['search'] = ['/','Search this wiki'];
//addOnloadFunction(function(){document.getElementById('searchInput').accessKey='/';});

function removeAccessKeys(keylist) {
  var t=document.getElementsByTagName('A'), u=document.getElementsByTagName('input');
  for (var i=0; i<t.length+u.length; ++i) {
    var s=((i<t.length) ? t[i] : u[i-t.length]);
    for (var j=0; j<keylist.length; ++j) if (s.accessKey==keylist[j]) s.accessKey='';
  }
};

function removeAnnoyingKeys() {removeAccessKeys(['d','f']);}
addOnloadFunction(removeAnnoyingKeys);


function fixWatchlistLink () {
  for (var i=0; i<document.links.length; ++i) {
    if (document.links[i].href.indexOf('Special:Watchlist')>0) {
      document.links[i].href+='?hideOwn=1';
      break;
    }
  }
};

if (!isIE)
{
  addOnloadFunction(fixWatchlistLink);
}

// summary nag

function perhapsSave(ev)
{
   var sum = document.getElementsByName('wpSummary');
   var submit = true;
   if (sum.length > 0) {
      sum = sum[0];
      if (isBadSummary(sum.value)) {
         if (!document.getElementById('jn-fillIn')) {
            var div = document.createElement('p');
            div.appendChild(document.createTextNode('Fill in the summary!'));
            div.setAttribute('style', 'color: #f00; font-size: 150%;');
            div.id = 'jn-fillIn';
            sum.parentNode.insertBefore(div, sum.nextSibling);
         }
         sum.focus();
         submit = false;
      }
   }
   if (submit) {
      var btn = document.getElementById('wpSave');
      btn.onclick = null;
      btn.setAttribute('type', 'submit');
      btn.click();
   }
}

function isBadSummary(str) {
  var sumRe=RegExp('^ *$|^/[*].*?[*]/ *$');
  return (sumRe.test(str));
}

////////////////////////////////////////////////////////////////
// Evaluator
// Source: http://krolik.net/js-eval.shtml

var evaluatorHTML='<FORM ID="Tester" NAME="Tester" onsubmit="return TesterExecute();" >' +
  '<TEXTAREA NAME="MyCommand" COLS=60 ROWS=25 WRAP="off"></TEXTAREA>' +
  '<TEXTAREA NAME="MyResult" COLS=40 ROWS=25 WRAP="off"></TEXTAREA>' + 
  '<BR>' + 
  '<INPUT TYPE=BUTTON value="Show Object" onclick="ObjectDumpClicked();" >' + 
  '<INPUT TYPE=BUTTON value="Execute" onclick="TesterExecute();">' + 
  '</FORM>';

function ObjectDump(strObject) 
{
  var strOutput; 
  var vTemp; 
  var vAnotherTemp; 
  var vElement;
  vElement = eval(strObject); 
  strOutput = "typeof = " + typeof(vElement) + "\n\n";
  AppendOutput(strOutput);
  for (var x in vElement )  
  { 
   vTemp = strObject + "." + x.toString() ; 
   vAnotherTemp = strObject + "[" + x + "]" ; 
   strOutput = strOutput + vTemp + " = " + eval(vTemp) + "\n";
   AppendOutput(vTemp + " = " + eval(vTemp) + "\n");
  } 
  return strOutput ;  
 } 
 function AppendOutput(strText)
 {
  document.Tester.MyResult.value = document.Tester.MyResult.value + strText;
 }
 function Output(strText)
 {
  document.Tester.MyResult.value = strText;
 }
 function ObjectDumpClicked() 
 {
  document.Tester.MyResult.value="";
  ObjectDump(document.Tester.MyCommand.value); 
  return false;
 }
 function TesterExecute() 
 {       
  document.Tester.MyResult.value="";
  document.Tester.MyResult.value=eval(document.Tester.MyCommand.value); 
  return false;
 }

function addEvaluator() {
  try { 
    var evalNode=document.createElement('div');
    evalNode.id='evalNode';
    evalNode.innerHTML=evaluatorHTML;
    document.body.appendChild(evalNode);
    document.Tester=document.getElementById('Tester'); 
  }
  catch(err){};
}

if(!isIE || true) addOnloadFunction(addEvaluator);

//
// end evaluator
////////////////////////////////////////////////////////////////


// testing 
// 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:RadioKirk/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(); }
}

function addOnloadFunction (f) {
  if (window.addEventListener) window.addEventListener("load",f,false);
  else if (window.attachEvent) window.attachEvent("onload",f);
};

window.focusTextBox=function(exclusions) {
  var editBox=document.getElementById('wpTextbox1');
  if (editBox) { editBox.focus(); return; }
  var inputs=document.getElementsByTagName('input');
  if(!exclusions) exclusions=[];
  for (var i=0; i<inputs.length; ++i) {
    if(inputs[i].type=='text' && inputs[i].name) {
      var ignore=false;
      for (var j=0; j<exclusions.length; ++j) { 
        if (inputs[i].name==exclusions[j]) {ignore=true; break;} 
      }
      if(!ignore) {inputs[i].focus(); return;}
    }
  }
}
//addOnloadFunction(function() { if (document.title.indexOf('Preview') == -1) //focusTextBox(['wpSummary', 'search']);});

function loadJS(page){
  page=page.replace(/^\[\[(.*)\]\]$/, '$1');
  document.write('<script type="text/javascript" src="' +
                 'http://en.wikipedia.org/w/index.php?title=' + page +
                 '&action=raw&ctype=text/javascript"></script>');
}


/*
</nowiki></pre>
//<pre><nowiki>

// Filter changes live
loadJS('[[User:RadioKirk/recent2.js]]');

// Show diffs on recent changes, history pages and so on
loadJS('[[User:RadioKirk/recentdiffs.js]]');

var isIE=((self.navigator.appName).indexOf("Microsoft")!=-1);
if (!isIE) loadJS('[[User:Zocky/PicturePopups.js]]');

//loadJS('[[User:Zocky/CategoryBrowser.js]]');

loadJS('[[User:RadioKirk/popupsdev.js]]');
popupAdminLinks=true; popupShortcutKeys=true; popupFixDabs=true;
popupPreviewKillTemplates=false; popupPreviewFirstParOnly=false;
popupOnlyArticleLinks=false;
popupEditCounterTool='interiot';
popupExtraUserMenu='<line><<monobook|shortcut=M>>|<<editMonobook|edit>></line>';
popupFixRedirs=true;

//popupLiveOptions=true;

// loadJS('[[User:RadioKirk/editblind.js]]');

loadJS('[[User:RadioKirk/sectionkeys.js]]');
$(function(){window.popupShortcutKeys=true;}); // for testing

if (location.href == "http://en.wikipedia.org/wiki/User:Jitse_Niesen/Client-side_preferences") loadJS('[[User:Jitse_Niesen/Client-side_preferences/Main.js]]'); 

/////////////////////////
// messy stuff
/////////////////////////

$(function(){if (/Special(%3[Aa]|:)(Newpages|Recentchanges)/.test(document.referrer)) document.getElementsByTagName('h1')[0].innerHTML += ' - <a href="http://www.google.com/search?q=' + document.title.split(' - ')[0].split(' ').join('+') + '">FGI</a>';});


function addRefsLinks(btn) {
  var pageTitle=document.getElementsByTagName('h1')[0].innerHTML;
  var lks=document.links;
  var refReq=refsContent(pageTitle);
  for (var i=0; i<lks.length; ++i) {
    var article=articleFromURL(lks[i].href);
    if(!article) continue;
    var talk=null;
    if (!userName(article)) continue;
    talk=talkPage(article);
    if(!talk) continue;
    var a=document.createElement('a');
    a.href=titlebase + talk +
      '&action=edit&autoedit=s#$#\n' + refReq + ' ~~~~#&autoclick=' +
      btn + 
      '&autosummary=References for [['+
      pageTitle+
      ']]';
    var tt=document.createTextNode(' . . ');
    a.innerHTML='request references';
    lks[i].parentNode.appendChild(tt);
    lks[i].parentNode.appendChild(a);
  }
}
function refsContent(pageTitle) {
  var refRequests=['\\n\\n{{subst:unref-talk|%s}}',
    '\\n\\n==Missing refs==\\n\\nHi! I noticed that [[%s]] doesn\'t seem to have any refs, and you\'ve written a fair bit of it. Please could you add some when you get a chance? Thanks!',
    '\\n\\n==Refs?==\\n\\nHello, any chance of adding refs to [[%s]]? Cheers,',
    '\\n\\n==References for [[%s]]==\\n\\nHowdy. Do you remember the references you used when you wrote [[%s]]? If you could add them in, it\'d improve the article. Thanks in advance,',
    '\\n\\n==References needed==\\n\\nHello, I\'d like to verify [[%s]] but have no references. Please could you add the sources you used to write the article? Cheers,',
    '\\n\\n==References==\\n\\nHello! I noticed that [[%s]] doesn\'t have any references or sources. Although the contents of that article do seem like "common knowledge", it would still be helpful if you could mention your sources. Many thanks,',
    '\\n\\n==[[%s]]==\\n\\n...is unsourced. Please fix. Thanks,',
    '\\n\\n==References for [[%s]]==\\n\\nHi! I realise that it\'s been some time since you edited [[%s]], but it would be great if you could remember the references you used and add them to the page. Thanks!'
  ];
  var promptText='Select reference request:';
  for (var i=0; i<refRequests.length; ++i) { promptText += '\n\n'+i+': '+ refRequests[i];}
  var response=parseInt(prompt(promptText));
  if(!response || isNaN(response) || response >= refRequests.length || response < 0) response=0;
  return refRequests[response].split('%s').join(pageTitle);
}

var refs=addRefsLinks;

//ta['search'] = ['/','Search this wiki'];
//addOnloadFunction(function(){document.getElementById('searchInput').accessKey='/';});

function removeAccessKeys(keylist) {
  var t=document.getElementsByTagName('A'), u=document.getElementsByTagName('input');
  for (var i=0; i<t.length+u.length; ++i) {
    var s=((i<t.length) ? t[i] : u[i-t.length]);
    for (var j=0; j<keylist.length; ++j) if (s.accessKey==keylist[j]) s.accessKey='';
  }
};

function removeAnnoyingKeys() {removeAccessKeys(['d','f']);}
addOnloadFunction(removeAnnoyingKeys);


function fixWatchlistLink () {
  for (var i=0; i<document.links.length; ++i) {
    if (document.links[i].href.indexOf('Special:Watchlist')>0) {
      document.links[i].href+='?hideOwn=1';
      break;
    }
  }
};

if (!isIE)
{
  addOnloadFunction(fixWatchlistLink);
}

// summary nag

function perhapsSave(ev)
{
   var sum = document.getElementsByName('wpSummary');
   var submit = true;
   if (sum.length > 0) {
      sum = sum[0];
      if (isBadSummary(sum.value)) {
         if (!document.getElementById('jn-fillIn')) {
            var div = document.createElement('p');
            div.appendChild(document.createTextNode('Fill in the summary!'));
            div.setAttribute('style', 'color: #f00; font-size: 150%;');
            div.id = 'jn-fillIn';
            sum.parentNode.insertBefore(div, sum.nextSibling);
         }
         sum.focus();
         submit = false;
      }
   }
   if (submit) {
      var btn = document.getElementById('wpSave');
      btn.onclick = null;
      btn.setAttribute('type', 'submit');
      btn.click();
   }
}

function isBadSummary(str) {
  var sumRe=RegExp('^ *$|^/[*].*?[*]/ *$');
  return (sumRe.test(str));
}

function modifySaveButton()
{
   // action=edit for edit pages, action=submit for previews
   var loc=window.location.href;
   if ((loc.indexOf('&action=edit') != -1 || 
        loc.indexOf('&action=submit') != -1
       ) && loc.indexOf(':RadioKirk') == -1 ) {
      var btn = document.getElementById('wpSave');
      btn.setAttribute('type', 'button');
      btn.onclick = perhapsSave;
   }
}

if(!isIE) addOnloadFunction(modifySaveButton);



////////////////////////////////////////////////////////////////
// Evaluator
// Source: http://krolik.net/js-eval.shtml

var evaluatorHTML='<FORM ID="Tester" NAME="Tester" onsubmit="return TesterExecute();" >' +
  '<TEXTAREA NAME="MyCommand" COLS=60 ROWS=25 WRAP="off"></TEXTAREA>' +
  '<TEXTAREA NAME="MyResult" COLS=40 ROWS=25 WRAP="off"></TEXTAREA>' + 
  '<BR>' + 
  '<INPUT TYPE=BUTTON value="Show Object" onclick="ObjectDumpClicked();" >' + 
  '<INPUT TYPE=BUTTON value="Execute" onclick="TesterExecute();">' + 
  '</FORM>';

function ObjectDump(strObject) 
{
  var strOutput; 
  var vTemp; 
  var vAnotherTemp; 
  var vElement;
  vElement = eval(strObject); 
  strOutput = "typeof = " + typeof(vElement) + "\n\n";
  AppendOutput(strOutput);
  for (var x in vElement )  
  { 
   vTemp = strObject + "." + x.toString() ; 
   vAnotherTemp = strObject + "[" + x + "]" ; 
   strOutput = strOutput + vTemp + " = " + eval(vTemp) + "\n";
   AppendOutput(vTemp + " = " + eval(vTemp) + "\n");
  } 
  return strOutput ;  
 } 
 function AppendOutput(strText)
 {
  document.Tester.MyResult.value = document.Tester.MyResult.value + strText;
 }
 function Output(strText)
 {
  document.Tester.MyResult.value = strText;
 }
 function ObjectDumpClicked() 
 {
  document.Tester.MyResult.value="";
  ObjectDump(document.Tester.MyCommand.value); 
  return false;
 }
 function TesterExecute() 
 {       
  document.Tester.MyResult.value="";
  document.Tester.MyResult.value=eval(document.Tester.MyCommand.value); 
  return false;
 }

function addEvaluator() {
  try { 
    var evalNode=document.createElement('div');
    evalNode.id='evalNode';
    evalNode.innerHTML=evaluatorHTML;
    document.body.appendChild(evalNode);
    document.Tester=document.getElementById('Tester'); 
  }
  catch(err){};
}

if(!isIE || true) addOnloadFunction(addEvaluator);

//
// end evaluator
////////////////////////////////////////////////////////////////


// testing 
// 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:RadioKirk/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(); }
}

function addOnloadFunction (f) {
  if (window.addEventListener) window.addEventListener("load",f,false);
  else if (window.attachEvent) window.attachEvent("onload",f);
};

window.focusTextBox=function(exclusions) {
  var editBox=document.getElementById('wpTextbox1');
  if (editBox) { editBox.focus(); return; }
  var inputs=document.getElementsByTagName('input');
  if(!exclusions) exclusions=[];
  for (var i=0; i<inputs.length; ++i) {
    if(inputs[i].type=='text' && inputs[i].name) {
      var ignore=false;
      for (var j=0; j<exclusions.length; ++j) { 
        if (inputs[i].name==exclusions[j]) {ignore=true; break;} 
      }
      if(!ignore) {inputs[i].focus(); return;}
    }
  }
}
//addOnloadFunction(function() { if (document.title.indexOf('Preview') == -1) //focusTextBox(['wpSummary', 'search']);});

function loadJS(page){
  page=page.replace(/^\[\[(.*)\]\]$/, '$1');
  document.write('<script type="text/javascript" src="' +
                 'http://en.wikipedia.org/w/index.php?title=' + page +
                 '&action=raw&ctype=text/javascript"></script>');
}

/*
</nowiki></pre>
*/