User:Splarka/timetravel.js

/* Timetravel, version [0.1.0] Originally from: http://en.wikipedia.org/wiki/User:Splarka/timetravel.js

Notes:
 * Does not take into account:
 * Old versions of templates, images
 * Moved page titles
 * Renamed users
 * Time-sensitive magic words

if(queryString('oldid') && !queryString('timetravel') && !queryString('diff') && wgAction == 'view') addOnloadHook(addTimetravelButton) function addTimetravelButton { var url = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?maxage=300&smaxage=300&action=query&prop=revisions&rvprop=timestamp|ids&format=json&callback=addTimetravelButtonCB&revids=' + queryString('oldid'); mw.loader.load(url); }

function addTimetravelButtonCB(obj) { if(!obj['query'] || !obj['query']['pages'] || !obj['query']['pages'][wgArticleId]) return var rev = obj['query']['pages'][wgArticleId]['revisions']; if(rev.length == 0) return if(rev[0]['revid'] =! queryString('oldid')) return var ts = rev[0]['timestamp']; mw.util.addPortletLink('p-cactions', mw.config.get('wgServer') + mw.config.get('wgScript') + '?title=' + encodeURIComponent(mw.config.get('wgPageName')) + '&oldid=' + queryString('oldid') + '&timetravel=' + ts, 'Time travel'); }

if(queryString('timetravel') && wgAction == 'view') addOnloadHook(engageTimetravelLinks) function engageTimetravelLinks { appendCSS('a.timetravel { color:#00ff00 !important;} a.ttused {color:#ff0000 !important;} b.timetravel {color:#008800;background-color:#ffff00;border:1px dashed #008800}'); var note = document.getElementById('contentSub') || document.getElementById('topbar') if(note) { var txt = document.createTextNode('Currently time travelling, appropriate time travel links in green.'); var b = document.createElement('b'); b.className = 'timetravel'; b.appendChild(txt); note.appendChild(b); } var docobj = document.body; var a = docobj.getElementsByTagName('a'); for(var i=0;i<a.length;i++) { // Exclude: catlinks, extiw/external/new/image, diff/oldid/action, special, http/uri, media?, anchors?, imagemap? if(a[i].className.search(/(extiw|external|new|image)/ig) != -1) continue if(a[i].href.search(/(\/wiki\/(Category\:|Special\:)|diff\=|oldid\=|action\=|Special\:Cite)/ig) != -1) continue

var link = a[i].href; link = link.replace(mw.config.get('wgServer') + mw.config.get('wgArticlePath').replace(/\$1/,),); if(link.indexOf('#') != -1) link = link.substr(0,link.indexOf('#')); if(link.search(/(http|https|file|javascript)\:/ig) == 0) continue

a[i].href = 'javascript:(timetravel("' + queryString('timetravel') + '","' + encodeURIComponent(link) + '",' + i + '))'; a[i].className += ' timetravel'; a[i].id = 'ttlink-' + i; } }

function timetravel(date,page,id) { var a = document.getElementById('ttlink-' + id); a.className += ' ttused'; a.href = 'javascript:void(0);'; var url = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?maxage=300&smaxage=300&action=query&prop=revisions&indexpageids&rvprop=ids&rvlimit=1&rvstart=' + date + '&format=json&callback=timetravelCB&titles=' + page; mw.loader.load(url); }

function timetravelCB(obj) { if(!obj['query'] || !obj['query']['pages'] || !obj['query']['pageids']) return var pages = obj['query']['pages']; var ids = obj['query']['pageids']; if(ids.length == 0) return var title = ''; var rev = pages[ids[0]]['revisions']; title = pages[ids[0]]['title'];

if(!rev) { //change to redlink later, lazy now alert('No such page, or no revisions found that old.\n'); return; } if(rev.length == 0) return var id = rev[0]['revid']; if(id != 0) { var url = mw.config.get('wgServer') + mw.config.get('wgScript') + '?title=' + encodeURIComponent(title) + '&oldid=' + id + '&timetravel=' + queryString('timetravel') ; window.location.href = url; } }

function queryString(p) { var re = RegExp('[&?#]' + p + '=([^&#]*)'); var matches; if (matches = re.exec(document.location)) { try { return decodeURI(matches[1]); } catch (e) { } }  return null; }