#!/usr/local/bin/perl

#┌─────────────────────────────────
#│  DAY COUNTER-EX v3.5 (2003/07/04)
#│  Copyright (c) KentWeb
#│  webmaster@kent-web.com
#│  http://www.kent-web.com/
#└─────────────────────────────────
$ver = 'DAY COUNTER-EX v3.5';
#┌─────────────────────────────────
#│ [注意事項]
#│ 1. このスクリプトはフリーソフトです。このスクリプトを使用した
#│    いかなる損害に対して作者は一切の責任を負いません。
#│ 2. 設置に関する質問はサポート掲示板にお願いいたします。
#│    直接メールによる質問は一切お受けいたしておりません。
#└─────────────────────────────────

#============#
#  設定項目  #
#============#

# ログファイル
$logfile = "./dayx.dat";

# 日次記録ファイル
$dayfile = "./day.dat";

# 月次記録ファイル
$monfile = "./mon.dat";

# 集計一覧からの戻り先
$home = "../jmkjlog.htm";

# 集計一覧のタイトル名
$title = "アクセス集計一覧";

# 集計ファイル一覧
$script = './dayxmgr.pl';

# タイトル文字色
$t_color = "#008080";

# グラフ画像
#  → 絶対パスなら http:// から書く
$graph1 = "./blue.gif";
$graph2 = "./red.gif";

# 月間グラフ幅の調整
# 1か月平均 4桁で50～100  5桁で200～500程度
$mKEY = 130;

# 日計グラフ幅の調整
# 1日平均 2桁で1～2  3桁で5～10  4桁で30～60程度
$dKEY = 2;

# bodyタグ
$body = '<body bgcolor="#F1F1F1" text="#000000" link="#0000FF" vlink="#800080">';

# パスワード
#  → ここに英数字でパスワードを記述すると「閲覧」には
#     このパスワードが必須となります。
$pass = '';

#============#
#  設定完了  #
#============#

# パスワード制限
if ($pass ne "") {
	local($key, $val, $buf);

	read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
	%in=();
	foreach ( split(/&/, $buf) ) {
		($key, $val) = split(/=/);
		$val =~ s/&/&amp;/g;
		$val =~ s/"/&quot;/g;
		$val =~ s/</&lt;/g;
		$val =~ s/>/&gt;/g;

		$in{$key} = $val;
	}
	if ($in{'pass'} eq "") {
		&header;
		print "<div align=center><h4>パスワードを入力して下さい</h4>\n";
		print "<form action=\"$script\" method=\"POST\">\n";
		print "<input type=password name=pass size=8>\n";
		print "<input type=submit value=' 認証 '></form></div>\n";
		print "</body></html>\n";
		exit;

	} elsif ($pass ne $in{'pass'}) {
		&error("パスワードが違います");
	}
}

# ログファイル読み込み
open(IN,"$logfile") || &error("Open Error : $logfile");
flock(IN,1);
@data = <IN>;
flock(IN,8);
close(IN);

$data = pop @data;
chop ($data);

# 記録ファイルを分解
($day,$yes,$to,$countlog) = split(/<>/, $data);

while ($countlog == 1) {
	$data = pop @data;
	chop ($data);

	# 記録ファイルを分解
	($day,$yes,$to,$countlog) = split(/<>/, $data);
}

# 時間取得
$ENV{'TZ'} = "JST-9";
($mday,$monnow,$year,$wday) = (localtime(time))[3..6];
@week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
$date = sprintf("%02d/%02d (%s) ", $monnow+1,$mday,$week[$wday]);

# 月間アクセスファイルを読み込み
open(IN,"$monfile") || &error("Open Error : $monfile");
flock(IN,1);
@monfile = <IN>;
flock(IN,8);
close(IN);
# popは、配列最後のレコードを返し、配列から最後のレコードは削除される。
$under = pop(@monfile);
##################
#push (@monfile,$under);
##################
$D_Y  = sprintf("%04d/%02d", $year+1900,$monnow+1);
#####################
$yearnow = $year + 1900;
#####################
if ($under =~ /^(\d+)\/(\d+)<>(\d+)/) { $Y="$1/$2"; $C=$3; }
if ($Y eq $D_Y) {
	$C2 = $C + $to;
	push(@monfile,"$Y<>$C2<>\n");
} else {
	push(@monfile,"$D_Y<>$to<>\n");
}

######################
$monnow++;
if ($monnow < 10) { $monnow = "0$monnow"; }
######################

# 日次アクセスファイルを読み込み
open(IN,"$dayfile") || &error("Open Error : $dayfile");
flock(IN,1);
@dayfile = <IN>;
flock(IN,8);
close(IN);
push(@dayfile,"$date<>0<>\n");

# HTMLを表示
&header;
print <<"EOM";
<TABLE cellspacing="0" cellpadding="0">
<TR><TD bgcolor="#B4B4B4" width="50" height="20" align="center" nowrap>
<A href="$home" style="color:#000000; text-decoration:none">戻る</A>
</TD></TR></TABLE>
<div align="center">
<hr width="300">
<b style="font-size:12pt; color:$t_color">$title</b>
<hr width="300">
<br>
[<a href="#day">日次アクセス一覧</a>]
[<a href="#mon">月次アクセス一覧</a>]
</div>
<br>
<table width="100%">
<tr><td bgcolor="#6D6D6D">　<font color="yellow">■</font>
  <font color="#FFFFFF"><b><a name="day">日次アクセス一覧</a></b></font>
