#!/usr/bin/perl

# ログファイル
$sougoufile = "./sougou.dat";

# 1日間記録ファイル
$dayfile = "./day.txt";

# 蓄積1日間記録ディレクトリ
$tdaydirect = "./tday";

# 1ヶ月間記録ファイル
$monfile = "./mon.txt";

# 蓄積 1ヶ月間記録ファイル
$tmonfile = "./tmon.txt";

print "Content-type: text/html\n\n";
#----------------------------------------------------------
#日付を取得
&hiduke();
#引数を分解（それぞれのモードを入れる）
&insuu();
#カウント情報取得
if ($jouhou eq "count"){&count();}
if ($jouhou eq "namalog"){&syorinamalog();}

#曜日取得処理
&syoriyoubi();
#カレンダー処理
&syorikarenda();
#解析を表示。
&html();
exit;

#----------------------------------------------------------
# 日時を取得
sub hiduke(){

	$ENV{'TZ'} = "JST-9";
	($sec, $min, $hour, $mday, $mon, $year,$wday, $yday, $isdst) = localtime(time());
	@week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
	$year += 1900;
	$mon++;
	$youbi = $week[$wday];
}
#----------------------------------------------------------
#引数を取得
sub insuu(){

	$insuu=$ENV{'QUERY_STRING'};


	($kikan,$jouhou,$inday,$inmon,$inyear)=split(/&/,$insuu);

	($kikan0,$kikan)=split(/=/,$kikan);
	($jouhou0,$jouhou)=split(/=/,$jouhou);
	($inday0,$inday)=split(/=/,$inday);
	($inmon0,$inmon)=split(/=/,$inmon);
	($inyear0,$inyear)=split(/=/,$inyear);



	# 引数がないときは今の時間を入れる。
	if($kikan eq ""){$kikan="day";}
	if($jouhou eq ""){$jouhou="count";}
	if($inday eq ""){$inday=$mday;}
	if($inmon eq ""){$inmon=$mon;}
	if($inyear eq ""){$inyear=$year;}
}

#----------------------------------------------------------
#カウント情報を取得
sub count(){

	# 総合カウントファイルから読み込み
	open(IN,"$sougoufile");
	$sougoudata = <IN>;
	close(IN);

	#----------------------------------------------------------
	# (１〜３１）１日カウントファイルから読み込み
	open(IN,"$tdaydirect/tday$inmon.txt");
	@tdaydata[1..31] = <IN>;
	close(IN);
	#----------------------------------------------------------
	# (今日）１日カウントファイルから読み込み
	open(IN,"$dayfile");
	$daydata = <IN>;
	close(IN);
	#----------------------------------------------------------
	# １ヶ月カウントファイルから読み込み
	open(IN,"$monfile");
	$mondata = <IN>;
	close(IN);
	#----------------------------------------------------------
	#蓄積１月カウントファイルから読み込み
	open(IN,"$tmonfile");
	#蓄積月ファイル数を初期化
	$tmonkazu=1;	
	while($tmondata[$tmonkazu] = <IN>){
		#蓄積月ファイル数
		$tmonkazu++;
	}
	close(IN);
	#蓄積月ファイル数を調整
	$tmonkazu--;

	#----------------------------------------------------------
	# 総合カウントファイルを分解(総合カウント、１日カウント、日付)
	($sougoucount,$oneday,$zenkaimday) = split(/,/, $sougoudata);
	#----------------------------------------------------------
	
	#カウント日処理
	if ($kikan eq "day"){&syoricountkikanday();}
	#カウント月処理
	if ($kikan eq "mon"){&syoricountkikanmon();}
	#カウント全て処理
	if ($kikan eq "year"){&syoricountkikanyear();}

}

