#!/usr/bin/perl
use strict;

sub ReturnNumbGIF($);
sub DataToke($);
sub HumanTime(;$);

sub CNTDIR	{ "/data/vhosts/deep-forest.com/www/cgi-bin/cntr/"; }
sub LOGDIR	{ "/data/vhosts/deep-forest.com/www/cgi-bin/logs/"; }

my @rgNumb;
my $iNumb = 0;
my %FORM;

@rgNumb[0] = [qw(
				00111100
				01000010
				01000010
				01000010
				01000010
				01000010
				01000010
				01000010
				01000010
				00111100
				)];
@rgNumb[1] = [qw(
				00010000
				01110000
				00010000
				00010000
				00010000
				00010000
				00010000
				00010000
				00010000
				01111100
				)];
@rgNumb[2] = [qw(
				00111100
				01000010
				00000010
				00000010
				00000100
				00001000
				00010000
				00100000
				01000000
				01111110
				)];
@rgNumb[3] = [qw(
				00111100
				01000010
				00000010
				00000010
				00011100
				00000010
				00000010
				00000010
				01000010
				00111100
				)];
@rgNumb[4] = [qw(
				00000100
				00001100
				00010100
				00010100
				00100100
				01000100
				01111110
				00000100
				00000100
				00001110
				)];
@rgNumb[5] = [qw(
				01111110
				01000000
				01000000
				01000000
				01111100
				00000010
				00000010
				00000010
				01000010
				00111100
				)];
@rgNumb[6] = [qw(
				00011100
				00100000
				01000000
				01000000
				01011100
				01100010
				01000010
				01000010
				01000010
				00111100
				)];
@rgNumb[7] = [qw(
				01111110
				01000010
				00000100
				00000100
				00001000
				00001000
				00010000
				00010000
				00100000
				00100000
				)];
@rgNumb[8] = [qw(
				00111100
				01000010
				01000010
				01000010
				00111100
				01000010
				01000010
				01000010
				01000010
				00111100
				)];
@rgNumb[9] = [qw(
				00111100
				01000010
				01000010
				01000010
				01000110
				00111010
				00000010
				00000010
				00000100
				00111000
				)];

DataToke(\%FORM);
$FORM{'page'} = "unknown" if (!defined($FORM{'page'}) || ($FORM{'page'} eq ""));
if (open(LOGFILE, ">>".LOGDIR.$FORM{'page'}.".log"))
	{
	select((select(LOGFILE), $|=1)[0]);
	print LOGFILE $ENV{'REMOTE_ADDR'}."|".HumanTime."|".$ENV{'HTTP_USER_AGENT'}."\n";
	close LOGFILE;
	}
if ($FORM{'logall'} eq "true")
	{
	if (open(LOGFILE, ">>".LOGDIR."all.log"))
		{
		select((select(LOGFILE), $|=1)[0]);
		print LOGFILE $ENV{'REMOTE_ADDR'}."|".HumanTime."|".$FORM{'page'}."|".$ENV{'HTTP_USER_AGENT'}."\n";
		close LOGFILE;
		}
	}

if (open(CNTFILE, "<".CNTDIR.$FORM{'page'}.".cnt"))
	{
	$iNumb = <CNTFILE>;
	close CNTFILE;
	}
$iNumb++ if ($FORM{'noinc'} ne "true");
if (open(CNTFILE, ">".CNTDIR.$FORM{'page'}.".cnt"))
	{
	print CNTFILE $iNumb;
	close CNTFILE;
	}
binmode STDOUT;
if ($FORM{'nogif'} eq "true")
        {
        print qq|Content-type: text/html\n\n|;
        print qq|<!-- Hits=$iNumb -->\n|;
        return;
        }
print qq|Content-type: image/gif\n\n|;
ReturnNumbGIF($iNumb);



#################################################################
## NAME:	RETURNNUMBGIF
## DESC:	
## PARAMS:	
## RETURNS:	
## AUTHOR:	JAK
sub ReturnNumbGIF($)
	{
	my $numb = $_[0];
	my ($data, $datahold, $datablk);
	my ($i, $j);

	print "GIF89a";
	print pack("C", (8*length($numb)));
	print "\x00";
	print "\x0A";
	print "\x00";
	print "\xF2";
	print "\x00";
	print "\x00";
	print "\x00\x00\x00";
	print "\x00\x00\xFF";
	print "\x00\x00\x00";
	print "\x00\x00\x00";
	print "\x00\x00\x00";
	print "\x00\x00\x00";
	print "\x00\x00\x00";
	print "\x00\x00\x00";
	print "\x21\xF9\x04\x01\x00\x00";
	print "\x00";
	print "\x00";
	print "\x2C";
	print "\x00\x00";
	print "\x00\x00";
	print pack("C", (8*length($numb)));
	print "\x00";
	print "\x0A";
	print "\x00";
	print "\x00";
	print "\x03";

	$data = "";
	for ($j=0; $j<10; $j++)
		{
		my $l;

		for ($l=0; $l<length($numb); $l++)
			{
			my $idx = substr($numb, $l, 1);
			my $k;

			for ($k=0; $k<5; $k+=4)
				{
				$data .= "\x08";
				for ($i=0; $i<4; $i++)
					{
					$data .= pack("C", (substr($rgNumb[$idx][$j], $i+$k, 1)+0))
					}
				}
			}
		}
	$data .= "\x09";
	$data .= "\x00" unless ((length($data) / 2) == int(length($data) / 2));

	$datahold = "";
	for ($i=0; $i<length($data); $i+=2)
		{
		$datahold .= pack("H2", unpack("C", substr($data, $i+1, 1)) . unpack("C", substr($data, $i, 1)));
		}
	$data = $datahold;

	$datablk = substr($data, 0, 255);
	while (length($datablk) != 0)
		{
		$data = substr($data, length($datablk));
		print pack("C", length($datablk)) . $datablk;
		$datablk = substr($data, 0, 255);
		}

	print "\x00";
	print "\x3B";
	}

#################################################################
## NAME:	DATATOKE
## DESC:	
## PARAMS:	
## RETURNS:	
## AUTHOR:	JAK
sub DataToke($)
	{
	my $FORM = shift;
	my $buffer;
	my $szPair;
	my @rgszPairs;

	if ($ENV{'REQUEST_METHOD'} eq "POST")
		{ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }
	elsif ($ENV{'REQUEST_METHOD'} eq "GET")
		{ $buffer=$ENV{'QUERY_STRING'}; }
	else
		{ return; }

	@rgszPairs = split(/&/, $buffer);

	foreach $szPair (@rgszPairs)
		{
		my ($szName, $szValue) = split(/=/, $szPair);
		$szValue =~ tr/+/ /;
		$szValue =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
		$szName =~ tr/+/ /;
		$szName =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
		if ((defined($FORM->{$szName})) && ($FORM->{$szName} ne ""))
			{ $FORM->{$szName} .= ",".$szValue; }
		else
			{ $FORM->{$szName} = $szValue; }
		}
	}

#################################################################
## NAME:	HumanTime
## DESC:	
## PARAMS:	
## RETURNS:	
## AUTHOR:	JAK
sub HumanTime(;$)
	{
	my $szTime = defined($_[0])?$_[0]:time;

	my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($szTime);
	my @rgszMonth = ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");

	return sprintf("%02d/%s/%04d %02d:%02d:%02d", $mday, $rgszMonth[$mon], $year+1900, $hour, $min, $sec);
	}