</td></tr></table>
<br>
<blockquote>
<table border=0 cellpadding=1 cellspacing=0>
<tr>
  <th bgcolor=#D5FFD5>月日</th><th bgcolor=#D5FFD5>IP総数　</th>
  <th bgcolor=#D5FFD5>グラフ</th>
</tr>
EOM

$flag=0;
$tochu=0;

for (my $i = 0; $i <@dayfile; $i++) {
	chop;
	($m_d,$dcnt) = split(/<>/,$dayfile[$i]);
	# \d+は「数字1文字(\d)以上(+)続く文字」という意味である。
	# =~ は、@_ 以外の変数($m_d)に対してパターンマッチを行う時に使うもの。
	# 真ん中の「\/」=「文字列の"/"」の意味。つまり、これはm/ /である。
	if ($i == 1 && $m_d =~ /^(\d+)\/(\d+)/) {
		# ^は、行頭の意味
		# パターンマッチ（上の行）に成功すると、n個のグループ【( )内のこと】の文字列は特殊変数$1と$2…$nに残される。
		if ($2 != 1) { $tochu=1; }
	}

	# グラフ幅を指定
	if ($dcnt > 0) { $width = int($dcnt / ($dKEY * 5)); }
	else { $width=1; }
	if ($width < 1) { $width=1; }

	# 桁処理
	$dcnt = &filler($dcnt);

	# 色変更
	$m_d =~ s/Sat/<font color=blue>Sat<\/font>/;
	$m_d =~ s/Sun/<font color=red>Sun<\/font>/;

	$dayfile[$i] = "<tr><td nowrap>$m_d</td><td align=right> &nbsp; $dcnt &nbsp; </td><td><img src=\"$graph2\" width=$width height=5></td></tr>\n";
}

print @dayfile;
print <<"EOM";
</table></blockquote>
<br><br>
<table width="100%">
<tr><td bgcolor="#6D6D6D">　<font color="yellow">■</font>
<font color="#FFFFFF"><b><a name="mon">月次アクセス一覧</a></b></font>
</td></tr></table>
<br>
<blockquote>
<table border=0 cellpadding=2 cellspacing=0>
<tr bgcolor="#D5FFD5">
  <th nowrap>年月</th><th nowrap>&nbsp; 月間</th>
  <th nowrap>&nbsp; 日平均</th><th>&nbsp; グラフ</th>
</tr>
EOM

$flag=0;
foreach (@monfile) {
	($y_m,$mcnt) = split(/<>/);
	($year,$mon) = split(/\//, $y_m);

	if ($_ eq $monfile[$#monfile]) {
		# $day は、dayx.datの前回アクセス更新時日付
		if ($day == 1) { $avr = ' - '; }
		else {
			if ($tochu) { $waru = @dayfile-1; }
			else { $waru = $day-1; }
			if ($C > 0) {
				# int(式)は、式の整数値を返す。
				$avr = int (($C / $waru) +0.5);
				$avr = &filler($avr);
			} else { $avr = ' - '; }
		}
	} else {
		$lastday = &LastDay($year, $mon);
		$avr = int (($mcnt / $lastday) +0.5);
		$avr = &filler($avr);
	}

	# グラフ幅を指定
	if ($mcnt > 0) { $width = int($mcnt / $mKEY); }
	else { $width=1; }
	if ($width < 1) { $width=1; }

	# 桁処理
	$mcnt = &filler($mcnt);

	if ($year ne $year2) { print "<tr><td colspan=4><hr size=1></td></tr>\n"; }
	############################
	if (($mon eq $monnow) && ($year eq $yearnow)) {
		print "<tr><td nowrap>$y_m</td><td align=right>$mcnt</td>";
	} else {
		print "<tr><td nowrap><A HREF='ACLOG$year$mon\.htm'>$y_m</A></td><td align=right>$mcnt</td>";
	}
	############################
	print "<td align=right>$avr</td>";
	print "<td>&nbsp; <img src=\"$graph1\" width=$width height=10></td></tr>\n";

	$year2 = $year;
}

## 著作権表示（削除改変禁止）
print <<"EOM";
</table>
</blockquote>
<hr><div align="right">
<span style="font-family:Verdana,Helvetica,Arial; font-size:10px;">
Copyright (c) <a href="http://www.kent-web.com/" target="_top">KentWeb</a><br>
<b>$ver</b></span>
</div>
</body>
</html>
EOM
exit;

#----------------#
#  月の末日計算  #
#----------------#
sub LastDay {
	local($year, $mon) = @_;
	local($lastday);

	$lastday = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) [$mon - 1]
	+ ($mon == 2 && (($year % 4 == 0 && $year % 100 != 0) || $year % 400 == 0));

	$lastday;
}

#--------------#
#  HTMLヘッダ  #
#--------------#
sub header {
	print "Content-type: text/html\n\n";
	print <<"EOM";
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
<META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
<title>$title</title>
<STYLE TYPE="text/css">
<!--
body,tr,td,th { font-family: "MS UI Gothic", Tokorozawa; }
-->
</STYLE>
</head>
$body
EOM
}

#----------------#
#  桁区きり処理  #
#----------------#
sub filler {
	local($_) = $_[0];
	# "." は、「\n以外の任意の1文字」。"*" は、「適合文字列0個以上」の意味
	# \dは「数字1文字」
	1 while s/(.*\d)(\d\d\d)/$1,$2/;
	$_;
}

#--------------#
#  エラー処理  #
#--------------#
sub error {
	&header;
	print <<"EOM";
<div align="center">
<h3>ERROR !</h3>
<font color="red">$_[0]</font>
</div>
</body>
</html>
EOM
	exit;
}


__END__

