Wikipedia:WikiProject User scripts/Scripts/TimeTraveller.js
/* Timetravel, version [0.2.0]Documentation: Wikipedia:WikiProject User scripts/Scripts/TimeTravellerNotes:* Does not take into account:** Old versions of templates, images** Moved page titles** Renamed users** Time-sensitive magic words*///to be localisedtt_currentrevision='Current revision';tt_history='History';//// this code deals with the first access to an old page// We have the revision id, but not the timetravel timestamp --> need to find it and set tt_timetravel//if(queryString('oldid')&&!queryString('timetravel')&&!queryString('diff')&&mw.config.get('wgAction')=='view')addOnloadHook(addTimetravelButton)functionaddTimetravelButton(){varurl=mw.config.get('wgServer')+mw.config.get('wgScriptPath')+'/api.php?maxage=300&smaxage=300&action=query&prop=revisions&rvprop=timestamp|ids&format=json&callback=addTimetravelCB&revids='+queryString('oldid');mw.loader.load(url);}vartt_timetravel=false;functionaddTimetravelCB(obj){if(!obj['query']||!obj['query']['pages']||!obj['query']['pages'][mw.config.get('wgArticleId')])returnvarrev=obj['query']['pages'][mw.config.get('wgArticleId')]['revisions'];varts='';for(variinrev){if(rev[i]['revid']==queryString('oldid')){ts=rev[i]['timestamp'];}}tt_timetravel=ts;engageTimetravelLinks();}//// this code deals with the old pages accessed from another old one// We thus have the tt_timetravel parameter//if(queryString('timetravel')&&mw.config.get('wgAction')=='view')addOnloadHook(engageTimetravelLinks)// this is the routine called by the 2 previous casesfunctionengageTimetravelLinks(){if(!tt_timetravel)tt_timetravel=queryString('timetravel');appendCSS('a.timetravel { color:#00ff00 !important;} a.ttused {color:#ff0000 !important;}');engageTT2(document.getElementById('bodyContent')||document.getElementById('content')||document.body,"A");engageTT2(document.getElementById('p-cactions'),"B");}functionengageTT2(docobj,tag){if(!docobj)return;vara=docobj.getElementsByTagName('a');for(vari=0;i<a.length;i++){if(tag=='B'&&a[i].innerHTML==tt_history){a[i].href=a[i].href+'&offset='+tt_timetravel.replace(/[^0-9]/g,"");continue}// 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)continueif(a[i].href.search(/(\/wiki\/(Category\:|Special\:)|diff\=|oldid\=|action\=|Special\:Cite)/ig)!=-1)continueif(a[i].innerHTML==tt_currentrevision)continue;varlink=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)continuea[i].onmouseover=timetravel;// a[i].className += ' timetravel';a[i].id='ttlink-'+tag+i;}}//// this code deals with the mouseOver an anchor//vartt_anchor,tt_id;// this may create a problem if several mouseover are fired before they can be fully handledfunctiontimetravel(e){//first, let's find the anchorvartarg;if(!e)vare=window.event;if(e.target)targ=e.target;elseif(e.srcElement)targ=e.srcElement;if(targ.nodeType==3)// defeat Safari bugtarg=targ.parentNode;vara=targ;varlink=a.href;// no need to do anything else if it already has timetravelif(link.indexOf('timetravel=')!=-1){return}// block the href until updateda.className+=' ttused';if(link.indexOf('javascript:void("')!=-1){// this happens when the call back does not happen! Remove it.link=link.substr(('javascript:void("').length,link.length-('javascript:void("').length-('");').length);}else{a.href='javascript:void("'+a.href+'");';}//set the global variableslink=link.replace(mw.config.get('wgServer')+mw.config.get('wgArticlePath').replace(/\$1/,''),'');link=link.replace(/_/g,' ');if(link.indexOf('#')!=-1){tt_anchor=link.substr(link.indexOf('#'))link=link.substr(0,link.indexOf('#'));}else{tt_anchor=''};tt_id=a.id;//call the APIvarurl=mw.config.get('wgServer')+mw.config.get('wgScriptPath')+'/api.php?maxage=300&smaxage=300&action=query&prop=revisions&&rvprop=ids&rvlimit=1&rvstart='+tt_timetravel+'&format=json&callback=timetravelCB&titles='+encodeURIComponent(decodeURIComponent(link));url+='&rnd='+Math.random()// add a random element to make sure it is calledmw.loader.load(url);}functiontimetravelCB(obj){vara=document.getElementById(tt_id);if(!obj['query']||!obj['query']['pages'])returnvarpages=obj['query']['pages'];varrev;vartitle='';for(variinpages){rev=pages[i]['revisions'];title=pages[i]['title'];}if(!rev){//unblock the linkurl=a.href.substr(('javascript:void("').length,a.href.length-('javascript:void("').length-('");').length);a.href=url;a.className='';// alert('No such page, or no revisions found that old.\n');}else{a.onmouseover='';// no need to fire this anymorevarid=0;for(variinrev){id=rev[i]['revid'];}if(id!=0){varurl=mw.config.get('wgServer')+mw.config.get('wgScript')+'?title='+encodeURIComponent(title)+'&oldid='+id+'&timetravel='+tt_timetravel+tt_anchor;a.href=url;a.className='';}}}functionqueryString(p){varre=RegExp('[&?#]'+p+'=([^&#]*)');varmatches;if(matches=re.exec(document.location)){try{returndecodeURI(matches[1]);}catch(e){}}returnnull;}//// Add links to timestamps in talk pages//if(mw.config.get('wgAction')=='view')addOnloadHook(addDateLinks);functionaddDateLinks(){varnewContent=document.getElementById('bodyContent');if(!newContent||!newContent.innerHTML||newContent.innerHTML=='')return;newContent=newContent.innerHTML;vartt_regDate=/(\d?\d):(\d\d), (\d?\d) (January|February|March|April|May|June|July|August|September|October|November|December|Jan|Feb|Mar|Apr|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d\d\d\d) \(UTC\)/g;vardates=newContent.match(tt_regDate);if(!dates||!dates.length)return;for(varj=0;j<dates.length;j++){tt_regDate.lastIndex=0;vara=tt_regDate.exec(dates[j]);if(!a)continue;vardateLink=a[5]+'-'+tt_2(a[4])+'-'+tt_2(a[3])+'T'+tt_2(a[1])+':'+tt_2(a[2])+':59Z';dateLink="<a href=javascript:void('"+dateLink+"') id='"+dateLink+"' onmouseover='getURLofThisPageFor("+'"'+dateLink+'"'+")'>"+dates[j]+"</a>";varr=dates[j].replace("(","\\(");r=r.replace(")","\\)");r=newRegExp(r,"g");newContent=newContent.replace(r,dateLink);}document.getElementById('bodyContent').innerHTML=newContent};//// this code deals with the mouseOver an anchor//vartt_tentativeDate;functiongetURLofThisPageFor(aDate){//first, let's find the anchorvara=document.getElementById(aDate);if(!a)return;// no need to do anything else if it already has timetravelif(a.href.indexOf('timetravel=')!=-1)return;//set the global variablestt_tentativeDate=aDate;//call the APIvarpageName=mw.config.get('wgPageName').replace(/()\/Archive_[\d]*/,'$1');varurl=mw.config.get('wgServer')+mw.config.get('wgScriptPath')+'/api.php?maxage=300&smaxage=300&action=query&prop=revisions&&rvprop=ids&rvlimit=1&rvstart='+aDate+'&format=json&callback=getURLofThisPageCB&titles='+encodeURIComponent(decodeURIComponent(pageName));url+='&rnd='+Math.random()// add a random element to make sure it is calledmw.loader.load(url);};functiongetURLofThisPageCB(obj){if(!tt_tentativeDate)return;vara=document.getElementById(tt_tentativeDate);if(!a)return;if(!obj['query']||!obj['query']['pages'])returnvarpages=obj['query']['pages'];varrev;vartitle='';for(variinpages){rev=pages[i]['revisions'];title=pages[i]['title'];};if(!rev){//unblock the linkurl=a.href.substr(('javascript:void("').length,a.href.length-('javascript:void("').length-('");').length);a.href=url;a.className='';// alert('No such page, or no revisions found that old.\n');}else{a.onmouseover='';// no need to fire this anymorevarid=0;for(vari=0;i<rev.length;i++){id=rev[i]['revid'];};title=title.replace(/()\/Archive_[\d]*/,'$1');if(id!=0){varurl=mw.config.get('wgServer')+mw.config.get('wgScript')+'?title='+encodeURIComponent(title)+'&oldid='+id+'&timetravel='+tt_tentativeDate;a.href=url;a.className='';}}};functiontt_2(s){switch(s){case'1':return'01';case'2':return'02';case'3':return'03';case'4':return'04';case'5':return'05';case'6':return'06';case'7':return'07';case'8':return'08';case'9':return'09';case'January':return'01';case'February':return'02';case'March':return'03';case'April':return'04';case'May':return'05';case'June':return'06';case'July':return'07';case'August':return'08';case'September':return'09';case'October':return'10';case'November':return'11';case'December':return'12';case'Jan':return'01';case'Feb':return'02';case'Mar':return'03';case'Apr':return'04';case'May':return'05';case'Jun':return'06';case'Jul':return'07';case'Aug':return'08';case'Sep':return'09';case'Oct':return'10';case'Nov':return'11';case'Dec':return'12';default:returns}}