#! /usr/bin/perl
#
# HL-imgdiary 携帯用日記ビューア Ver.3.00
# by phk@heartlogic.jp
# http://www.heartlogic.jp/
# edit.cgiと同じディレクトリでご利用下さい
#------------------------------------------------------------------------------
#　ユーザー設定項目
#------------------------------------------------------------------------------
#定義ファイル
require "./edef.cgi";

#最新の日記を表示する最大日数
$max_num = 1;

#日記のタイトル
$diary_title = 'STAFFS\' VOICE';

#戻るURL
$back_url = "http://rsr.wess.co.jp/keitai/2005/com.html";

#横幅が指定ピクセル数以下の場合は表示する
$max_width = 400;


#------------------------------------------------------------------------------
#　ここからプログラム
#------------------------------------------------------------------------------

#■パラメータ取り込み
$params = $ENV{'QUERY_STRING'};
@pairs = split(/&/,$params);
foreach (@pairs){
	($key,$v) = split(/=/,$_);
	$v =~ tr/+/ /;
	$v =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
	if($key eq 'del'){
		push (@dellist,$v);
	}
	$DAT{$key} = $v;
}

#■日付指定あり
if($DAT{'d'} ne ''){
	$v_year = substr($DAT{'d'},0,4);
	$v_month = substr($DAT{'d'},4,2);
	$v_day = substr($DAT{'d'},6,2);
	$v_year = sprintf("%.4d",$v_year);
	$v_month = sprintf("%.2d",$v_month);
	$v_day = sprintf("%.2d",$v_day);
#■日付指定なし→全日付取得
}else{
	($sec,$min,$hour,$v_day,$v_month,$v_year,$week,$isdst) = localtime(time);
	$v_year += 1900;
	$v_month++;
	$v_year = sprintf("%.4d",$v_year);
	$v_month = sprintf("%.2d",$v_month);
	$v_day = sprintf("%.2d",$v_day);
}


#■モード別処理
if($DAT{'m'} eq 'cal'){&print_cal();}
elsif($DAT{'d'} ne ''){&dat();}
else{&diary_new();}
exit;




#■カレンダー表示 ------------------------------------------------------------
sub print_cal(){
@max_day = (31,31,28,31,30,31,30,31,31,30,31,30,31);
if(($v_year % 4) == 0){$max_day[2] = 29;}

if($v_month <= 2){
	$t_month = 12+$v_month;
	$t_year = $v_year-1;
}else{
	$t_month = $v_month;
	$t_year = $v_year;
}
$week = ($t_year + int($t_year/4)-int($t_year/100)+int($t_year/400)+int(2.6*$t_month+1.6)+1) % 7;

	#ヘッダ出力
print "Content-type: text/html; charset=shift_jis\n\n";
print <<"_HTML_";
<TITLE>$diary_title</TITLE>
<center><img src=\"05.gif\">
<hr noshade size=\"1\">
<font color=\"#333333\" size=\"2\">STAFFS\' VOICE</font>
<hr noshade size=\"1\">
$v_year年$v_month月
</center>
<PRE>
_HTML_

#print "<br>\n";
for($i=0;$i<$week;$i++){
 print "  ";
}


for($i=1;$i<=$max_day[$v_month];$i++){
	if($i < 10){$date = "&nbsp;".$i;}
	else{$date = $i;}

	$v_day = sprintf("%.2d",$i);
	$logf = "$datafold$v_year\_$v_month/log$v_month$v_day\.log";
	#ログがある日
	if(-e $logf){
		$date = "<A HREF=\"pdv.cgi?d=$v_year$v_month$i\">$date</A>";
	}

	print $date;

	$week++;
	if($week >= 7){
		$week = 0;
		print "\n";
	}
}

#翌日の日付を計算
$nx_year = $v_year;
$nx_month = $v_month+1;
#翌年?
if($nx_month >= 13){
	$nx_month = 1;
	$nx_year++;
	if($nx_year%4 == 0){$max_day[2]=29;}
	else{$max_day[2]=28;}
}
$nx_month = sprintf("%.2d",$nx_month);
$nx_date = $nx_year.$nx_month."01";

#前日の日付を計算
$fw_year = $v_year;
$fw_month = $v_month-1;
#前年?
if($fw_month <= 0){
	$fw_year--;
	if($fw_year%4 == 0){$max_day[2]=29;}
	else{$max_day[2]=28;}
	$fw_month = 12;
}
$fw_month = sprintf("%.2d",$fw_month);
$fw_date = $fw_year.$fw_month."01";

#フッタ出力
print <<"_HTML_";
</PRE>
<hr noshade size="1">
<A HREF="pdv.cgi?m=cal&d=$fw_date" ACCESSKEY=1>前月</A>／
<A HREF="pdv.cgi?m=cal&d=$nx_date" ACCESSKEY=3>翌月</A><BR>
<A HREF="pdv.cgi" ACCESSKEY=0>最新の日記</A><BR>
<A HREF="$back_url" ACCESSKEY=9>戻る</A>
<hr size="1" noshade>
<center><a href="http://rsr.wess.co.jp/keitai/2005/index.html">TOP</a>
<hr size="1" noshade>
(c)1999-2005<br>
WESS INC.<br>
</center>
_HTML_
}


