// 《参考URL》
// http://blogoscoped.com/archive/2004_06_27_index.html#108834386239051706

// Google PageRank 取得
function GetGooglePageRank(url, idResult) {

    // Google PageRank
    //var gpr = "-1";

    var reqgr = "info:" + url;

    // Google PageRank チェックサム
    var gch = GetGooglePageRankCheckSum(reqgr);

    // URLの正規表現パターン
    var patern = /^http:/;
    var patern2 = /^http:\/\/.*google\..*\/(search|images|groups|news).*/;
    var patern3 = /^http:\/\/localhost.*/;
    var patern4 = /^http:\/\/(127\.|10\.|172\.16|192\.168).*/; //ローカルIPアドレス

    if (!patern.test(url) || patern2.test(url) || patern3.test(url) || patern4.test(url)) {
        // 不正なURL → Google PageRank は取得しない

    /*
    } else if ((gisnewurl = isnewurl(gch)) >= 0) {
        // 取得OKキャッシュにある
        glastpr = gprcache[gisnewurl][1];
        $("#"+idResult).empty();
        DisplayGooglePageRank(idResult, glastpr);

    } else if ((gisnewurl = isnewurlna(gch)) >=0) {
        // 取得NGキャッシュにある
        glastpr = gprcachena[gisnewurl][1];
        $("#"+idResult).empty();
        DisplayGooglePageRank(idResult, glastpr);
    */

    } else {
        // 現在読込中 表示
        NowLoadingStart(idResult);
        // クエリストリング
        var reqgre = "info:" + URLencode(url);
        // Google PageRank 取得
        $.ajax({
             url        : "./WebSearchUrlByGoogle.aspx?m=2&q="+reqgre+"&ch="+gch
            ,dataType   : "text"
            ,cache      : true
            //,timeout    : 5000
            ,success    : function(data) {
                // 現在読込中 削除
                NowLoadingEnd(idResult);
                // 取得成功
                var foo = data.match(/Rank_.*?:.*?:(\d+)/i);
                var pr = (foo) ? foo[1] : "-1";
                /*
                glastpr = pr;
                gpr = pr;
                if (glastpr != "-1") {
                    gprcache.push(new Array(gch, glastpr));
                } else {
                    gprcachena.push(new Array(gch, glastpr));
                }
                */
                DisplayGooglePageRank(idResult, pr);
            }
            ,complete   : function(xhreq, status) {
                if (status != "success") {
                    // 現在読込中 削除
                    NowLoadingEnd(idResult);
                    // 取得失敗
                    /*
                    glastpr = "-1";
                    gpr = "-1";
                    if (glastpr != "-1") {
                        gprcache.push(new Array(gch, glastpr));
                    } else {
                        gprcachena.push(new Array(gch, glastpr));
                    }
                    */
                    DisplayGooglePageRank(idResult, "-1");
                }
             }
        });
    }
    //glasturl = url;
}

function DisplayGooglePageRank(idResult, pr) {
    if(pr != "-1") {
        $("#"+idResult).append(
            $("<img>").attr("class", "").attr("src", "image/pagerank/pr"+pr+".gif").attr("alt", pr).attr("title", pr+"/10")
        );
    } else {
        $("#"+idResult).append("取得できませんでした");
    }
}

// Google PageRank チェックサム取得
function GetGooglePageRankCheckSum(url) {
    var ggg = GoogleCH(strord(url));
    ggg = "6" + GoogleNewCh(ggg);
    return ggg
}

// 10進数 → 16進数
function hexdec(str)
{
    return parseInt(str,16);
}

// ゼロ埋め
function zeroFill(a, b)
{
    var z = hexdec(80000000);
    if (z & a)
    {
        a = a>>1;
        a &= ~z;
        a |= 0x40000000;
        a = a>>(b-1);
    }
    else
    {
        a = a >> b;
    }
    return (a);
}

// MIX
function mix(a,b,c)
{
    a -= b; a -= c; a ^= (zeroFill(c,13));
    b -= c; b -= a; b ^= (a<<8);
    c -= a; c -= b; c ^= (zeroFill(b,13));
    a -= b; a -= c; a ^= (zeroFill(c,12));
    b -= c; b -= a; b ^= (a<<16);
    c -= a; c -= b; c ^= (zeroFill(b,5));
    a -= b; a -= c; a ^= (zeroFill(c,3));
    b -= c; b -= a; b ^= (a<<10);
    c -= a; c -= b; c ^= (zeroFill(b,15));
    var ret = new Array((a),(b),(c));
    return ret;
}

// Google PageRank チェックサム
function GoogleCH(url,length)
{
    var init = 0xE6359A60;
    if (arguments.length == 1)
      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 = 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 = mix(a,b,c);
    if (mixo[2] < 0)
    return (0x100000000 + mixo[2]);
    else
    return mixo[2];
}


// 文字列をASCII値の配列に変換
function strord(string)
{
    var result = new Array();
    for(var i=0;i<string.length;i++)
    {
        result[i] = string.charCodeAt(i);
    }
    return result;
}

// 32bit配列 → 8bit配列 変換
function c32to8bit(arr32)
{
    var arr8 = new Array();
    for(var i=0;i<arr32.length;i++)
    {
      for (var bitOrder=i*4;bitOrder<=i*4+3;bitOrder++)
      {
            arr8[bitOrder]=arr32[i]&255;
            arr32[i]=zeroFill(arr32[i], 8);
        }
    }
    return arr8;
}

//
function myfmod(x,y)
{
   var i = Math.floor(x/y);
        return (x - i*y);
}

// Google PageRank チェックサム
function GoogleNewCh(ch)
{
   ch = (((ch/7) << 2) | ((myfmod(ch,13))&7));

   var prbuf = new Array();
   prbuf[0] = ch;
   for(var i = 1; i < 20; i++) {
            prbuf[i] = prbuf[i-1]-9;
   }
   ch = GoogleCH(c32to8bit(prbuf), 80);
   return ch;

}

/*
// 最後に取得したデータ
//var glastpr;
//var glasturl;

// Google PageRank キャッシュ
//var gisnewurl = 0;              // 新しいURL（チェックサム）
//var gprcache = new Array();     // 取得OKキャッシュ
//var gprcachena = new Array();   // 取得NGキャッシュ


// 新しいURLか？（取得OKキャッシュにないか？）
function isnewurl(hash)
{
    var i=0;
    var trouve=-1;
    while (trouve==-1 && (i < gprcache.length))
    {
        if (gprcache[i][0] == hash)
        {
            trouve = i;
            break;
        }
        i++;
    }
    return trouve;
}
// 新しいURLか？（取得NGキャッシュにないか？）
function isnewurlna(hash)
{
    var i=0;
    var trouve=-1;

    while (trouve==-1 && (i < gprcachena.length))
    {
        if (gprcachena[i][0] == hash)
        {
            trouve = i;
            break;
        }
        i++;
    }
    return trouve;
}
*/

