# Bloxsom Plugin: naruto
# Author: Yasuhiro Matsumoto <mattn.jp@gmail.com>
# Version: 0.1

package naruto;

use strict;
use CGI;
use vars qw($link $response);

my $naruto_file = "$blosxom::plugin_state_dir/naruto.dat";
my $naruto_image = "http://mattn.kaoriya.net/images/naruto.gif";
my @ignore_hosts   = qw(
);
my %narutos;
$blosxom::template{'naruto'} = {
  'content_type' => 'text/javascript',
  'head'         => '$naruto::response',
  'date'         => ' ',
  'story'        => ' ',
  'foot'         => ' '
};

sub start {
  my($path, $fn) = ($blosxom::path_info =~ m!^(?:(.*)/)?(.*)\.$blosxom::flavour!);
  open (DATA, "<$naruto_file");
  flock (DATA, 2);
  while(my $line = <DATA>){
    my ($id,$count) = ($line =~ m!^([^,]+),(\d+)!);
    $narutos{$id} = 0 + $count;
  }
  close (DATA);
  flock(DATA, 8);

  if (param('plugin') ne 'naruto') {
    return 1;
  }
  my $remote_ip = $ENV{'REMOTE_ADDR'};
  my $ignore_ip = 'disable' if ($remote_ip eq "");
  if(grep{ my $host =~ /$_/ } @ignore_hosts){
    return 1;
  }
  $narutos{"/$path/$fn"}++;

  open (DATA, ">$naruto_file");
  flock (DATA, 2);
  foreach my $id (keys %narutos) {
    print DATA "$id,$narutos{$id}\n";
  }
  close (DATA);
  flock(DATA, 8);

  my $callback = param("callback");
  $callback = "callback" if not $callback;
  my $votes = $narutos{"/$path/$fn"};
  $response = "$callback('naruto_$fn',$votes);\n";
  1;
}

sub head {
  my($pkg, $path, $head_ref) = @_;
  if ($blosxom::flavour eq "html" or $blosxom::flavour eq "htm") {
    $$head_ref .= <<EOF;
<script type="text/javascript"><!--
function narutoCallback(naruto_id, naruto_count) {
  document.getElementById(naruto_id).innerHTML = naruto_count;
}
function do_naruto(url,naruto_id) {
  document.getElementById(naruto_id).innerHTML = '...';
  var script = document.createElement("script");
  script.charset = "utf-8";
  script.src = url + "?plugin=naruto&callback=narutoCallback";
  document.lastChild.appendChild(script);
}
--></script>
EOF
  }
  1;
}

sub story {
  my($path, $fn) = ($blosxom::path_info =~ m!^(?:(.*)/)?(.*)\.$blosxom::flavour!);
  my $votes = 0 + $narutos{"/$path/$fn"};
  $link = "<a href=\"javascript:do_naruto('$blosxom::url/$path/$fn.naruto','naruto_$fn');void(0);\" class=\"naruto\"><img src=\"$naruto_image\" title=\"naruto\" alt=\"naruto\" border=\"0\" align=\"absmiddle\" />(<span id=\"naruto_$fn\">$votes</span>)</a>";
  1;
}

sub get_host{
  my($addr,$host);
  $addr = $ENV{REMOTE_ADDR};
  $host = $ENV{REMOTE_HOST};
  if(!$host || $host eq $addr){
    $host = gethostbyaddr(pack('C4',split(m!\.!,$addr)),2) || $addr;
  }
  return $host;
}

1;