#■特定日付のログのみ表示 ----------------------------------------------------
sub dat(){
	$month_fold = "$v_year\_$v_month";
	$logf = "$datafold$month_fold/log$v_month$v_day\.log";

	if(!open(LOG,"$logf")){&error("HTML作成時、ログファイル\($logf\)のオ\ープン失敗");}
	$logs = <LOG>;
	close(LOG);

	#ヘッダ出力
print "Content-type: text/html; charset=shift_jis\n\n";
print <<"_HTML_";
<TITLE>$diary_title</TITLE>
<center><img src=\"05.gif\">
<hr noshade size=\"1\">
<font color=\"#333333\" size=\"2\">STAFFS\' VOICE</font>
<hr noshade size=\"1\"></center>
_HTML_

	&push_log();

print <<"_HTML_";
<hr noshade size="1">$prev_str
<A HREF="pdv.cgi?m=cal&d=$DAT{'d'}" ACCESSKEY=1>ｶﾚﾝﾀﾞｰ</A><BR>
<A HREF="$back_url" ACCESSKEY=9>戻る</A>
<hr size="1" noshade>
<center><a href="http://rsr.wess.co.jp/keitai/2005/index.html">TOP</a>
<hr size="1" noshade>
(c)1999-2005<br>
WESS INC.<br>
</center>
_HTML_
}






