User:Quarl/alexafy.js

// User:Quarl/alexafy.js - adds "alexa" links to external links

// requires addlilink.js, util.js

// quarl 2005-01-10 new AJAX version that annotates page asynchronously with rank

// I tried to create a version that automatically downloads the Alexa rank and annotates the page, but I think it's disallowed because it's not from the same domain. So it would be impossible without a server-side helper script on en.wikipedia.org.

// based on http://en.wikipedia.org/wiki/User:Matthewmayer/monobook.js

//add Alexafy link to toolbar function addToolboxAlexafy { addToolboxLink('javascript:alexafyLinks','Alexa-fy links','alexafyLinks') }

function alexafyWhitelistedP(url) { if (url.match(/wikipedia.org/)) return true; return false; }

function alexafyLinks { var content=document.getElementById('content'); var externallinks=getElementsByClass('external',content,'a'); for (i in externallinks) { var alink=externallinks[i]; if (alexafyWhitelistedP(alink.href)) continue;

alexafy_asyncAnnotateLink(alink); } }

function alexafy_asyncAnnotateLink(alink) { var alexaUrl = makeAlexaTrafficUrl(alink.href); var dnode = document.createElement('span'); dnode.innerHTML = ' [Alexa]'; add_after(alink, dnode);

// XXX this doesn't work because of permissions. see top. //alexafy_asyncGetRank(dnode,alexaUrl); }

function makeAlexaTrafficUrl(url) { return 'http://www.alexa.com/data/details/traffic_details?q=&url=' + url; }

function alexafy_asyncGetRank(dnode, alexaUrl) { var req = new XMLHttpRequest; req.dnode = dnode; // using onload instead of onreadystatechange allows multiple asynchronous requests req.onload = alexafy_asyncReqCont; req.open("GET", alexaUrl, true); req.send(null); }

function alexafy_asyncReqCont(event) { req = event.target; if (req.readyState!=4) return; if (req.status == 200) { if (req.responseText.match(/([0-9,]+)<\/span>/)) { var domain = RegExp.$1; var rank = RegExp.$2; alexafy_annotateDoc(req.dnode, domain, rank); return; // Traffic Rank for example.org: 	 123,456 }       if (req.responseText.match(/<span.*?Traffic Rank for.*?No Data/)) { // Traffic Rank for : No Data alexafy_annotateDoc(req.dnode, null, 'No data'); return; }   }    alexafy_annotateDoc(req.dnode, null, 'Error'); }

function alexafy_annotateDoc(dnode, domain, rank) {   var msg; if (rank == 'Error') { msg = "couldn't get Alexa rank"; } else if (rank == 'No data') { msg = "no traffic data"; } else { msg = "traffic rank for "+domain+" is "+rank; }   dnode.innerHTML = dnode.innerHTML.substr(0,dnode.innerHTML.length-1) + msg + "]"; }

addOnloadHook(addToolboxAlexafy);