#----------------------------------------------------------
sub syoricountkikanday(){
	# 蓄積１日カウントファイルの処理(分割後、本来の配列に入れる。）
	for ($i=1;$i<=31;$i++){
		($dayday,$daysoucount,@daycount[0..23]) = split(/,/, $tdaydata[$i]);

		#もし参照したものと日が同じならループを抜ける。
		if ($dayday==$inday){$i=31;}
		#もし日が違うならデータ破棄
		else{@daycount[0..23]=(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);}
	}
	#----------------------------------------------------------
	#今日の日ファイルに何日のものが入っているか調べる。（翌月調査のため）
	($raidayyear,$raidaymon,$raidayday) = split(/,/, $daydata);
	#----------------------------------------------------------
	#もし今日の日ファイルの日と参照した日が同じならそれを入れる。
	if (($inday==$raidayday)&&($inmon==$raidaymon)){

		($dayyear,$daymon,$dayday,$daysoucount,@daycount[0..23]) = split(/,/, $daydata);
	}
	#----------------------------------------------------------
	#日アクセスが””のとき空白を入れる。
	for($i=0;$i<=23;$i++){
		if ($daycount[$i] eq ""){$daycount[$i]="　";}
	}
	#----------------------------------------------------------
	#もし総日カウンターが””のとき０をいれる
	if ($daysoucount eq ""){$daysoucount=0;}
	
	#日のグラフの最大高さを検出
	for($i=0;$i<=23;$i++){
		if ($daygraphsaidai <= $daycount[$i]){
			$daygraphsaidai = $daycount[$i];
		}
	}
	
	#日のグラフの幅を決める(カウントの最大が０以上のときだけ）
	if ($daygraphsaidai>0){
		for($i=0;$i<=23;$i++){
			$daygraph[$i]=$daycount[$i]/$daygraphsaidai*100;
		}
	}

}
#----------------------------------------------------------
#カウント期間１月処理
sub syoricountkikanmon(){

	# 蓄積１ヶ月カウントファイルを処理(分割後、本来の配列に入れる。）
	# ファイルの数だけ調べる
	for ($i=1;$i<=$tmonkazu;$i++){
		#とりあえず分解して年と月を調べる。
		($monyear,$monmon,$monsoucount,@moncount[1..31]) = split(/,/, $tmondata[$i]);
	
		#もし年と月が同じならループを抜ける。
		if (($monyear==$inyear) && ($monmon==$inmon)){$i=$tmonkazu;}
		#もし年と月が違うならデータ破棄
		else{@moncount[1..31]=(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);}
	}
	#----------------------------------------------------------
	# もし今月を参照したとき今月の１ヶ月カウントファイル入れる
	if (($inyear==$year)&&($inmon==$mon)){
		($monyear,$monmon,$monsoucount,@moncount[1..31]) = split(/,/, $mondata);
	}
	#----------------------------------------------------------
	#月アクセスが””のとき空白を入れる。
	for($i=1;$i<=31;$i++){
		if ($moncount[$i] eq ""){$moncount[$i]="　";}
	}
	#----------------------------------------------------------
	#もし総月カウンターが””のとき０をいれる
	if ($monsoucount eq ""){$monsoucount=0;}
	#----------------------------------------------------------
	#月のグラフの最大高さを検出
	for($i=1;$i<=31;$i++){
		if ($mongraphsaidai <= $moncount[$i]){
			$mongraphsaidai = $moncount[$i];
		}
	}

	#月のグラフの幅を決める(カウントの最大が０以上のときだけ）
	if ($mongraphsaidai>0){
		for($i=1;$i<=31;$i++){
			$mongraph[$i]=$moncount[$i]/$mongraphsaidai*100;
		}
	}

}
#----------------------------------------------------------
#カウント期間全て処理
sub syoricountkikanyear(){

	# 蓄積１ヶ月カウントファイルを処理(分割後、本来の配列に入れる。）
	# ファイルの数だけ調べる
	for ($i=1;$i<=$tmonkazu;$i++){
		#とりあえず分解して年と月を調べる。
		($yearyear[$i],$yearmon[$i],$yearcount[$i]) = split(/,/, $tmondata[$i]);
	}
	#----------------------------------------------------------
	# 今月の１ヶ月カウントファイルを蓄積の後に入れる

	($yearyear[$i],$yearmon[$i],$yearcount[$i]) = split(/,/, $mondata);

	#----------------------------------------------------------
	#月アクセスが””のとき空白を入れる。
	#for ($i=1;$i<=$tmonkazu+1;$i++){
	#	if ($moncount[$i] eq ""){$moncount[$i]="　";}
	#}
	#----------------------------------------------------------
	#もし総月カウンターが””のとき０をいれる
	#if ($monsoucount eq ""){$monsoucount=0;}
	#----------------------------------------------------------
	#月のグラフの最大高さを検出
	for ($i=1;$i<=$tmonkazu+1;$i++){
		if ($yeargraphsaidai <= $yearcount[$i]){
			$yeargraphsaidai = $yearcount[$i];
		}
	}

	#月のグラフの幅を決める(カウントの最大が０以上のときだけ）
	if ($yeargraphsaidai>0){
		for($i=1;$i<=31;$i++){
			$yeargraph[$i]=$yearcount[$i]/$yeargraphsaidai*100;
		}
	}

}
#----------------------------------------------------------
#生ログ処理
sub syorinamalog(){

	#生ログ今ファイルから読み込み
	open(IN,"./namalog.txt");

	#始めのファイルには日付が入ってるので捨てる。
	$dami=<IN>;

	#生ログファイル数を初期化
	$namalogkazu=1;	
	while($namalog[$namalogkazu] = <IN>){
		#生ログファイル数
		$namalogkazu++;
	}
	close(IN);
	#生ログファイル数を調整
	$namalogkazu--;

	#生ログ分割
	for ($i=1;$i<=$namalogkazu;$i++){
		($namaloghost[$i],$namalogaddr[$i],$namaloglinkmono[$i],$namaloguser_agent[$i])=split(/,/,$namalog[$i]);
	}

}
#----------------------------------------------------------

