catmon = {
enabled: true,
paused: false,
category: '',
cmcontinue: '',
sortbytimestamp: false,
refreshfrequency: 0,
zIndex: 101,
width: '200',
history: '',
loadCookies: function() {
catmon.enabled = (catmon.readCookie('catmon_enabled')=='true');
catmon.category = (catmon.readCookie('catmon_category'));
catmon.cmcontinue = (catmon.readCookie('catmon_cmcontinue'));
catmon.sortbytimestamp = (catmon.readCookie('catmon_sortbytimestamp')=='true');
catmon.history = (catmon.readCookie('catmon_history'));
catmon.width = (catmon.readCookie('catmon_width'));
if (!catmon.width || !catmon.width.length) catmon.width='200';
},
saveCookies: function() {
var cend = "; expires=Tue, 31-Dec-2030 23:59:59 GMT; path=/";
document.cookie = 'catmon_enabled=' + catmon.enabled.toString() + cend;
document.cookie = 'catmon_category=' + catmon.category.toString() + cend;
document.cookie = 'catmon_cmcontinue=' + catmon.cmcontinue.toString() + cend;
document.cookie = 'catmon_sortbytimestamp=' + catmon.sortbytimestamp.toString() + cend;
document.cookie = 'catmon_width=' + catmon.width.toString() + cend;
document.cookie = 'catmon_history=' + catmon.history.toString() + cend;
},
pause: function () {
catmon.paused=true;
p = document.getElementById('catmon_ovl');
if (p) {
p.style.display='';
}
},
refresh: function () {
if(catmon.paused) {
catmon.paused=false;
p = document.getElementById('catmon_ovl');
if (p) {
p.style.display='none';
}
catmon.loadCookies();
catmon.draw();
} else {
catmon.populate();
}
},
init: function () {
catmon.loadCookies();
catmon.makeStartLink();
catmon.draw();
window.onblur = catmon.pause;
window.onfocus = catmon.refresh;
importStylesheetURI('/skins-1.5/common/diff.css');
},
makeStartLink: function () {
if (mw.config.get('wgCanonicalNamespace') == 'Category') {
var heading = document.getElementById('firstHeading');
var span = document.createElement('span');
span.style.fontSize='50%';
span.appendChild(document.createTextNode(' ['));
var a = document.createElement('a');
a.setAttribute('href', '#');
a.onclick = function () {
catmon.category = mw.config.get('wgPageName');
catmon.enabled = true;
catmon.cmcontinue = '';
catmon.draw();
return false;
}
a.appendChild(document.createTextNode('Load this category in sidebar'));
span.appendChild(a);
span.appendChild(document.createTextNode(']'));
heading.appendChild(span);
}
},
resize: function() {
if (catmon.width < 25) {
catmon.width = 0;
} else if (catmon.width < 200) {
catmon.width = 200;
} else if (catmon.width > (document.body.clientWidth / 2)) {
catmon.width = (document.body.clientWidth / 2);
}
var sb = document.getElementById('catmon');
sb.style.width=catmon.width + 'px';
var rb = document.getElementById('catmon_resize');
rb.style.right=catmon.width + 'px';
//Set the spacer between the main body and the sidebar
var spacer = (sb.offsetWidth+rb.offsetWidth)+'px';
topbar = document.evaluate('//div[@id="p-personal"]//div[@class="pBody"]',
document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
if (topbar.singleNodeValue) {
topbar.singleNodeValue.style.marginRight=spacer;
}
sb.parentNode.style.marginRight=spacer;
},
draw: function() {
catmon.saveCookies();
var sb = document.getElementById('catmon');
if (catmon.enabled && catmon.category.length) {
if (sb) {
sb.style.display='';
rb.style.display='';
} else {
//Create the main sidebar
sb = document.createElement('div');
sb.id='catmon';
sb.className='portlet';
if (document.getElementById('menubar')) {
sb.style.top=document.getElementById('menubar').offsetHeight + 'px';
}
else {
sb.style.top='0px';
}
sb.style.right='0px';
sb.style.bottom='0px';
sb.style.zIndex=90;
sb.style.margin='0';//'.1em';
sb.style.padding='0em';
sb.style.backgroundColor='gray';
sb.style.position='absolute';
sb.style.borderLeft='1px solid #bbbbbb;';
sb.style.backgroundColor=document.defaultView.getComputedStyle(document.body, null).backgroundColor;
sb.style.position='fixed';
//Find the container where the sprint bar goes.
//This differs between monobook and modern skins.
container = document.getElementById('content');
if (!container) {
container = document.getElementById('mw_content');
}
container.appendChild(sb);
//Create the resize bar
rb = document.createElement('div');
rb.id='catmon_resize';
rb.style.display='';
rb.style.position='fixed';
rb.style.top='0px';
rb.style.height='100%';
rb.style.width='5px';
rb.style.cursor='ew-resize';
rb.onmouseover = function (evt) {
rb.style.backgroundColor='lightgray';
};
rb.onmouseout = function (evt) {
rb.style.backgroundColor='';
};
rb.onmousedown = function () {
var w = catmon.width;
rb.onmouseout = null;
window.onmousemove = function (evt) {
catmon.width = document.body.clientWidth - evt.pageX;
catmon.resize();
};
window.onmouseup = function (evt) {
if ((document.body.clientWidth - evt.pageX)<25) {
catmon.enabled=false;
catmon.width=w;
catmon.draw();
}
window.onmousemove = null;
window.onmouseup = null;
rb.style.backgroundColor='';
rb.onmouseout = function (evt) {
rb.style.backgroundColor='';
};
catmon.saveCookies();
};
return false;
};
container.appendChild(rb);
//Create the overlay for when it is paused (out of focus)
ovl = document.createElement('div');
ovl.id='catmon_ovl';
ovl.style.position='absolute';
ovl.style.top='0px';
ovl.style.right='0px';
ovl.style.width='100%';
ovl.style.height='100%';
ovl.style.borderLeft='1px solid #bbbbbb;';
ovl.style.backgroundColor=document.defaultView.getComputedStyle(document.body, null).backgroundColor;
ovl.zIndex=100;
ovl.style.display='none';
p = document.createElement('p');
p.style.position='absolute';
p.style.top='5em';
p.style.width='100%';
p.style.fontSize='1em';
p.style.lineHeight='2em';
p.style.textAlign='center';
p.style.color='#bbbbbb';
p.appendChild(document.createTextNode('Updates paused'));
p.appendChild(document.createElement('br'));
p.appendChild(document.createTextNode('Click to resume'));
ovl.appendChild(p);
sb.appendChild(ovl);
}
catmon.resize();
//TODO: Draw the category data
catmon.drawList();
} else { //Hide the sprint bar, if it has already been drawn
topbar = document.evaluate('//div[@id="p-personal"]//div[@class="pBody"]',
document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
if (topbar.singleNodeValue) {
topbar.singleNodeValue.style.marginRight='';
}
if (sb) {
sb.parentNode.style.marginRight='';
sb.style.display='none';
rb.style.display='none';
}
}
},
drawList: function() {
var cmtitlehdr = catmon.category.replace('Category:','').replace('_',' ');
var cmtitlehref = '/wiki/' + catmon.category;
var sb = document.getElementById('catmon');
var a;
var hdr = document.getElementById('catmon_hdr');
if (hdr) {
while (hdr.firstChild) {
hdr.removeChild(hdr.firstChild);
}
} else {
hdr = document.createElement('p');
hdr.id = 'catmon_hdr';
hdr.style.marginLeft='5px';
hdr.style.marginRight='5px';
hdr.style.fontSize='90%';
sb.appendChild(hdr);
}
var a = document.createElement('a');
a.setAttribute('nopopup', 'true');
a.id = 'catmon_link';
a.setAttribute('href', cmtitlehref);
a.appendChild(document.createTextNode(cmtitlehdr.replace('_', ' ', 'g')));
hdr.appendChild(a);
var p = document.getElementById('catmon_body');
if (!p) {
p = document.createElement('div');
p.setAttribute('class', 'pBody');
p.setAttribute('id', 'catmon_body');
p.style.top=hdr.offsetTop+hdr.offsetHeight+'px';
p.style.bottom='2em';
p.style.right='5px';
p.style.left='5px';
p.style.overflow='hidden';
p.style.position='absolute';
sb.appendChild(p);
}
var foot = document.getElementById('catmon_foot');
if (!foot) {
foot = document.createElement('div');
foot.setAttribute('id', 'catmon_foot');
foot.style.position='fixed';
foot.style.bottom='5px';
foot.style.right='5px';
foot.style.fontSize='90%';
sb.appendChild(foot);
}
catmon.populate();
},
populate: function() {
var cmtitle = catmon.category;
var cmlimit = 50;
var cmcontinue = catmon.cmcontinue;
var sortbytimestamp = catmon.sortbytimestamp;
var query = '/w/api.php?action=query&format=xml&list=categorymembers';
if (sortbytimestamp) {
query += '&cmsort=timestamp&cmprop=title|timestamp&cmtitle=' + catmon.category + '&cmlimit=' + cmlimit;
if (cmcontinue.length) query += '&cmstart=' + cmcontinue;
} else {
query += '&cmprop=title|sortkey&cmtitle=' + catmon.category + '&cmlimit=' + cmlimit;
if (cmcontinue.length) query += '&cmcontinue=' + cmcontinue;
}
//document.getElementById('firstHeading').textContent=query;
var callback = function(xml) {
pBody = document.getElementById('catmon_body');
while (pBody.firstChild) {
pBody.removeChild(pBody.firstChild);
}
var items = xml.documentElement.getElementsByTagName('cm');
for (var i=0; i<items.length; i++) {
var title = items[i].getAttribute('title');
var p = document.createElement('p');
p.setAttribute('sortkey', items[i].getAttribute('sortkey'));
p.setAttribute('timestamp', items[i].getAttribute('timestamp'));
p.style.lineHeight='1.1em';
p.style.fontSize='95%';
var a = document.createElement('a');
//a.setAttribute('nopopup', 'true');
a.href='/wiki/' + encodeURIComponent(title);
a.appendChild(document.createTextNode(title));
p.appendChild(a);
pBody.appendChild(p);
}
var foot = document.getElementById('catmon_foot');
while (foot.firstChild) {
foot.removeChild(foot.firstChild);
}
var aRf = document.createElement('a');
aRf.setAttribute('id', 'catmon_refresh');
aRf.setAttribute('href', '#');
aRf.appendChild(document.createTextNode('refresh'));
aRf.onclick = function () {
catmon.refresh();
return false;
}
foot.appendChild(aRf);
foot.appendChild(document.createTextNode(' | '));
var ahide = document.createElement('a');
ahide.id = 'catmon_hide';
ahide.setAttribute('href', '#');
ahide.appendChild(document.createTextNode('hide'));
ahide.onclick = function () {
catmon.enabled = false;
catmon.draw();
return false;
};
foot.appendChild(ahide);
foot.appendChild(document.createTextNode(' | '));
var aSort = document.createElement('a');
aSort.setAttribute('id', 'catmon_sort');
aSort.setAttribute('href', '#');
aSort.appendChild(document.createTextNode('sort'));
aSort.title = catmon.sortbytimestamp ? 'Sort alphabetically' : 'Sort by timestamp';
aSort.onclick = function() {
catmon.sortbytimestamp = !catmon.sortbytimestamp;
catmon.cmcontinue='';
catmon.saveCookies();
catmon.refresh();
return false;
}
foot.appendChild(aSort);
foot.appendChild(document.createTextNode(' | '));
if (cmcontinue.length) {
var aTop = document.createElement('a');
aTop.setAttribute('id', 'catmon_top');
aTop.setAttribute('href', '#');
aTop.appendChild(document.createTextNode('top'));
aTop.onclick = function () {
catmon.cmcontinue = '';
catmon.saveCookies();
catmon.populate();
return false;
}
foot.appendChild(aTop);
} else {
foot.appendChild(document.createTextNode('top'));
}
foot.appendChild(document.createTextNode(' | '));
var next = catmon.firstHidden();
if (next.length) {
var aMore = document.createElement('a');
aMore.setAttribute('id', 'catmon_more');
aMore.setAttribute('href', '#');
aMore.appendChild(document.createTextNode('next'));
aMore.onclick = function () {
catmon.cmcontinue = next;
catmon.saveCookies();
catmon.populate();
return false;
}
foot.appendChild(aMore);
} else {
foot.appendChild(document.createTextNode('next'));
}
}
catmon.getUrl(query, callback);
if (catmon.refreshfrequency) {
window.setTimeout(catmon.refresh, catmon.refreshfrequency);
}
},
firstHidden: function () {
var pBody = document.getElementById('catmon_body');
var p = pBody.firstChild;
var limit = pBody.offsetHeight;
while (p) {
//var cs = window.getComputedStyle(p, null);
if ((p.offsetTop + p.offsetHeight) > limit) {
break;
} else {
p = p.nextSibling;
}
}
if (p) {
if (p.getAttribute('sortkey').length) return encodeURIComponent(p.getAttribute('sortkey')) + '|';
else return p.getAttribute('timestamp');
} else {
return '';
}
},
getUrlTimer: new Date(),
getUrl: function (url, callback) {
var now = new Date();
catmon.getUrlTimer = now;
var aj = sajax_init_object();
aj.onreadystatechange = function () {
if (aj.readyState == 4) {// && aj.status == 200) {
callback(aj.responseXML);
}
}
aj.open('GET', url, true);
aj.send(null);
},
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 '';
}
}
addOnloadHook(catmon.init);