Plugin Example: Alexa Rank and Google Page Rank

This example show Alexa and Google page rank for loaded pages. // ==UserScript== // @name Alexa rank/google pagerank // @namespace http://iescripts.org // @description Display web site Alexa Rank & Google Rank(Thanks SearchStatus@Firefox) // @statussize 160 // ==/UserScript== (function() { var plugin = PRO_plugin(@name); plugin.onpagechange = handlePageChange; plugin.registerContextMenu("Show Google results from this site", menuShowGoogleResult); plugin.registerContextMenu("Show Google Related Site", menuShowGoogleRelated); plugin.registerContextMenu("Show Alexa Overview", menuShowAlexaOverview); plugin.registerContextMenu("Show Alexa Traffic Detail", menuShowAlexaTraffic); var gCookie = ""; var gAlexaRank = ""; var gGoogleRank = ""; var reqObj = new Object(); reqObj.request = function(callback, cookie, url, userAgent, lastModify) { var req; req = PRO_xmlhttpRequest(); req.onreadystatechange = function() { if (req.readyState == 4) {// completed if (req.status < 400) {// only if "OK" try { callback(true, req, cookie); } catch(err) { } } else { // PRO_log("There was a problem loading data :\n" + req.status+ "/" + req.statusText); callback(false, req, cookie); } setTimeout(function() {req.forceClean();req = null;}, 1000); } } try { req.open("GET", url); req.setRequestHeader( "User-Agent", userAgent); if(lastModify.length > 0) req.setRequestHeader( "If-Modified-Since", lastModify); req.send(null); } catch(err){ } return req; } // escape the url function encodeURL(url) { return escape(url).replace(/\+/g, '%2B').replace(/\"/g, '%22').replace(/\'/g, '%27'); } function menuShowGoogleResult(cookie,url) { PRO_openInTab("http://google.com/search?&q=site:"+url,1); } function menuShowGoogleRelated(cookie,url) { PRO_openInTab("http://www.google.com/search?q=related:"+url,1); } function menuShowAlexaOverview(cookie,url) { var urlhost = url.split("/"); var qhost = urlhost[2]; PRO_openInTab("http://www.alexa.com/data/details/main?q=&url="+qhost,1); } function menuShowAlexaTraffic(cookie,url) { var urlhost = url.split("/"); var qhost = urlhost[2]; PRO_openInTab("http://www.alexa.com/data/details/traffic_details?q=&url="+qhost,1); } function handlePageChange(cookie, url, state) { if(state == 1) {// page loading var re = /http:\/\/(.*)/i; var urlhost = url.split("/"); var qhost = urlhost[2]; gCookie = cookie; gAlexaRank = ""; gGoogleRank = ""; var encodeurl = encodeURL(qhost); var queryurl = "http://xml.alexa.com/data?cli=10&dat=nsa&ver=quirk-searchstatus&uid=20060101000000&userip=126.12.3.4&url=" + encodeurl; reqObj.request(processAlexaData, cookie, queryurl, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; Alexa Toolbar)", "Thu, 26 Aug 2002 08:24:16 GMT"); var encodeurl2 = encodeURL(url); var reqgr = "info:" + url; var reqgre = "info:" + encodeurl2.replace( "_", "%5F" ); var gGoogleCHCalc = new googlechcalc(); var mGoogleCH = gGoogleCHCalc.googleCH( gGoogleCHCalc.strord( reqgr ) ); mGoogleCH = "6" + gGoogleCHCalc.googleNewCh( mGoogleCH ); queryurl = "http://toolbarqueries.google.com/search?client=navclient-auto&ch=" + mGoogleCH + "&ie=UTF-8&oe=UTF-8&features=Rank&q=" + reqgre; // PRO_log(queryurl); reqObj.request(processGoogleData, cookie, queryurl, "User-Agent", "Mozilla/4.0 (compatible; GoogleToolbar 2.0.114-big; Windows XP 5.1)"); } else if(state == 2) {// page loaded } } function processAlexaData(isOK, req, cookie) { if(gCookie == cookie) { gAlexaRank = "0"; if(isOK) { try { var re = /TEXT=\"(\d+)\"\/\>/i; var alexaRank = req.responseText.match(re); gAlexaRank = alexaRank[1]; } catch(e) {} } if(gGoogleRank.length > 0) { processResult(); } } } function processGoogleData(isOK, req, cookie) { if(gCookie == cookie) { gGoogleRank = "0"; if(isOK) { try { var re = /Rank_.*?:.*?:(\d+)/i; var googleRank = req.responseText.match(re); gGoogleRank = googleRank[1]; } catch(e) {} } if(gAlexaRank.length > 0) { processResult(); } } } function processResult() { plugin.setStatusInfo("", "Alexa:"+FormatInteger(gAlexaRank)+" Google:" + gGoogleRank + "/10", "", gCookie); } function googlechcalc() { return this; } googlechcalc.prototype = { googleNewCh: function( ch ) { ch = ( ( ( ch / 7 ) << 2 ) | ( ( this.myfmod( ch,13 ) ) & 7 ) ); prbuf = new Array(); prbuf[0] = ch; for( i = 1; i < 20; i++ ) { prbuf[i] = prbuf[i-1] - 9; } ch = this.googleCH( this.c32to8bit( prbuf ), 80 ); return ch; }, googleCH: function( url ) { var init = 0xE6359A60; var length = url.length; var a = 0x9E3779B9; var b = 0x9E3779B9; var c = 0xE6359A60; var k = 0; var len = length; var mixo = new Array(); while( len >= 12 ) { a += (url[k+0] +(url[k+1]<<8) +(url[k+2]<<16) +(url[k+3]<<24)); b += (url[k+4] +(url[k+5]<<8) +(url[k+6]<<16) +(url[k+7]<<24)); c += (url[k+8] +(url[k+9]<<8) +(url[k+10]<<16)+(url[k+11]<<24)); mixo = this.mix(a,b,c); a = mixo[0]; b = mixo[1]; c = mixo[2]; k += 12; len -= 12; } c += length; switch( len ) { case 11: c += url[k+10]<<24; case 10: c+=url[k+9]<<16; case 9 : c+=url[k+8]<<8; case 8 : b+=(url[k+7]<<24); case 7 : b+=(url[k+6]<<16); case 6 : b+=(url[k+5]<<8); case 5 : b+=(url[k+4]); case 4 : a+=(url[k+3]<<24); case 3 : a+=(url[k+2]<<16); case 2 : a+=(url[k+1]<<8); case 1 : a+=(url[k+0]); } mixo = this.mix( a, b, c ); if( mixo[2] < 0 ) { return ( 0x100000000 + mixo[2] ); } else { return mixo[2]; } }, hexdec: function( str ) { return parseInt( str, 16 ); }, zeroFill: function( a, b ) { var z = this.hexdec( 80000000 ); if( z & a ) { a = a >> 1; a &= ~z; a |= 0x40000000; a = a >> ( b - 1 ); } else { a = a >> b; } return (a); }, mix: function( a, b, c ) { a -= b; a -= c; a ^= ( this.zeroFill( c, 13 ) ); b -= c; b -= a; b ^= ( a << 8 ); c -= a; c -= b; c ^= ( this.zeroFill( b, 13 ) ); a -= b; a -= c; a ^= ( this.zeroFill( c, 12 ) ); b -= c; b -= a; b ^= ( a << 16); c -= a; c -= b; c ^= ( this.zeroFill( b, 5 ) ); a -= b; a -= c; a ^= ( this.zeroFill( c, 3 ) ); b -= c; b -= a; b ^= ( a << 10); c -= a; c -= b; c ^= ( this.zeroFill( b, 15 ) ); var ret = new Array( (a), (b), (c) ); return ret; }, strord: function( string ) { var result = new Array(); for( i = 0; i < string.length; i++ ) { result[i] = string.charCodeAt( i); } return result; }, c32to8bit: function( arr32 ) { var arr8 = new Array(); for( i = 0; i < arr32.length; i++ ) { for( bitOrder = i * 4; bitOrder <= i * 4 + 3; bitOrder++ ) { arr8[bitOrder] = arr32[i] & 255; arr32[i] = this.zeroFill( arr32[i], 8 ); } } return arr8; }, myfmod: function( x, y ) { var i = Math.floor( x / y ); return ( x - i * y ); } }; function FormatInteger( integer ) { var pattern = "###,###,###,###"; var result = ''; integerIndex = integer.length - 1; patternIndex = pattern.length - 1; while( ( integerIndex >= 0 ) && ( patternIndex >= 0 ) ) { var digit = integer.charAt( integerIndex ); integerIndex--; // Skip non-digits from the source integer (eradicate current formatting). if( ( digit < '0' ) || ( digit > '9') ) continue; // Got a digit from the integer, now plug it into the pattern. while( patternIndex >= 0 ) { var patternChar = pattern.charAt( patternIndex ); patternIndex--; // Substitute digits for '#' chars, treat other chars literally. if( patternChar == '#' ) { result = digit + result; break; } else { result = patternChar + result; } } } return result; } })();