User:SysRq/uncyclopedia.js

From Uncyclopedia, the content-free encyclopedia
Jump to navigation Jump to search

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

  • Internet Explorer: hold down the Ctrl key and click the Refresh or Reload button, or press Ctrl+F5.
  • Firefox: hold down the Shift key while clicking Reload; alternatively press Ctrl+F5 or Ctrl-Shift-R.
  • Opera, Konqueror and Safari users can just click the Reload button.
  • Chrome: press Ctrl+F5 or Shift+F5
// <nowiki>
var disableUsernameReplace = true;

// <nowiki>

//Doesn't work:
//document.write('<script type="text/javascript" src="' 
//   + 'http://en.uncyclopedia.co/w/index.php?title=User:Volte/jumpdown.js' 
//   + '&action=raw&ctype=text/javascript&dontcountme=s"><' + '/script>');

document.write('<script type="text/javascript" src="http://en.uncyclopedia.co/w/index.php?title=User:Strange but untrue/xpath.js&action=raw&ctype=text/javascript&dontcountme=s"><' + '/script>');

// Functions to run when the document loads:

window.onload = Main;
function Main() {
    addactions();
    changeactions();
    addtoolbox();
    changetoolbox();
    addnavbox();
    changenavbox();
    addpersonal();
    changepersonal();
//    changekeys();
    addRevert(); //Add a "Revert To Here" link to every diff page
    addHistoryEdit(); //Add "edit" links to the history page to provide a way to directly edit each revision
    setEditForm(); //Automate the submission of forms by auto-filling textboxes and auto-pushing buttons
//    flagUsers(); //Flag users on Recent Changes
//    addRecentContribs(); //In the Recent Changes page, add 'contribs' link to each user
}

//---------------------------
//Called from onload:

// useful changable things: 'p-personal' 'p-logo' 'p-nav' 'p-search' 'p-tbx' 'p-lang' 'p-cactions'

// functions to pick and order additional action links

function addactions() {
    addgoogle();
    addenwp();
    addlog();
    addredir();
    addVFD();
    addICU();
    addlogstatuser();
}

// change the name and function of action buttons

function changeactions() {
//    document.getElementById('ca-edit').firstChild.innerHTML = 'edit page';
//    document.getElementById('ca-history').childNodes[0].href = 'http://www.google.com';
}

// add to the toolbox

function addtoolbox() {
     var tb = document.getElementById('p-tb').getElementsByTagName('ul')[0];
     addlilink(tb, '/wiki/Special:Shortpages', 'Short pages', 't-short');
     addlilink(tb, '/wiki/Special:Newpages', 'New pages', 't-new');
}

// change the name and function of toolbox links

function changetoolbox() {
//    document.getElementById('t-upload').firstChild.innerHTML = 'google';
//    document.getElementById('t-upload').childNodes[0].href = 'http://www.google.com';
}

// add to the navigation box

function addnavbox() {
//    var tb = document.getElementById('p-nav').getElementsByTagName('ul')[0];
//    addlilink(tb, 'http://www.google.com/', 'google', 'p-google');
}

// change the name and function of navigation box links

function changenavbox() {
    document.getElementById('n-portal').firstChild.innerHTML = 'VFD';
    document.getElementById('n-portal').childNodes[0].href = 'http://en.uncyclopedia.co/wiki/Uncyclopedia:Votes for deletion';
    document.getElementById('n-help').firstChild.innerHTML = 'QVFD';
    document.getElementById('n-help').childNodes[0].href = 'http://en.uncyclopedia.co/wiki/Uncyclopedia:QuickVFD';
}

// add to the personal links

function addpersonal() {
//    var tb = document.getElementById('p-personal').getElementsByTagName('ul')[0];
//    addlilink(tb, 'http://www.google.com/', 'google', 't-personalgoogle');
}

// change the name and function of personal links

