MediaWiki:Extensions/history.js
From OpenWetWare
Jump to navigationJump to search
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)
- Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
// <pre>
// At http://openwetware.org/wiki/User:Austin/Extensions/history.js
// Author: Austin Che
//
// This only works with MediaWiki > 1.8 (which defines wgPageName as Javascript variable)
// Add the following line to User:YOURNAME/monobook.js
// document.write('<script type="text/javascript" src="http://openwetware.org/index.php?title=User:Austin/Extensions/history.js&action=raw&ctype=text/javascript"></script>');
if (document.getElementById && wgPageName && addOnloadHook)
addOnloadHook(initVisitHistory);
var historyNumSaved = 20;
var historyExpiration = 30; // days
var historyCookieName = "wikihist";
var historyList = new Array();
function setCookie(name, value, days)
{
var expires = "";
if (days)
{
var date = new Date(); // current time
date.setTime(date.getTime() + (days*24*60*60*1000));
expires = "; expires=" + date.toGMTString();
}
document.cookie = name + "=" + escape(value) + expires + "; path=/";
}
function getCookie(name)
{
// returns the value of the cookie with name
if (! document.cookie.length)
return null;
// search for cookie
var search = name + "=";
var offset = document.cookie.indexOf(search);
if (offset == -1)
return null; // no such cookie
// set offset to the beginning of the cookie value
offset += search.length;
var end = document.cookie.indexOf(";", offset); // find end
if (end == -1)
end = document.cookie.length;
return unescape(document.cookie.substring(offset, end));
}
function loadSaveHistory()
{
var cookie = getCookie(historyCookieName);
// using | as separator as it is not valid in wiki page name
if (cookie)
historyList = cookie.split('|');
for (var i = 0; i < historyList.length; i++)
{
if (historyList[i] == wgPageName)
{
historyList.splice(i, 1);
break;
}
}
// add current page to beginning of history list
if (historyList.length == 0 || historyList[0] != wgPageName)
historyList.unshift(wgPageName);
if (historyList.length > historyNumSaved)
historyList = historyList.slice(0, historyNumSaved);
setCookie(historyCookieName, historyList.join('|'), historyExpiration);
}
function jumpToHistoryPage()
{
var hist = document.getElementById('visithistory');
if (!hist.changed)
return false;
var page = hist.options[hist.selectedIndex].text;
var s = new String(wgArticlePath);
s = s.replace(/\$1/, page);
var url = wgServer + encodeURI(s.toString());
window.location = url;
return true;
}
function historyClicked()
{
this.changed = true;
}
function historyFocus()
{
this.initValue = this.value;
return true;
}
function historyKeydown(e)
{
var theEvent;
var keyCodeTab = "9";
var keyCodeEnter = "13";
var keyCodeEsc = "27";
if (e)
theEvent = e;
else
theEvent = event;
if ((theEvent.keyCode == keyCodeEnter || theEvent.keyCode == keyCodeTab) && this.value != this.initValue)
{
this.changed = true;
jumpToHistoryPage();
}
else if (theEvent.keyCode == keyCodeEsc)
this.value = this.initValue;
else
this.changed = false;
return true;
}
function addOption(text)
{
var o = document.createElement('option');
o.appendChild(document.createTextNode(text));
return o;
}
function showHistory()
{
if (!historyList || !historyList.length)
return;
var hist = document.createElement('select');
hist.id = 'visithistory';
// without removing text-transform, page names are lowercased
hist.style.textTransform = "none";
hist.style.width = "25%";
hist.changed = false;
hist.onchange = jumpToHistoryPage;
hist.onfocus = historyFocus;
hist.onkeydown = historyKeydown;
hist.onclick = historyClicked;
var o = addOption(historyList[0]);
o.selected = true;
hist.appendChild(o);
for (var i = 1; i < historyList.length; i++)
{
hist.appendChild(addOption(historyList[i]));
}
var f = document.createElement('form');
f.appendChild(hist);
var li = document.createElement('li');
li.appendChild(f);
var personal = document.getElementById('p-personal').getElementsByTagName('ul')[0];
personal.appendChild(li);
document.getElementById('p-personal').style.zIndex = 1;
document.getElementById('p-cactions').style.zIndex = 2;
}
function initVisitHistory()
{
loadSaveHistory();
showHistory();
}
// </pre>