# 一日の曜日を取得
sub syoriyoubi(){
	$tuki=$inmon;
	$tosi=$inyear;
	@hi[1..12]=(31,28,31,30,31,30,31,31,30,31,30,31);

	if ($tosi % 4 ==0){
		if($tosi % 100 ==0){
			if($tosi %400==0){$hi[2]=29;}
		}
		else{$hi[2]=29;}
	}

	$allhi = 0;
	if ($tuki >= 2){
		for($i = 1;$i<= $tuki - 1;$i++){
			$allhi = $allhi + $hi[$i];
		}
	}

	$youbim1 = $tosi + $allhi;

	$youbim1 = $youbim1 + int($tosi / 4);
	$youbim1 = $youbim1 - int($tosi / 100);
	$youbim1 = $youbim1 + int($tosi / 400);

	if ($hi[2]==29){$youbim1--;}

	$youbim1 = $youbim1 % 7;

}
#----------------------------------------------------------
#カレンダー処理
sub syorikarenda(){

	#先月の年と月を選択
	$beforemon=$inmon-1;
	$beforeyear=$inyear;
	if ($beforemon<1){$beforemon=12;$beforeyear--;}

	#来月の年と月を選択
	$aftermon=$inmon+1;
	$afteryear=$inyear;
	if ($aftermon>12){$aftermon=1;$afteryear++;}

}