#■日付指定なし→最新日記表示 ------------------------------------------------
sub diary_new(){
	#全ログディレクトリを検索
	if(!opendir(DIR,"$datafold")){&error("ログ検索時、データディレクトリ\($datafold\)のオ\ープン失敗");}
	@ydirs = readdir(DIR);
	closedir(DIR);
	@ydirs = grep(/\d{4}_\d{2}/,@ydirs);
	@ydirs = sort{$b cmp $a}@ydirs;

	#ヘッダ出力
print "Content-type: text/html; charset=shift_jis\n\n";
print <<"_HTML_";
<TITLE>$diary_title</TITLE>
<center><img src=\"05.gif\">
<hr noshade size=\"1\">
<font color=\"#333333\" size=\"2\">STAFFS\' VOICE</font>
<hr noshade size=\"1\"></center>

_HTML_


	#新しいログから順に$diary_num個分取得し、最新の日記を作成
	local($count) = 0;
	local($page) = 0;
	local($filesize) = 0;
	DIARYLOOP: for($i=0;$i<=$#ydirs;$i++){
		$cur_fold = "$datafold$ydirs[$i]";
		$month_fold = "$ydirs[$i]";
		if(!opendir(DIR,"$cur_fold\/")){&error("HTML作成時、データディレクトリ\($cur_fold\)のオ\ープン失敗");}
		@mdirs = readdir(DIR);
		closedir(DIR);
		@mdirs = grep(/\Alog\d{4}\.log\Z/,@mdirs);
		@mdirs = sort{$b cmp $a}@mdirs;

		#ログを読み込み、テンプレートに追加
		foreach $logfile (@mdirs){
			$logf = "$cur_fold\/$logfile";

			if(!open(LOG,"$logf")){&error("HTML作成時、ログファイル\($logf\)のオ\ープン失敗");}
			$logs = <LOG>;
			close(LOG);

			if($page >= $DAT{'p'}){
				&push_log();
			}
			$filesize += length($logs);
			$count++;


			#日記を入れる数チェック
			if($count >= $max_num){
				$page++;
				$count = 0;
				$filesize = 0;
				if($page > $DAT{'p'}){
					last DIARYLOOP;
				}
			#ファイルサイズを監視
			}elsif($filesize > 4000){
				$page++;
				$count = 0;
				$filesize = 0;
				if($page > $DAT{'p'}){
					last DIARYLOOP;
				}
			}
		}
	}

	#フッタ出力
$next = $DAT{'p'}+1;
if($DAT{'p'}){
	$fowd = $DAT{'p'}-1;
	$fowd_str = "\n<A HREF=\"pdv.cgi?p=$fowd\" ACCESSKEY=3>前のﾍﾟｰｼﾞ</A><BR>";
}

print <<"_HTML_";
<hr noshade size="1">$prev_str
<A HREF="pdv.cgi?p=$next" ACCESSKEY=0>次のﾍﾟｰｼﾞ</A><BR>$fowd_str
<A HREF="pdv.cgi?m=cal" ACCESSKEY=1>ｶﾚﾝﾀﾞｰ</A><BR>
<A HREF="$back_url" ACCESSKEY=9>戻る</A>
<hr size="1" noshade>
<center><a href="http://rsr.wess.co.jp/keitai/2005/index.html">TOP</a>
<hr size="1" noshade>
(c)1999-2005<br>
WESS INC.<br>
</center>
_HTML_
}


#■日ごとのログをHTML化する
sub push_log(){
	local($w_time,$w_head,$w_arti,$filedat) = split(/<>/,$logs);

	#曜日計算
	local($t_year,$t_month,$t_day) = split(/\./,$w_time);
	local($s_year) = int($t_year);
	local($s_month) = int($t_month);
	local($s_day) = int($t_day);
	local($t_time);
	if($t_month <= 2){
		$s_year = $t_year -1;
		$s_month = $t_month+12;
	}
	local($t_week) = ($s_year+int($s_year/4)-int($s_year/100)+int($s_year/400)+int((13*$s_month+8)/5)+$s_day)%7;
	if($t_week == 0){
		$t_time = "<FONT COLOR=\"$date_color_sun\">$date_fmt</FONT>";
	}elsif($t_week == 6){
		$t_time = "<FONT COLOR=\"$date_color_sat\">$date_fmt</FONT>";
	}else{
		$t_time = $date_fmt;
	}
	$t_time =~ s/%year%/$t_year/g;
	$t_time =~ s/%month%/int($t_month)/ge;
	$t_time =~ s/%day%/int($t_day)/ge;
	$t_time =~ s/%week%/$week_str[$t_week]/g;

	$img_str = '';
	if($filedat ne ''){
		local($filename,$width,$height,$layout,$filesize) = split(/\//,$filedat);
		if($width <= $max_width){
			local($src) = $datafold_abs.$month_fold.'/'.$filename;
			$img_str = "<br><img src=\"$src\"><br>";
		}
	}

print <<"_HTML_";

<FONT COLOR="#999966">◆$w_head</FONT> $t_time<BR>
$img_str<BR>
$w_arti
_HTML_
}






#■エラー処理 -----------------------------------------------------------------
sub error{
	local($err_msg) = @_;
	print "Content-type:text/html;charset=shift_jis\n\n";
	print "error:$err_msg";
exit;
}
