#!/usr/bin/perl

&_GET;

$rate_dir = './rate.logs/';
$log_history = './rate.logs/rate.log.history.cgi';
$rate_seek = 10;
$unknown_rate = '未評価';

$uri = 'http://' . $ENV{'SERVER_NAME'} . $ENV{'SCRIPT_NAME'};

$time = time;
($sec,$min,$hour,$day,$mon,$year) = localtime($time);
$stmp = sprintf("%04d-%02d-%02d %02d:%02d:%02d",$year += 1900,$mon+1,$day,$hour,$min,$sec);

if($ENV{'HTTP_REFERER'}){
	if($_GET{'rate'} ne $null && $_GET{'time'} ne $null && ($time - $_GET{'time'}) > $rate_seek){
		$ref = $ENV{'HTTP_REFERER'};
		$ref =~ s/index\.html//ig;
		$path = $rate_dir . &encodeURI($ref) . '.cgi';
		if(-f $path){
			@log = &_LOAD($path);
			($cnt,$rate) = split(/\t/,$log[0]);
			$cnt++;
			$rate += $_GET{'rate'};
			@rate = ($cnt,$rate);
			$log[0] = join("\t",@rate);
		}
		else {
			@rate = (1,$_GET{'rate'});
			$log[0] = join("\t",@rate);
		}
		$sec = $time - $_GET{'time'};
		push @log,"${stmp}\t$_GET{'rate'}\t${sec}\t$ENV{'REMOTE_ADDR'}\t$ENV{'HTTP_USER_AGENT'}";
		&_SAVE($path,join("\n",@log));
		&_ADDSAVE($log_history,"${stmp}\t$ENV{'HTTP_REFERER'}\t$_GET{'rate'}\t${sec}\t$ENV{'REMOTE_ADDR'}\t$ENV{'HTTP_USER_AGENT'}");
	}
	else {
		$js = join("\n",&_LOAD('./rate.js'));
		$js =~ s/_%%uri%%_/$uri/ig;
		$js =~ s/_%%time%%_/$time/ig;
		$ref = $ENV{'HTTP_REFERER'};
		$ref =~ s/index\.html//ig;
		$path = $rate_dir . &encodeURI($ref) . '.cgi';
		if(-f $path){
			@log = &_LOAD($path);
			($cnt,$rate) = split(/\t/,$log[0]);
			$rate = sprintf("%.2f",$rate/ $cnt);
			$js =~ s/_%%rate%%_/$rate/ig;
			$js =~ s/_%%cnt%%_/$cnt/ig;
		}
		else {
			$js =~ s/_%%rate%%_/$unknown_rate/ig;
			$js =~ s/_%%cnt%%_/0/ig;
		}
	}
}
else {
	$js = '';
}

print "Pragma: no-cache\n";
print "Cache-Control: no-cache\n";
print "Content-type: text/plain; charset=UTF-8\n\n";
print $js;
exit;

sub _GET {
	if ($ENV{'REQUEST_METHOD'} eq "POST") {
		read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
	}
	else {
		$buffer = $ENV{'QUERY_STRING'};
	}
	@pairs = split(/&/, $buffer);
	foreach $pair (@pairs) {
		($name, $value) = split(/=/, $pair);
		$name =~ tr/+/ /;
		$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
		$value =~ tr/+/ /;
		$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
		$_GET{$name} = $value;
	}
}
sub _SAVE {
	my($path,$str) = @_;
	chmod 0777,$path;
	flock(FH, LOCK_EX);
		open(FH,">${path}");
			print FH $str;
		close(FH);
	flock(FH, LOCK_NB);
	chmod 0600,$path;
}
sub _ADDSAVE {
	my($path,$str) = @_;
	chmod 0777,$path;
	flock(FH, LOCK_EX);
		open(FH,">>${path}");
			print FH $str . "\n";
		close(FH);
	flock(FH, LOCK_NB);
	chmod 0600,$path;
}
sub _LOAD {
	my($path) = @_;
	my(@loader) = ();
	flock(FH, LOCK_EX);
		open(FH,$path);
			@loader = <FH>;
		close(FH);
	flock(FH, LOCK_NB);
	$loader = join('',@loader);
	$loader =~ s/\r//ig;
	@loader = split(/\n/,$loader);
	return @loader;
}
sub decodeURI {
	my($str) = @_;
	$str =~ tr/+/ /;
	$str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
	return $str;
}

sub encodeURI {
	my($str) = @_;
	$str =~ s/([^\w ])/'%' . unpack('H2', $1)/eg;
	$str =~ tr/ /+/;
	return $str;
}