function changepersonal() {
    if(!document.getElementById) return;
    document.getElementById('pt-mytalk').firstChild.innerHTML = 'tlak';
    document.getElementById('pt-mytalk').childNodes[0].href = '/index.php?title=User_talk:SysRq';
    document.getElementById('pt-preferences').firstChild.innerHTML = 'prefs';
    document.getElementById('pt-watchlist').firstChild.innerHTML = 'the watchman';
    document.getElementById('pt-mycontris').childNotes[0].href = 
'http://en.uncyclopedia.co/wiki/User:SysRq/werks';
    document.getElementById('pt-mycontris').firstChild.innerHTML = 'werks';
    document.getElementById('pt-logout').childNodes[0].href = 'http://en.uncyclopedia.co/w/index.php?limit=50&title=Special%3AContributions&contribs=newbie&target=SysRq&namespace=&year=&month=-1';
    document.getElementById('pt-logout').firstChild.innerHTML = 'noobs';
}

function addRevert() {
    if(!queryString("diff")) return;
	
    var xp_link = document.evaluate("//a[starts-with(., 'Revision')]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
    if (!xp_link) return;
	
    var link = xp_link.singleNodeValue;
    
    var xp_name1 = document.evaluate("/descendant::a[.='Talk'][1]/preceding-sibling::a", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
    if (!xp_name1) return;
    
    var xp_name2 = document.evaluate("/descendant::a[.='Talk'][2]/preceding-sibling::a", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
    if (!xp_name2) return;
    
    var name1 = xp_name1.singleNodeValue;
    var name2 = xp_name2.singleNodeValue;

    var linkSpan = document.createElement("span");
    var revertLink = document.createElement("a");
    var summaryText = "Reverted edit of [[Special:Contributions/" + name2.textContent + "|" + name2.textContent + "]] to previous one by " + name1.textContent

    linkSpan.innerHTML = "&nbsp;&nbsp;";

    revertLink.innerHTML = "[Revert to here]";
    revertLink.href = link.href + "&action=edit&setsubmit=wpSave&setsummary=" + summaryText + "&setwatch=0";

    insertAfter(link.parentNode, linkSpan, link);
    insertAfter(link.parentNode, revertLink, linkSpan);
}

function addHistoryEdit() {
    var pageHistory = document.getElementById('pagehistory');
    if (!pageHistory) return;

    var links = document.evaluate("//li[input[@type='radio']]", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); 
    var xp_name1 = document.evaluate("//li[input[@type='radio']][1]/descendant::a[last()]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
    if (!xp_name1) return;
  
    var name1 = xp_name1.singleNodeValue;
    var curLink;
    var i;
  
    for (i = 0; i < links.snapshotLength; i++) {
        var n = i + 1;
        curLink = links.snapshotItem(i);
    
        var xp_name2 = document.evaluate("//li[input[@type='radio']][" + n + "]/descendant::input/following::a[2]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);  
        if (!xp_name2) return;
    
        var xp_link = document.evaluate("//li[input[@type='radio']][" + n + "]/descendant::input/following::a[1]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);  
        if (!xp_link) return;
    
        var name2 = xp_name2.singleNodeValue;
        var link = xp_link.singleNodeValue;
	
        if (i == 0) {
            curLink.innerHTML = '(edit) ' + curLink.innerHTML;
        } else {
            curLink.innerHTML = '(<span class="plainlinks"><a href="' + link.href + '&action=edit&setwatch=0&setsummary=Reverted edit of [[User:' + name1.textContent + '|' + name1.textContent + ']] to previous version by ' + name2.textContent + '">edit</a></span>) ' + curLink.innerHTML;
        }
    } 
}

function setEditForm() {
    var editform = document.getElementById("editform");
    if (!editform) return;
    
    var summaryText = queryString('setsummary');
    if (summaryText) {
        var summary = document.getElementsByName("wpSummary")[0];
        if (summary) summary.value = summaryText;
    }
    
    var setMinor = queryString('setminor');
    if (setMinor) {
    var minor = document.getElementById("wpMinoredit");
    if (minor) minor.checked = (setMinor == '1');
    }
    
    var setWatch = queryString('setwatch');
    if (setWatch) {
        var watch = document.getElementById("wpWatchthis");
        if (watch) watch.checked = (setWatch == '1');
    }
    
    var setSubmit = queryString('setsubmit');
    if (setSubmit) {
        var btn = document.getElementById(setSubmit);
        
        if (document.getElementById("editform") && btn) {
            btn.textContent += " (auto clicking...)";
            btn.click();
        }
    }
}

/*
// change various shortcut keys

function changekeys() {
    ta['ca-google'] = ['g', 'Google search this topic'];
    ta['ca-enwp'] = ['`', 'Check the English Wikipædia for this topic'];
    ta['ca-ICU'] = ['n', 'Tag with ICU'];
    ta['ca-redir'] = ['r', 'Turn page into a redirect'];
    ta['ca-purge'] = ['p', 'Purge the internal cache for this page'];
    ta['pt-logout'] = ['Ü', 'Log out'];
    ta['t-contributions'] = ['a', 'User contributions'];
    ta['t-parole'] = ['', 'My list of users to watch'];
    ta['t-blocks'] = ['', 'All blocks'];
    ta['ca-userlogs'] = ['u', 'All Special:Logs which the user has performed'];
    ta['ca-userstatus'] = ['s', 'All Special:Logs which the user was the target'];
    akeytt();
}
*/
//---------------------------------
//Addactions functions:


function addlog() {
    if(document.title.indexOf("Editing") != 0) {
    if(!document.getElementById) return;
    var x = document.getElementById('ca-history');
    var y = document.getElementById('ca-edit');
    var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
    if((!x)&&(!y)) return;
    addlilink(tabs, "\/index.php?title=Special%3ALog/&type=&user=&page=" + document.getElementsByTagName('h1')[0].firstChild.nodeValue, 'Page log', 'ca-log');
    }
}

// adds a google search link for the title of 'normal' pages

function addgoogle() {
    if(document.title.indexOf("Editing") != 0) {
    if(!document.getElementById) return;
    var x = document.getElementById('ca-history');
    var y = document.getElementById('ca-edit');
    var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
    if((!x)&&(!y)) return;
    addlilink(tabs, "http://www.google.com/search?q=%22"+ document.getElementsByTagName('h1')[0].firstChild.nodeValue +"%22", 'google', 'ca-google');

    }
}

// adds a wikipedia link for the title of 'normal' pages

function addenwp() {
    if(document.title.indexOf("Editing") != 0) {
    if(!document.getElementById) return;
    var x = document.getElementById('ca-history');
    var y = document.getElementById('ca-edit');
    var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
    if((!x)&&(!y)) return;
    addlilink(tabs, "http://en.wikipedia.org/wiki/Special:Search?search="+ document.getElementsByTagName('h1')[0].firstChild.nodeValue +"&go=Go", 'en.wp', 'ca-enwp');

    }
}

// a javascript button (the javascript is a template append macro)

function addredir() {
    var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
    if(document.title.indexOf("Editing") == 0) addlilink(tabs, 'javascript:redir()', 'redirect', 'ca-redir');
}

function addVFD() {
    var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
    if(document.title.indexOf("Editing") == 0) addlilink(tabs, 'javascript:VFD()', 'VFD', 'ca-VFD');
}

function addICU() {
    var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
    if(document.title.indexOf("Editing") == 0) addlilink(tabs, 'javascript:ICU()', 'ICU', 'ca-ICU');
}

// add 'user logs' (non-edit actions) and 'status' (rights/bans) to Special:Contribs pages (both wiki and index)

function addlogstatuser() {
    if(!document.getElementById) return;
    if(!document.title.indexOf("User contributions") == 0) return;
    var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
    if(document.location.href.indexOf("\/Special:Contributions\/") == -1) addlilink(tabs, "\/index.php?title=Special%3ALog&type=&page=&user=" + document.location.href.substring(document.location.href.indexOf("target=")+7), 'user logs', 'ca-userlogs'); 
    else addlilink(tabs, "\/index.php?title=Special%3ALog&type=&page=&user=" + document.location.href.substring(document.location.href.indexOf("Special:Contributions\/")+22), 'user logs', 'ca-userlogs'); 
    if(document.location.href.indexOf("\/Special:Contributions\/") == -1) addlilink(tabs, "\/index.php?title=Special%3ALog&type=&user=&page=User:" + document.location.href.substring(document.location.href.indexOf("target=")+7), 'status', 'ca-userstatus'); 
    else addlilink(tabs, "\/index.php?title=Special%3ALog&type=&user=&page=User:" + document.location.href.substring(document.location.href.indexOf("Special:Contributions\/")+22), 'status', 'ca-userstatus'); 
}

// -------------------------------------
// Functions within functions...

function ICU() {
    document.editform.wpSummary.value = '+ICU. Seven days. The clock is ticking...';
    document.editform.wpMinoredit.checked = true;
    document.editform.wpWatchthis.checked = true;
    var txt = document.editform.wpTextbox1;
    if(txt.value.length > 0) txt.value += '\n';
    txt.value += '{{ICU|~~~~~}}';
    document.editform.wpSave.click();
}

function VFD() {
    document.editform.wpSummary.value = '+VFD. Kill or save [[Uncyclopedia:Votes_for_deletion|here]].';
    document.editform.wpMinoredit.checked = true;
    document.editform.wpWatchthis.checked = false;
    var txt = document.editform.wpTextbox1;
    if(txt.value.length > 0) txt.value = '{{VFD}} \n' + txt.value;
    document.editform.wpSave.click();
}

function deadend() {
    document.editform.wpSummary.value = '+deadend. Please add some much-vaunted links to other articles';
    document.editform.wpMinoredit.checked = true;
    document.editform.wpWatchthis.checked = false;
    var txt = document.editform.wpTextbox1;
    if(txt.value.length > 0) txt.value += '\n';
    txt.value += '{{deadend}}';
    document.editform.wpSave.click();
}

function hatehate() {
    document.editform.wpSummary.value = '+{{ugly}}. Needs work for the presentation.';
    document.editform.wpMinoredit.checked = true;
    document.editform.wpWatchthis.checked = false;
    var txt = document.editform.wpTextbox1;
    if(txt.value.length > 0) txt.value += '\n';
    txt.value += '{{ugly}}';
    document.editform.wpSave.click();
}

function redir() {
    var pagetitle = document.getElementsByTagName('h1')[0].firstChild.nodeValue;
    pagetitle = pagetitle.substring(pagetitle.indexOf("Editing ")+8);
    document.editform.wpSummary.value = 'Redirecting';
    document.editform.wpMinoredit.checked = true;
    document.editform.wpWatchthis.checked = false;
    var txt = document.editform.wpTextbox1;
    if(txt.value.length > 0) txt.value += '\n';
    txt.value = '#REDIRECT:[[' + pagetitle + ']]';
    // comment out the following two lines if not using mozilla (too lazy to make it work in IE)
    txt.selectionStart=12;   
    txt.selectionEnd=pagetitle.length+12;
    document.editform.wpTextbox1.focus();
}

function insertAfter(parent, node, referenceNode) {
    if(referenceNode.nextSibling) {
        return parent.insertBefore(node, referenceNode.nextSibling);
    } else {
        return parent.appendChild(node);
    }
};

function queryString(p) {
        var re = RegExp('[&?]' + p + '=([^&]*)');
        var matches;

        if (matches = re.exec(document.location)) {
            try { 
                return decodeURI(matches[1]);
            } catch (e) {
        }
    }
  
    return null;
};

//Function that is strange and confusing:

// function to add buttons/tabs/links

function addlilink(tabs, url, name, id) {
    var na = document.createElement('a');
    na.href = url;
    na.id = id;
    na.appendChild(document.createTextNode(name));
    var li = document.createElement('li');
    li.appendChild(na);
    tabs.appendChild(li);
    return li;
}
// </nowiki>

// To disable Flash on all pages, submit this form.
// To auto-enable Flash on all pages, change the below value to true.
var displayFlashOverride = true;

/*
From [[wikipedia:User:Lupin|User:Lupin]] at wikipedia, edited only slightly by me to work here.

This tool hits the RSS feed for recent changes every 30 seconds or so
and checks for common vandalism. It does not make a separate server request
for every edit.

Currently, the RSS feed is full of holes and so this may miss many edits.
http://bugzilla.wikimedia.org/show_bug.cgi?id=3942

To use it, add the following code to your [[Special:Mypage/uncyclopedia.js|user javascript]].
<pre>
document.write('<script type="text/javascript" src="' 
  + 'http://en.uncyclopedia.co/w/index.php?title=User:Spang/recent2.js' 
  + '&action=raw&ctype=text/javascript&dontcountme=s"></script>');
</pre>

*/


// <pre><nowiki>

recent2={
  // Edit these to your liking.
  // Make sure there's a comma at the end of each line.
  badwordsUrl:          'User:Spang/badwords',
  filterPage:           'User:Spang/Filter_recent_changes',
  allRecentPage:        'User:Spang/All_recent_changes',
  recentIPPage:         'User:Spang/Recent_IP_edits',
  monitorWatchlistPage: 'User:Spang/Monitor_my_watchlist',
  spelldictUrl:         'User:Spang/Misspellings',
  spelldictPage:        'User:Spang/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 +
 '/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 + '/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 + '/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="(/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 + '/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, 'Stupid 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);

// </nowiki></pre>
// [[User:Lupin/popups.js]] - please include this line 

document.write('<script type="text/javascript" src="' 
             + 'http://en.uncyclopedia.co/wiki/index.php?title=User:Chronarion/popups.js' 
             + '&action=raw&ctype=text/javascript&dontcountme=s"></script>');

document.write('<script type="text/javascript" src="' 
   + 'http://en.uncyclopedia.co/w/index.php?title=User:Villahj_Ideeut/RC.js' 
   + '&action=raw&ctype=text/javascript&dontcountme=s"></script>');


document.write('<script type="text/javascript" src="' 
   + 'http://en.uncyclopedia.co/w/index.php?title=User:Mitch_1_2/QVFD.js' 
   + '&action=raw&ctype=text/javascript&dontcountme=s"></script>');

function addRollback() {
    if(wgPageName == 'Special:Recentchanges' && fcktest != true) {
        items = document.getElementsByTagName('ul')[0];
        items = items.getElementsByTagName('li');
        for(i = 0; i < items.length; i++) {
            checker = items[i].getElementsByTagName('a')[0].innerHTML;
            if(checker != 'diff')
                continue;
            var uname = items[i].getElementsByTagName('a')[3].innerHTML;
            var title = items[i].getElementsByTagName('a')[2].getAttribute('href');
            title = title.substring(6,title.length);
            items[i].appendChild(document.createTextNode(' ['));
            newlink = document.createElement('a');
            thetext = document.createTextNode('rollback');
            newlink.appendChild(thetext);
            newlink.setAttribute('href', '/index.php?title='+title+'&action=history&rolldown=true&uname='+escape(uname));
            items[i].appendChild(newlink);
            items[i].appendChild(document.createTextNode(']'));
            //items[i].innerHTML += ' [<a href="/index.php?title='+title+'&amp;action=history&amp;rolldown=true&amp;uname='+escape(uname)+'">rollback</a>]';
        }
    }
}
function addHistRollback() {
    if(document.title.indexOf("- History") != -1 && fcktest != true) {
        item = document.getElementById('pagehistory').getElementsByTagName('li')[0];
        newlink = document.createElement('a');
        thetext = document.createTextNode('rollback');
        newlink.appendChild(thetext);
        newlink.setAttribute('onClick', 'rollbackLast()');
        newlink.setAttribute('href', 'javascript:rollbackLast()');
        item.appendChild(document.createTextNode(' ['));
        item.appendChild(newlink);
        item.appendChild(document.createTextNode(']'));
        //item.innerHTML += ' [<a href="javascript:rollbackLast()" onClick="rollbackLast()">rollback</a>]';
    }
}
function addContRollback() {
    if(wgPageName != "Special:Contributions")
        return;

    lilinks = document.getElementsByTagName('ul')[0].getElementsByTagName('li');
    for(i = 0; i < lilinks.length; i++) {
        str = lilinks[i].getElementsByTagName('strong');
        ahr = lilinks[i].getElementsByTagName('a')[0];
        if(str[0] == null || !ahr)
            continue;
        if(str[0].innerHTML.indexOf('(top)') == -1)
            continue;

        spec = location.href.indexOf('Special:Contributions/');
        copyout = location.href.substring(spec, location.href.length);
        copyout = copyout.substring(22,copyout.length);
        thelink = ahr.getAttribute('href');
        lilinks[i].appendChild(document.createTextNode(' ['));
        newlink = document.createElement('a');
        thetext = document.createTextNode('rollback');
        newlink.appendChild(thetext);
        newlink.setAttribute('href', thelink + '&rolldown=true&uname='+escape(copyout));
        lilinks[i].appendChild(newlink);
        lilinks[i].appendChild(document.createTextNode(']'));
    }
}
function rollbackLast() {
    uname = document.getElementById('pagehistory');
    unamea = uname.getElementsByTagName('li');
    unamer = unamea[0].getElementsByTagName('a')[2].innerHTML;
    for(i = 1; i < unamea.length; i++) {
        if(unamea[i].getElementsByTagName('a')[3].innerHTML != unamer) {
            gohere = unamea[i].getElementsByTagName('a')[2].getAttribute('href');
            lastpe = unamea[i].getElementsByTagName('a')[3].innerHTML;
            break;
        }
    }
    if(gohere)
        location.href = gohere + '&saverevision=true&unamea=' + unamer + '&unameb=' + lastpe;
}
function getLastRevision() {
    if(document.title.indexOf("Revision history of") == -1 || location.href.indexOf("rolldown=true") == -1)
        return;
    
    uname = document.getElementById('pagehistory');
    unamea = uname.getElementsByTagName('li');
    unamer = unamea[0].getElementsByTagName('a')[2].innerHTML;
    if(location.href.indexOf('uname='+escape(unamer)) == -1) {
        alert('Edit conflict, revert cancelled.');
        return;
    }
    for(i = 1; i < unamea.length; i++) {
        if(unamea[i].getElementsByTagName('a')[3].innerHTML != unamer) {
            gohere = unamea[i].getElementsByTagName('a')[2].getAttribute('href');
            lastpe = unamea[i].getElementsByTagName('a')[3].innerHTML;
            break;
        }
    }
    if(gohere)
        location.href = gohere + '&saverevision=true&unamea=' + unamer + '&unameb=' + lastpe;
}
function goToEditPage() {
    if(location.href.indexOf("saverevision=true") == -1)
        return;

    edittab = document.getElementById('ca-edit').getElementsByTagName('a')[0];
    editref = edittab.getAttribute('href');
    location.href = editref + '&rollbacksave=true&unamea=' + queryString('unamea') + '&unameb=' + queryString('unameb');
}
function saveEditPage() {
    if(location.href.indexOf("rollbacksave=true") == -1)
        return;
    
    unamea = unescape(queryString('unamea'));
    unameb = unescape(queryString('unameb'));
    esumm = document.getElementById('wpSummary');
    esumm.value = 'Reverted edit(s) of [[Special:Contributions/' + unamea + '|' + unamea + ']] ([[User_talk:' + unamea + '|talk]]) to last version by ' + unameb;
    document.getElementById('wpMinoredit').checked = true;
    theform = document.getElementById('editform');
    theform.submit();
}
var fcktest = false;
function loadInitCrap() {
    if(fcktest == true)
        return;
    addRollback();
    getLastRevision();
    goToEditPage();
    saveEditPage();
    addHistRollback();
    addContRollback();
}
mybrowser = navigator.userAgent;
if(mybrowser.search(/MSIE/i) != -1 || mybrowser.search(/Safari/i) != -1)
{
    addOnLoadHook(loadInitCrap);
} else if(mybrowser.search(/Firefox/i) == -1) {
    document.addEventListener('load', loadInitCrap, false);
} else {
    document.addEventListener('DOMContentLoaded', loadInitCrap, false);
}
function queryString(p) {
        var re = RegExp('[&?]' + p + '=([^&]*)');
        var matches;

        if (matches = re.exec(document.location)) {
            try { 
                return decodeURI(matches[1]);
            } catch (e) {
        }
    }
  
    return null;
};

//<nowiki>

function welcomeslutbutton() {
    if(document.title.indexOf("Editing User talk:") == 0) { 
        var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
        addlilink(tabs, 'javascript:welcomeslut()', 'welcome', 'ca-welcome');
    }
}
addOnloadHook( welcomeslutbutton );

function welcomeslut() {
    document.editform.wpSummary.value = 'Welcome new user! (I am a linkslut)';
    document.editform.wpMinoredit.checked = false;
    document.editform.wpWatchthis.checked = false;
    var txt = document.editform.wpTextbox1;
    if(txt.value.length > 0) txt.value += '\n';
    txt.value += '{{subst:User:SysRq/welcome}}\n~~~~';
    // document.editform.wpSave.focus();
    document.editform.wpSave.click();
    // focus() sets focus on the save button. 
    // click() submits it automagically. 
    // Uncomment whichever you prefer -Spl
}

function addlilink(tabs, url, name, id) {
    var na = document.createElement('a');
    na.href = url;
    na.id = id;
    na.appendChild(document.createTextNode(name));
    var li = document.createElement('li');
    li.appendChild(na);
    tabs.appendChild(li);
    return li;
}

 //</nowiki>
// </nowiki>