(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)
{
//PRO_log(req.responseText);
if(gCookie == cookie) {
if(isOK)
{
var re = /TEXT=\"(\d+)\"\/\>/i;
var alexaRank =
req.responseText.match(re);
if(alexaRank.length > 1)
gAlexaRank =
alexaRank[1];
else
gAlexaRank = "0";
} else {
gAlexaRank =
"0";
}
if(gGoogleRank.length > 0)
{
processResult();
}
}
}
function processGoogleData(isOK, req, cookie) {
if(gCookie == cookie)
{
if(isOK) {
var re = /Rank_.*?:.*?:(\d+)/i;
var googleRank =
req.responseText.match(re);
if(googleRank.length > 1)
gGoogleRank =
googleRank[1];
else
gGoogleRank = "0";
} else {
gGoogleRank =
"0";
}
if(gAlexa.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;
}
}
)();