#----------------------------------------------------------
#表示処理
sub html(){

	print"<table border='1'><tbody>";
	print"<tr><td><font size='2'>アクセス解析</font></td>";
	print"<td align='right'><font size='2'><a href='./index.html'>index</a></font></tr>";
	print"<tr><td valign='top'>";
		#----------------------------------------------------------
		#カレンダーを表示しに行く
		&htmlkarenda();
		#情報を表示しに行く
		&htmljouhou();
		print"</td><td valign='top'>";

		#----------------------------------------------------------
		#解析を表示しに行く
		&htmlkaiseki();
		#----------------------------------------------------------
	print"</td></tr>";
	print"<tr><td align='right' colspan='2'><font size='2'><b>Copyright (C) 2003 <a href='http://www.tok2.com/home2/n0000/top.html'>トライクロス\ソ\フト</a></b></font></td></tr>";
	print"</tbody></table>";
}
#----------------------------------------------------------
#カレンダーを表示	
sub htmlkarenda(){

	print"<table border='1'><tbody>";
	print"<tr>";
	print"<td><a href='kaiseki.cgi?kikan=$kikan&jouhou=count&inday=$inday&inmon=$beforemon&inyear=$beforeyear'>←</a></td>";
	print"<td colspan='3'";
	#期間が全てのとき
	if($kikan eq "year"){
		#今見ている年の色を変える。
		print"bgcolor='#99ccff'";
	}
	print">";
	print"<a href='kaiseki.cgi?kikan=year&jouhou=count&inday=$inday&inmon=$inmon&inyear=$year'>$inyear年</a> ";
	print"<td colspan='2'";
	#期間が月か年のとき
	if(($kikan eq "mon")||($kikan eq "year")){
		#今見ている月の色を変える。
		print"bgcolor='#99ccff'";
	}

	print">";
	print"<a href='kaiseki.cgi?kikan=mon&jouhou=count&inday=$inday&inmon=$inmon&inyear=$year'>$inmon月</a></td>";
	print"<td><a href='kaiseki.cgi?kikan=$kikan&jouhou=count&inday=$inday&inmon=$aftermon&inyear=$afteryear'>→</a></td>";
	print"</tr>";
	print"<tr><td>日</td><td>月</td><td>火</td><td>水</td><td>木</td><td>金</td><td>土</td></tr>";
	print"<tr>";

	for ($i=1;$i<=$youbim1;$i++){print"<td>　</td>";}

	for($i=1;$i<=$hi[$inmon];$i++){
		print"<td align='right'";
		#期間が日のとき
		if($kikan eq "day"){
			#今見ている日付の色を変える。
			if ($i==$inday){print"bgcolor='#99ccff'";}
		}
		#期間が月か年のとき
		if(($kikan eq "mon") ||($kikan eq "year")){
			#すべて日付の色を変える。
			print"bgcolor='#99ccff'";
		}
		print"><a href='kaiseki.cgi?kikan=day&jouhou=count&inday=$i&inmon=$inmon&inyear=$inyear'>$i</a></td>";
		if ((($youbim1 + $i ) % 7) == 0){print"</tr><tr>";}
	}
	print"</tr>";
	print"</tbody></table>";
	print"<font size='2'>";
	print"<a href='kaiseki.cgi?kikan=year&jouhou=count&inday=$day&inmon=$mon&inyear=$year'>全て</a>　";
	print"<a href='kaiseki.cgi?kikan=mon&jouhou=count&inday=$day&inmon=$mon&inyear=$year'>今月</a>　";
	print"<a href='kaiseki.cgi?kikan=day&jouhou=count&inday=$day&inmon=$mon&inyear=$year'>今日</a>　";
	print"<a href='javascript:history.go(-1)'>戻る</A>";
	print"</font>";
}
#----------------------------------------------------------
#情報選択を表示
sub htmljouhou(){
	print"<table border='2'><tbody>";
	print"<tr><td><font size='2'>情報選択</font></td></tr>";
	print"<tr><td><font size='2'><a href='kaiseki.cgi?kikan=$kikan&jouhou=count&inday=$inday&inmon=$inmon&inyear=$inyear'>アクセス</a></font></td></tr>";
	print"<tr><td><font size='2'><a href='kaiseki.cgi?kikan=$kikan&jouhou=namalog&inday=$inday&inmon=$inmon&inyear=$inyear'>生ログ</a></font></td></tr>";
	print"</tbody></table>";
}
#解析を表示
sub htmlkaiseki(){
	if ($jouhou eq "count"){&htmlcount();}
	if ($jouhou eq "namalog"){&htmlnamalog();}
	if ($jouhou eq "karenda"){&htmlallkarenda();}
}
#----------------------------------------------------------
sub htmlcount(){
	#期間がdayのとき
	if ($kikan eq "day"){&htmlkaisekicountkikanday();}
	if ($kikan eq "mon"){&htmlkaisekicountkikanmon();}
	if ($kikan eq "year"){&htmlkaisekicountkikanyear();}
}
#----------------------------------------------------------
#期間がdayのとき
sub htmlkaisekicountkikanday(){
print <<_HTML;
<table border='1'>
<tbody>
_HTML

print "<tr><td><font size='2'>$inday日</font></td>";
print "<td colspan='2' align='right'><font size='2'>総アクセス$daysoucount</font></td></tr>";
print "<tr><td><font size='2'>時間</font></td>";
print"<td><font size='2'>アクセス</font></td>";
print"<td><font size='2'>グラフ</font></td></tr>";


for($i=0;$i<=23;$i++){
	
	print"<tr><td><font size='2'>$i</font></td>";
	print"<td><font size='2'>$daycount[$i]</font></td>";
	print"<td><img src='./graph.gif' width='$daygraph[$i]' height='6'></td>";
	print"</tr>";
	
}

print <<_HTML;

</tbody>
</table>


_HTML
}
#----------------------------------------------------------
#期間がmonのとき
sub htmlkaisekicountkikanmon(){

	print "<table border='1'>";
	print "<tbody>";
	print "<tr><td><font size='2'>$inmon月</font></td>";
	print "<td colspan='2' align='right'><font size='2'>総アクセス$monsoucount</font></td></tr>";
	print "<tr><td><font size='2'>日付</font></td>";
	print"<td><font size='2'>アクセス</font></td>";
	print"<td><font size='2'>グラフ</font></td></tr>";


	for($i=1;$i<=$hi[$inmon];$i++){
		print"<tr><td><font size='2'>";
		#その日のリンク
		print"<a href='kaiseki.cgi?kikan=day&jouhou=count&inday=$i&inmon=$inmon&inyear=$year'>$i</a>";
		print"</font></td>";
		print"<td><font size='2'>$moncount[$i]</font></td>";
		print"<td><img src='./graph.gif' width='$mongraph[$i]' height='6'></td>";
		print"</tr>";
	}
	print "</tbody>";
	print "</table>";

}
#----------------------------------------------------------
#期間がyearのとき
sub htmlkaisekicountkikanyear(){

	print "<table border='1'>";
	print "<tbody>";
	print "<tr><td colspan='2'><font size='2'>全て</font></td>";
	print "<td colspan='2' align='right'><font size='2'>総アクセス$sougoucount</font></td></tr>";
	print "<tr><td><font size='2'>年</font></td>";
	print"<td><font size='2'>月</font></td>";
	print"<td><font size='2'>アクセス</font></td>";
	print"<td><font size='2'>グラフ</font></td></tr>";

	for($i=1;$i<=$tmonkazu+1;$i++){
		print"<tr><td><font size='2'>$yearyear[$i]</font></td>";
		print"<td><font size='2'>";
		#その月のリンク
		print"<a href='kaiseki.cgi?kikan=mon&jouhou=count&inday=$inday&inmon=$yearmon[$i]&inyear=$year'>$yearmon[$i]</a>";
		print"</font></td>";
		print"<td><font size='2'>$yearcount[$i]</font></td>";
		print"<td><img src='./graph.gif' width='$yeargraph[$i]' height='6'></td>";

		print"</tr>";
	}
	print "</tbody>";
	print "</table>";

}

