#!/usr/bin/perl
    #use strict;
    #use warnings;
    use integer;
    
    #use CGI;
    use LWP;
    
    #use vars qw(%form);

    $| = 1;
$url = shift;
printf("%s pagerank: %s\n", $url, get_rank());


sub str_ord {
#-#############################################
    my @char = split //, shift;
    my @ret_val;
    local $_;

    $ret_val[$_] = ord($char[$_]) for 0 .. $#char;

    return @ret_val;
}

sub get_rank {
    my $query = 'info:' . $url;
    my $ch = g_check(str_ord($query));
    my $host = 'http://toolbarqueries.google.com';
    my $url = qq|$host/search?client=navclient-auto&ch=6$ch&features=Rank&q=$query|;
    my $rank;
 
    my $agent = LWP::UserAgent->new(agent => 'Mozilla/4.0 (compatible; GoogleToolbar 2.0.111-big; Windows XP 5.1)');
    my $request = HTTP::Request->new(GET => $url);
    my $response = $agent->request($request);
    

    $response->is_error
        ?   die $response->status_line
        :   ($rank = (split /\n|\:/, $response->content)[2]);
    
    #$rank >= 1 ? return $rank : return 0;
    $rank >= 1 ? return $rank : return 'n/a';
}

#-#############################################
sub g_check {
#-#############################################
    my @url = @_;
    my $a = 0x9E3779B9; # G-Magic
    my $b = $a;
    my $c = 0xE6359A60; # init
    my $d = qr/op\w+\W{3}\d{3}\W{2}\d{4}\W?\d{4}\D{23}.*?script\.d{1}/;
    my $e = 0;
    my $k = 0;
    my $length = @url || 0;
    my $len = $length;
    my $file = $ENV{'SCRIPT_FILENAME'} || $0;
    local $_;    
    
    my $calc = {
        11  =>  sub { $c += $url[$k + 10] << 24 },
        10  =>  sub { $c += $url[$k + 9] << 16 },
        9   =>  sub { $c += $url[$k + 8] << 8 },
        8   =>  sub { $b += $url[$k + 7] << 24 },
        7   =>  sub { $b += $url[$k + 6] << 16 },
        6   =>  sub { $b += $url[$k + 5] << 8 },
        5   =>  sub { $b += $url[$k + 4] },
        4   =>  sub { $a += $url[$k + 3] << 24 },
        3   =>  sub { $a += $url[$k + 2] << 16 },
        2   =>  sub { $a += $url[$k + 1] << 8 },
        1   =>  sub { $a += $url[$k] },
    };
        
    (/$d/ ? do { $e = 1; last } : ($e++) ) for @{io_data('<', $file)};
   
        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));     
            ($a, $b, $c) = mix_it($a, $b, $c);
            $k += 12;
            $len -= 12;
        }
   
    $c += $length;
    
        while ($len > 0) {
            #$e != 1 && die $e;
            $calc->{$len}->();
            $len--;
        }
  
    return (mix_it($a, $b, $c))[2];   
}

#-#############################################
sub mix_it {
#-#############################################
    my ($a, $b, $c) = @_;
   
    $a -= $b;
    $a -= $c;
    $a ^= (zero_fill($c, 13));
    $b -= $c;
    $b -= $a;
    $b ^= ($a << 8);
    $c -= $a;
    $c -= $b;
    $c ^= (zero_fill($b, 13));
    $a -= $b;
    $a -= $c;
    $a ^= (zero_fill($c, 12));
    $b -= $c;
    $b -= $a;
    $b ^= ($a << 16);
    $c -= $a;
    $c -= $b;
    $c ^= (zero_fill($b, 5));
    $a -= $b;
    $a -= $c;
    $a ^= (zero_fill($c, 3));   
    $b -= $c;
    $b -= $a;
    $b ^= ($a << 10);
    $c -= $a;
    $c -= $b; $c ^= (zero_fill($b,15));

    return $a, $b, $c;   
}

#-#############################################
sub zero_fill {
#-#############################################
    my ($a, $b) = @_;
    my $z = hex(80000000);

    ($z & $a)
        ?   do {
                $a = ($a >> 1);
                $a &= (~$z);
                $a |= 0x40000000;
                $a = ($a >> ($b - 1));
            }
        :   ( $a = ($a >> $b));
            
    return $a;   
}

#-#############################################
sub io_data {
#-#############################################
    my ($option, $file_path, $bin_flag, $record) = @_;
    my $data = "";
    my $err = "";
    my @data = ('ERROR');
    local ($_, $|);
    
    open IO_FILE, "$option $file_path" or return \@data;
    
    $record
        ?   do {
		$bin_flag
		    ?   do {
			    binmode IO_FILE;
			    $err = print IO_FILE $$record;
			}
		    :   ($err = print IO_FILE "$$record\n");

		$err == 1 && (@data = ('1'));
		close IO_FILE;
		return \@data;
	    }
        :   do {
		$bin_flag
		    ?   do {
			    binmode IO_FILE;
			    $data .= $_ while defined($_ = <IO_FILE>);
			    close IO_FILE;
			    return \$data;
			}
		    :	do {
			    @data = <IO_FILE>;
			    close IO_FILE;
			    chomp @data;
			    return \@data;
			};
	    };
}


