#!/usr/bin/perl

#######################################################################
# Counter
#######################################################################

require "common.pl";

use GD;


$| = 1;
$webmaster = "webmaster\@reichardt\.ch";

$lock   = 2;
$unlock = 8;
$nr     = 1;

# Woher stammt die Anfrage (z.b. www.luis.ch) ?
&parse_form_data(*simple_form);                             
$_ = $simple_form{'userid'};
@_ = split(/\//,$_);
$counter_file = pop(@_);
#$counter_file = "/var/www/htdocs/luis.ch/counters/"."$counter_file";
$counter_file = "/var/www/counters/" . "$counter_file";  

#$counter_file = $ENV{"DOCUMENT_ROOT"} . "/counter\.txt";  
#in diesem Verzeichnis counter.txt 



$bgcolor = $simple_form{'bgcolor'};
$fcolor  = $simple_form{'fcolor'};
$grid    = $simple_form{'grid'};


#Hintergrund- und Schriftfarbe in zweier Portionen(RGB-Werte 
# (HTML also HEX)) zerlegen
#mit substr wird der Farbcode zerlegt
#dieses einzele Element wird via hex in eine Dezimalzahl 
# gewandelt und anschliessend im Array gespeichert
for ($i = 0; $i <= 2; $i++) {
	$bgcolor[$i] = hex(substr($bgcolor,$i * 2 ,2));
	$fcolor[$i]  = hex(substr($fcolor, $i * 2 ,2));
	$grid[$i]    = hex(substr($grid,   $i * 2 ,2));
}


if (!(-e $counter_file)) {
	if(open (COUNTER,">$counter_file"))
	{
		flock(COUNTER, $lock);
		print COUNTER $nr;
		flock(COUNTER, $unlock);
		close(COUNTER);
	}else{
		&return_error(500,"Counter Error",
		    "Counter file could not be created!");
	}	
}
else
{
	if(!((-e $counter_file) && (-w $counter_file))) {
		&return_error(500, "Counter Error",
		    "Cannot write or read counter file");
	}else
	{
		open(COUNTER,"<$counter_file");
		flock(COUNTER, $lock);
		chomp($nr = <COUNTER>);
		flock(COUNTER,$unlock);
		close(COUNTER);
		$nr++;
		open(COUNTER,">$counter_file");
		flock(COUNTER, $lock);
		print COUNTER $nr;
		flock(COUNTER, $unlock);
		close(COUNTER);
	}	
}

&graphic_counter();
&logfile();

exit(0);

sub graphic_counter
{
	local($count_length, $font_length, $font_height, 
	    $distance, $border, $image_length,
	    $image_height, $image, $bgcolor, $fcolor, 
	    $grid, $loop, $number, $temp_x);
	
	$count_length = length($nr);
	$font_height = 16;
	$font_length =  8;
	$distance    =  3;
	$border      =  4;
	
	$image_length = ($count_length * $font_length) + 
			(($count_length - 1) * $distance) + $border;
	$image_height = $font_height + $border;
	$image        = new GD::Image ($image_length,$image_height);
	
	$bgcolor = $image->colorAllocate(@bgcolor);
	$fcolor  = $image->colorAllocate(@fcolor);
	$grid   = $image->colorAllocate(@grid);
	
	$image->rectangle(0, 0, $image_length - 1, 
	    $image_height - 1, $grid);
	
	for($loop = 0; $loop <= ($count_length - 1); $loop++) {
		$number = substr($nr, $loop, 1);	
	
		if ($count_length > 1) 	
		{
			$temp_x = ($font_length + $distance) 
				* ($loop + 1);
			$image->line (	$temp_x,
					0,
					$temp_x,
					$image_height,
					$grid);
		}
		
		$image->char (	gdLargeFont,
			    ($border / 2) + ($font_length * $loop) 
			    + ($loop * $distance),
			    $distance,
			    $number,
			    $fcolor);
	}
	
	print "Content-type: image/jpeg","\n\n";
	print $image->jpeg;
}





sub logfile 
{
	if (open(LOGFILE,">>$counter_file".".log")) 
	{
		$_= localtime(time);
		print LOGFILE "$_ $ENV{'REMOTE_ADDR'} 
		    $ENV{'HTTP_USER_AGENT'} $ENV{'HTTP_REFERER'}\n";
		close(LOGFILE);
	} else {
		&return_error(500, "Counter Error",
		    "Cannot write or read counter logfile");
	}
	
}