sub htmlnamalog(){

	for ($i=1;$i<=$namalogkazu;$i++){

		$namaloghost[$i]="秘密ホス";
		$namalogaddr[$i]="秘密アド";
		print"<table border='2'><tbody>";
		print"<tr><td><font size='2'>リモートホスト</font></td><td><font size='2'>$namaloghost[$i]</font></td></tr>";
		print"<tr><td><font size='2'>アドレス</font></td><td><font size='2'>$namalogaddr[$i]</font></td></tr>";
		print"<tr><td><font size='2'>リンク元</font></td><td><font size='2'>$namaloglinkmono[$i]</font></td></tr>";
		print"<tr><td><font size='2'>ユーザエージェント</font></td><td><font size='2'>$namaloguser_agent[$i]</font></td></tr>";
		print"</tbody></table>";
	}


}
sub htmlallkarenda(){
	print"<table border='1'><tbody>";
	print"<tr>";
	print"<td>　</td>";
	print"<td colspan='3'>";
	print"$inyear年</td>";
	print"<td colspan='2'>";
	print"$inmon月</td>";
	print"<td>　</td>";
	print"</tr>";
	print"<tr><td>日</td><td>月</td><td>火</td><td>水</td><td>木</td><td>金</td><td>土</td></tr>";
	print"<tr>";

	for ($i=1;$i<=$youbim1;$i++){print"<td>　</td>";}


	for($i=1;$i<=$hi[$inmon];$i++){
		print"<td align='right'>";
		print"$i</td>";
		if ((($youbim1 + $i ) % 7) == 0){print"</tr><tr>";}
	}
	print"</tr>";
	print"</tbody></table>";


}