#!/usr/local/bin/perl

;#------------------------------------------------------
;# (SSI式)
;#  FLY利用 画像一体型グラフィカルアクセスカウンタ v1.00
;#  (c)rescue.ne.jp
;#
;#------------------------------------------------------

# 設置構成(参考例)
#
# ホームページディレクトリ
#            |
#            |-- index.html (このファイルにカウンタを表示する) (*)
#            |
#            |          このファイルのカウンタを表示させたい場所に次のSSIコマンドを書く.
#            |          <!--#exec cmd="./count/fcount.pl"-->
#            |
#            |---- count/ <777>
#            |       |
#            |       |-- fly (GIF画像合成ソフト) <755>
#            |       |-- fcount.pl (このスクリプト) <755>
#            |       |-- count.txt (カウント開始数が入ったファイル) <666>
#            |
#            |---- images/
#                    |
#                    |-- 0.gif (数字画像 0)
#                    |-- 1.gif (数字画像 1)
#                    |-- 略
#                    |-- 9.gif (数字画像 9)

#■(*)印のファイルから見たcount/ディレクトリの位置を設定(パス) <絶対パスで書いてもよい>
$basedir = './count/';

#■(*)印のファイルから見たcount/ディレクトリの位置を設定(ＵＲＬ) <http://から書いてもよい>
$baseurl = './count/';

#■(*)印のファイルから見たimages/ディレクトリの位置を設定(パス) <絶対パスで書いてもよい>
$digit_dir = './images/';

#■(*)印のファイルから見たflyの位置を設定(パス) <絶対パスで書いてもよい>
$flyprog = "./count/fly";

#■合成元画像１つのサイズ(x:幅 y:高さ) 単位:ピクセル
$width = 15; $height = 20;

#■表示桁数(カウント数1234の場合に6桁に設定すると001234となる) 
$wd = 1;

#■表示画像を透過ＧＩＦにする (0:しない 1:する)
$transparent = 0;

#■透過ＧＩＦにする場合に透過させる色(R,G,B)
$transparent_color = '0,0,0';

#■表示画像をインターレス表示にする (0:しない 1:する)
$interlace = 1;

#■ＣＧＩ二重起動防止ロック処理
#　通常は 1 に設定しますが、symlinkの使えない極一部のサーバでは「常にBUSY」になりますので、
#　その場合は 2 に設定してください.　1 よりも 2 の方が処理が甘くなります.
#
#  　0:ロック処理しない 1:ロック処理(symlink) 2:ロック処理(open)

$lock_key = 1;


#◇--- ここから先は十分な知識がない場合は改変しないこと ---◇

$file = $basedir . 'count.txt';
$lockfile = $basedir . 'fcount.lock';

if ($lock_key == 1) { &lock; }
elsif ($lock_key == 2) { &lock2; }

if (!open(IN,$file)) { &error('ERROR2'); }
$count = <IN>;
close IN;

$count++;

if (!open(NEW,">$file")) { &error('ERROR2'); }
print NEW $count;
close NEW; 

&make_image;

print "<img src=\"$outimage\" alt=\"$xxx\" border=0 width=$img_width height=$img_height>";

if (-e $lockfile) { unlink($lockfile); }
exit;

sub make_image {

$cl = length($count);
if ($cl < $wd) { $zero = '0' x ($wd - $cl); $xxx = $count = "$zero$count"; }
else { $xxx = $count; }

$num = $length = length($count);
while ($num > 0) { $CHAR{$num} = chop($count); $num--; }

$img_width = ($width * $length);
$img_height = $height;

$infile = $basedir . "fly.$$";
$outfile = $basedir . "temp.gif";
$outimage = $baseurl . "temp.gif";

open(FLY,"> $infile");

print FLY "new\n";
print FLY "size $img_width,$img_height\n";

$insert_frame = $insert_width = $insert_height = 0;

while ($insert_frame < 0) {

	$current_width = ($img_width - $insert_frame);
	$current_height = ($img_height - $insert_frame);
	print FLY "line 0,$insert_frame,$img_width,$insert_frame\n";
	print FLY "line $insert_frame,0,$insert_frame,$img_height\n";
	print FLY "line $current_width,0,$current_width,$img_height\n";
	print FLY "line $current_height,0,$current_height,$img_width\n";
	$insert_frame++;
}

$j = 1;
while ($j <= $length) {

	# Reference = http://worldwidemart.com/scripts/
	print FLY "copy $insert_width,$insert_height,-1,-1,-1,-1,$digit_dir$CHAR{$j}\.gif\n";
	$insert_width = ($insert_width + $width); 
	$j++;
}

if ($transparent) { print FLY "transparent $transparent_color\n"; }
if ($interlace) { print FLY "interlace\n"; }

close(FLY);

unlink($outfile);

open(FOO,"$flyprog -q -i $infile -o $outfile |");
while(<FOO>) { print; }
close(FOO);

unlink($infile);
}

sub lock {

	local($retry) = 3;
	while (!symlink(".", $lockfile)) {

		if (--$retry <= 0) { &error('BUSY'); }
		sleep(2);
	}
}

sub lock2 {

	$c = 0;
	while(-f "$lockfile") {

		$c++;
		if ($c >= 3) { &error('BUSY'); }
		sleep(2);
	}
	open(LOCK,">$lockfile");
	close(LOCK);
}

sub error {

	if (-e $lockfile) { unlink($lockfile); }
	print $_[0];
	exit;
}
