User:Splarka/lastmod.js

/* Last mod duration inserter, version [0.0.1] Originally from: http://en.wikipedia.org/wiki/User:Splarka/lastmod.js

Parses the "last mod" date in getElementById('lastmod') and returns a duration since.

Notes:
 * Checks via API for your timezone offset preference.
 * If none is found it uses site timezone offset.
 * Once found it sets a cookie for a day (or session).
 * Inserts it as a text node in the 'lastmod' object.
 * Language sensitive, fragile, can fail gracefully if the interace message or language changes.

var lmRegex = /last modified on (\d+ [a-z]{3,10} \d{4}) at (\d{2}\:\d{2})\./i;

if(wgAction == 'view' && wgNamespaceNumber >= 0 && wgArticleId != 0) addOnloadHook(lastmodShowDuration) function lastmodShowDuration { var lm = document.getElementById('lastmod'); if(!lm) return; if(!getCookie('timecorrection')) { getOffsetCookie; return; } var lmt = getText(lm); if(!lmt.match(lmRegex)[2]) return var lmdate = lmt.match(lmRegex)[1] + ' ' + lmt.match(lmRegex)[2]; var lmd = new Date(lmdate + ' GMT'); var now = new Date; var ms = lmd.getTime - (parseInt(getCookie('timecorrection')) * 60000); lmd.setTime(ms); var diff = parseInt((now.getTime - lmd.getTime) / 1000); if(diff < 0) return lm.appendChild(document.createTextNode(' About ' + duration(diff,2) + ' ago.')); }

function getOffsetCookie { var url = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?action=query&format=json&meta=userinfo|siteinfo&uiprop=options'; var req = sajax_init_object; req.open('GET', url, true); req.onreadystatechange = function { if(req.readyState == 4 && req.status == 200) { eval("getOffsetCookieHandler(" + req.responseText + ",'" + req.responseText.replace(/\'/g,"`") + "')"); } }  req.send(null); }

function getOffsetCookieHandler(obj,txt) { if(obj['error']) { //jsMsg('Api error: ' + obj['error']['code'] + ' - ' + obj['error']['info'] + '\n'); return; } var timeoffset = 0; if(obj['query'] && !obj['query']['general'] && !obj['query']['general']['timeoffset']) { timeoffset = obj['query']['general']['timeoffset']; } if(obj['query']['userinfo'] && obj['query']['userinfo']['options'] && obj['query']['userinfo']['options']['timecorrection']) { var tc = obj['query']['userinfo']['options']['timecorrection'].split('|'); if(tc[1]) timeoffset = tc[1] } setCookie('timecorrection',timeoffset,1); if(getCookie('timecorrection')) lastmodShowDuration }

function duration(input,depth) { var num = input; var out = ''; var s = num % 60; num = Math.floor(num / 60); var m = num % 60; num = Math.floor(num / 60); var h = num % 24; num = Math.floor(num / 24); var d = num % 7; num = Math.floor(num / 7); var w = num % 52; num = Math.floor(num / 52); var y = num if(y > 0) out += y + 'yrs ' if(y + w > 0) out += w + 'wks ' if(y + w + d > 0) out += d + 'days ' if(y + w + d + h > 0) out += h + 'hrs ' if(y + w + d + h + m > 0) out += m + 'mins ' out += s + 'secs'; if(depth && depth < out.split(' ').length) { out = out.split(' ').slice(0,depth).join(' '); } return out; }

function getText(object) { if (object.nodeType == 3) return object.nodeValue; var txt = []; var i=0; while(object.childNodes[i]) { txt[txt.length] = getText(object.childNodes[i]); i++; } return txt.join(''); }

function setCookie(cookieName, cookieValue, days) { var today = new Date; var expire = new Date; var nDays = days || 365; expire.setTime(today.getTime + (3600000 * 24 * nDays)); document.cookie = cookieName + '=' + escape(cookieValue) + ';path=/' + ';expires='+expire.toGMTString; }

function getCookie(cookieName) { var start = document.cookie.indexOf(cookieName + '='); if(start == -1) return ''; var len = start + cookieName.length + 1; if((!start) && (cookieName != document.cookie.substring(0, cookieName.length))) return '' var end = document.cookie.indexOf(';', len); if(end == -1) end = document.cookie.length return unescape(document.cookie.substring(len, end)); }

function deleteCookie(cookieName) { if(getCookie(cookieName)) setCookie(cookieName,null,-365) }