#!/usr/bin/perl

###############################################
#   sche18.cgi
#      V3.0 (2010.8.3)
#                     Copyright(C) CGI-design
###############################################

$script = 'sche18.cgi';
$base = './schedata';				#データ格納ディレクトリ
$nofile = "$base/no.txt";			#記事番号
$opfile = "$base/option.txt";

@week = ('日','月','火','水','木','金','土');
@mdays = (31,28,31,30,31,30,31,31,30,31,30,31);

open (IN,"$opfile") || &error("OPEN ERROR");	$opdata = <IN>;		close IN;
if (!$opdata) {
	$pass = &crypt('cgi');
	chmod(0666,$opfile);	open (OUT,">$opfile") || &error("OPEN ERROR");
	print OUT "$pass<>スケジュール<><><>#fafaf5,#000000,#c00000,#aaaaaa,#ffffff,#e6e4ce,#ffd700,#fff3bd,#ff0000,#0000ff";
	close OUT;
	chmod(0666,$nofile);
}

### メイン処理 ###
if ($ENV{'REQUEST_METHOD'} eq "POST") {read(STDIN,$in,$ENV{'CONTENT_LENGTH'});} else {$in = $ENV{'QUERY_STRING'};}
%in = ();
foreach (split(/&/,$in)) {
	($n,$val) = split(/=/);
	$val =~ tr/+/ /;
	$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
	$val =~ s/&/&amp;/g;	$val =~ s/</&lt;/g;		$val =~ s/>/&gt;/g;		$val =~ s/"/&quot;/g;	$val =~ s/\r\n|\r|\n/<br>/g;
	if (defined($in{$n})) {$in{$n} .= "\0$val";} else {$in{$n} = $val;}
}
$mode = $in{'mode'};
$logyear = $in{'year'};
$logmon = $in{'mon'};

open (IN,"$opfile") || &error("OPEN ERROR");
($pass,$title,$home,$bg_img,$colors) = split(/<>/,<IN>);
close IN;
($bg_color,$text_color,$title_color,$frame_color,$combg_color,$subbg_color,$today_color,$sche_color,$hol_color,$sat_color) = split(/,/,$colors);
@wcolor = ($hol_color,$text_color,$text_color,$text_color,$text_color,$text_color,$sat_color);

($sec,$min,$hour,$nowday,$nowmon,$nowyear) = localtime;
$nowyear += 1900;
$nowmon++;

if (!$logyear) {$logyear = $nowyear; $logmon = $nowmon;}
$logfile = "$base/$logyear$logmon.txt";

if ($mode eq 'admin') {&admin;} else {&main;}

print "</center></body></html>\n";
exit;

###
sub header {
	print "Content-type: text/html\n\n";
	print "<html><head><META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=Shift_JIS\">\n";
	print "<title>$title</title><link rel=\"stylesheet\" type=\"text/css\" href=\"$base/style.css\"></head>\n";
	$head = 1;
}

###
sub main {
	&header;
	print "<body background=\"$bg_img\" bgcolor=\"$bg_color\" text=\"$text_color\"><center>\n";
	print "<table width=700><tr><td width=80 valign=top>\n";
	if ($home) {print "<a href=\"$home\">HOME</a>";}
	print "</td><td align=center><font color=\"$title_color\" size=\"+1\"><b>$title</b></font></td><td width=80 align=right>｜<a href=\"$script?mode=admin\">管理</a>｜</td></tr></table>\n";
	&cal;
	foreach (@data) {
		($no,$day,$sub,$com) = split(/<>/);
		&dsp;
	}
	# 次の行は著作権表示ですので削除しないで下さい。#
	print "<a href=\"http://cgi-design.net\" target=\"_blank\">CGI-design</a>\n";
}

###
sub cal {
	@data = @logno = ();
	if (-e $logfile) {
		open (IN,"$logfile") || &error("OPEN ERROR");
		while (<IN>) {
			push (@data,$_);
			($no,$day) = split(/<>/);
			if (!$logno[$day]) {$logno[$day] = $no;}
		}
		close IN;
	}
	$mdays = $mdays[$logmon - 1];
	if ($logmon == 2 && $logyear % 4 == 0) {$mdays = 29;}

	print "<table><tr valign=top><td><table width=100% cellpadding=0><tr>\n";
	$mon = $logmon - 1;
	if ($mon < 1) {$mon = 12; $year = $logyear - 1;} else {$year = $logyear;}
	if ($mode eq 'admin') {
		print "<form action=\"$script\" method=POST><td>\n";
		print "<input type=hidden name=mode value=\"admin\">\n";
		print "<input type=hidden name=pass value=\"$inpass\">\n";
		print "<input type=hidden name=year value=\"$year\">\n";
		print "<input type=hidden name=mon value=\"$mon\">\n";
		print "<input type=submit value=\"前月\"></td></form>\n";
	} else {
		print "<td><a href=\"$script?year=$year&mon=$mon\">&lt;&lt;前月</a></td>";
	}
	print "<td align=center>$logyear年 <font size=\"+1\"><b>$logmon</b></font>月</td>";
	$mon = $logmon + 1;
	if (12 < $mon) {$mon = 1; $year = $logyear + 1;} else {$year = $logyear;}
	if ($mode eq 'admin') {
		print "<form action=\"$script\" method=POST><td align=right>\n";
		print "<input type=hidden name=mode value=\"admin\">\n";
		print "<input type=hidden name=pass value=\"$inpass\">\n";
		print "<input type=hidden name=year value=\"$year\">\n";
		print "<input type=hidden name=mon value=\"$mon\">\n";
		print "<input type=submit value=\"次月\"></td></form>\n";
	} else {
		print "<td align=right><a href=\"$script?year=$year&mon=$mon\">次月&gt;&gt;</a></td>\n";
	}
	print "</tr></table>\n";

	print "<table bgcolor=\"$combg_color\" bordercolor=\"$frame_color\" border=1 cellpadding=2 style=\"border-collapse: collapse;\">\n";
	print "<tr bgcolor=\"$subbg_color\" align=center>\n";
	for (0 .. 6) {print "<td width=22><font color=\"$wcolor[$_]\">$week[$_]</font></td>\n";}
	print "</tr>\n";

	&set_holiday;
	&get_wday($logyear,$logmon,1);
	$w = $n = 0;
	$k = 1;
	for (0 .. 41) {
		if (!$w) {print "<tr align=center>";}
		if ($wday <= $_ && $k <= $mdays) {
			if ($w == 1) {$n++;}
			$wcolor = $wcolor[$w];
			if (2007 <= $logyear) {
				&get_holiday;
				if ($holiday) {$wcolor = $wcolor[0];}
			}
			$day = "<font color=\"$wcolor\">$k</font>";
			if ($logno[$k]) {
				$bc = " bgcolor=\"$sche_color\"";
				$day = "<a href=\"#$logno[$k]\"><u><b>$day</b></u></a>";
			} else {$bc = '';}
			if ($logyear eq $nowyear && $logmon eq $nowmon && $k eq $nowday) {$bc = " bgcolor=\"$today_color\"";}
			print "<td height=22$bc>$day</td>\n";
			$pro[$k] = "$w,$wcolor";
			$k++;
		} else {
			print "<td></td>";
		}
		$w++;
		if ($w == 7) {
			print "</tr>\n";
			if ($mdays < $k) {last;}
			$w = 0;
		}
	}
	print "</table></td><td width=15></td><td><br>\n";
	print "<table width=480 bgcolor=\"$combg_color\" bordercolor=\"$frame_color\" border=1 cellspacing=0 cellpadding=2 style=\"border-collapse: collapse;\">\n";
	foreach (@data) {
		($no,$day,$sub) = split(/<>/);
		($wday,$wcolor) = split(/,/,$pro[$day]);
		if ($logyear eq $nowyear && $logmon eq $nowmon && $day eq $nowday) {print "<tr bgcolor=\"$today_color\">";} else {print "<tr>";}
		print "<td width=75>&nbsp;$logmon.$day <font color=\"$wcolor\">($week[$wday])</font></td><td><a href=\"#$no\">$sub</a></td></tr>\n";
	}
	print "</table></td></tr></table><br>\n";
}

###
sub dsp {
	$com =~ s/([^=^\"]|^)(https?\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/$1<a href="$2" target="_blank">$2<\/a>/g;
	($wday,$wcolor) = split(/,/,$pro[$day]);
	if ($logyear eq $nowyear && $logmon eq $nowmon && $day eq $nowday) {$bc = $today_color;} else {$bc = $subbg_color;}

	print "<a name=\"$no\"></a>\n";
	print "<table width=620 bgcolor=\"$frame_color\" cellspacing=1 cellpadding=0><tr><td bgcolor=\"$combg_color\" align=center>\n";
	print "<table width=100% bgcolor=\"$bc\"><tr><td>&nbsp;$logyear.$logmon.$day <font color=\"$wcolor\">($week[$wday])</font>　　<b>$sub</b></td>";
	if ($mode eq 'admin') {print "<td align=right><input type=submit name=$no value=\"修正\"></td>";}
	print "</tr></table>\n";
	print "<table width=97% cellspacing=4><tr><td>$com</td></tr></table></td></tr></table>\n";
	print "<table width=610 cellpadding=0><tr><td align=right><a href=\"#\">▲top</a></td></tr></table>\n";
}

###
sub set_holiday {
	$def = 0.242194*($logyear-1980)-int(($logyear-1980)/4);
	$spr = int(20.8431+$def);
	$aut = int(23.2488+$def);
	%hod = ('0101','元日','0211','建国記念の日',"03$spr",'春分の日','0429','昭和の日','0503','憲法記念日','0504','みどりの日','0505','こどもの日',"09$aut",'秋分の日','1103','文化の日','1123','勤労感謝の日','1223','天皇誕生日');
	%how = ('12','成人の日','73','海の日','93','敬老の日','102','体育の日');
}

###
sub get_holiday {
	$sm = sprintf("%02d%02d",$logmon,$k);
	$holiday = $hod{$sm};
	if ($holiday && !$w) {$hflag = 1;}
	if (!$holiday && $w == 1) {$holiday = $how{"$logmon$n"};}
	if (!$holiday && $hflag) {$holiday = '振替休日'; $hflag = 0;}
	if (($logyear eq '2009' || $logyear eq '2015') && $sm eq '0922') {$holiday = '国民の休日';}
}

###
sub get_wday {
	($y,$m,$d) = @_;
	if ($m < 3) {$y--; $m+=12;}
	$wday = ($y+int($y/4)-int($y/100)+int($y/400)+int((13*$m+8)/5)+$d)%7;
}

###
sub admin {
	&header;
	print "<body><center>\n";
	$inpass = $in{'pass'};
	if ($inpass eq '') {
		print "<table width=97%><tr><td><a href=\"$script\">[Return]</a></td></tr></table>\n";
		print "<br><br><br><br><h4>パスワードを入力して下さい</h4>\n";
		print "<form action=\"$script\" method=POST>\n";
		print "<input type=hidden name=mode value=\"admin\">\n";
		print "<input type=password size=10 maxlength=8 name=pass>\n";
		print "<input type=submit value=\" 認証 \"></form>\n";
		print "</center></body></html>\n";
		exit;
	}
	$mat = &decrypt($inpass,$pass);
	if (!$mat) {&error("パスワードが違います");}

	print "<table width=95% bgcolor=\"#8c4600\"><tr><td>　<a href=\"$script\"><font color=\"#ffffff\"><b>Return</b></font></a></td>\n";
	print "<form action=\"$script\" method=POST><td align=right>\n";
	print "<input type=hidden name=mode value=\"admin\">\n";
	print "<input type=hidden name=pass value=\"$inpass\">\n";
	print "<input type=submit value=\"記事編集\">\n";
	print "<input type=submit name=set value=\"基本設定\"></td></form><td width=10></td></tr></table><br>\n";

	if ($in{'set'}) {&setup;} else {&edtin;}
}

###
sub edtin {
	if ($in{'newwrt'}) {&newwrt;}
	elsif ($in{'edtwrt'}) {&edtwrt;}
	elsif ($in{'delwrt'}) {&delwrt;}

	&in_form;
	print "<hr width=700>記事を修正、削除する場合は「修正」をクリックして下さい。<br><br>\n";
	&cal;
	print "<form action=\"$script\" method=POST>\n";
	print "<input type=hidden name=mode value=\"admin\">\n";
	print "<input type=hidden name=pass value=\"$inpass\">\n";
	print "<input type=hidden name=year value=\"$logyear\">\n";
	print "<input type=hidden name=mon value=\"$logmon\">\n";
	print "<input type=hidden name=edt value=\"1\">\n";
	foreach (@data) {
		($no,$day,$sub,$com) = split(/<>/);
		&dsp;
	}
	print "</form>\n";
}

###
sub in_form {
	print "<table bgcolor=\"#e6e4ce\" cellspacing=8><tr><td><table cellspacing=1 cellpadding=0>\n";
	print "<form action=\"$script\" method=POST>\n";
	print "<input type=hidden name=mode value=\"admin\">\n";
	print "<input type=hidden name=pass value=\"$inpass\">\n";
	if ($in{'edt'}) {
		open (IN,"$logfile") || &error("OPEN ERROR");
		while (<IN>) {
			($no,$day,$sub,$com) = split(/<>/);
			if ($in{$no}) {last;}
		}
		close IN;
		print "<input type=hidden name=year value=\"$logyear\">\n";
		print "<input type=hidden name=mon value=\"$logmon\">\n";
		print "<input type=hidden name=no value=\"$no\">\n";
		$com =~ s/<br>/\r/g;
		print "<tr><td>日付</td><td>&nbsp;<b>$logyear年$logmon月$day日</b></td></tr>\n";
	} else {
		print "<tr><td>日付</td><td><select name=year>\n";
		for (2010 .. $nowyear+1) {
			if ($_ eq $nowyear) {$sel = ' selected';} else {$sel = '';}
			print "<option value=\"$_\"$sel>$_</option>\n";
		}
		print "</select>年 <select name=mon>\n";
		for (1 .. 12) {
			if ($_ eq $nowmon) {$sel = ' selected';} else {$sel = '';}
			print "<option value=\"$_\"$sel>$_</option>\n";
		}
		print "</select>月 <select name=day>\n";
		for (1 .. 31) {
			if ($_ eq $nowday) {$sel = ' selected';} else {$sel = '';}
			print "<option value=\"$_\"$sel>$_</option>\n";
		}
		print "</select>日</td></tr>\n";
		$sub = $com = '';
	}
	print "<tr><td>題名&nbsp;</td><td><input type=text size=50 name=sub value=\"$sub\" style=\"ime-mode:active;\"></td></tr>\n";
	print "<tr><td valign=top><br>内容</td><td><textarea cols=80 rows=20 name=com style=\"ime-mode:active;\">$com</textarea></td></tr>\n";
	print "<tr><td></td><td>";
	if ($in{'edt'}) {
		print "<table width=100%><tr><td><input type=submit name=edtwrt value=\"修正する\"></td>\n";
		print "<td width=40 bgcolor=red><input type=submit name=delwrt value=\"削除\"></td></tr></table>\n";
	} else {
		print "<input type=submit name=newwrt value=\"登録する\">";
	}
	print "</td></tr></table></td></tr></table></form>\n";
}

###
sub newwrt {
	open (IN,"$nofile") || &error("OPEN ERROR"); 		$no = <IN>; 		close IN;
	$no++;
	open (OUT,">$nofile") || &error("OPEN ERROR");		print OUT $no;		close OUT;
	$newdata = "$no<>$in{'day'}<>$in{'sub'}<>$in{'com'}<>\n";

	if (-e $logfile) {
		@new = ();
		$flag = 0;
		open (IN,"$logfile") || &error("OPEN ERROR");
		while (<IN>) {
			($no,$day) = split(/<>/);
			if (!$flag && $in{'day'} < $day) {push(@new,$newdata); $flag = 1;}
			push(@new,$_);
		}
		close IN;
		if (!$flag) {push(@new,$newdata);}
		open (OUT,">$logfile") || &error("OPEN ERROR");		print OUT @new;			close OUT;
	} else {
		open (OUT,">$logfile") || &error("OPEN ERROR");		print OUT $newdata;		close OUT;		chmod(0666,$logfile);
	}
}

###
sub edtwrt {
	@new = ();
	open (IN,"$logfile") || &error("OPEN ERROR");
	while (<IN>) {
		($no,$day) = split(/<>/);
		if ($no eq $in{'no'}) {push(@new,"$no<>$day<>$in{'sub'}<>$in{'com'}<>\n");} else {push(@new,$_);}
	}
	close IN;
	open (OUT,">$logfile") || &error("OPEN ERROR");		print OUT @new;		close OUT;
}

###
sub delwrt {
	@new = ();
	open (IN,"$logfile") || &error("OPEN ERROR");
	while (<IN>) {
		($no) = split(/<>/);
		if ($no ne $in{'no'}) {push(@new,$_);}
	}
	close IN;
	open (OUT,">$logfile") || &error("OPEN ERROR");		print OUT @new;		close OUT;
}

###
sub setup {
	if ($in{'wrt'}) {
		if ($in{'newpass'} ne '') {$pass = &crypt($in{'newpass'});}
		$title = $in{'title'};
		$home = $in{'home'};
		$bg_img = $in{'bg_img'};
		$colors = $in{'colors'};	$colors =~ s/\0/,/g;

		open (OUT,">$opfile") || &error("OPEN ERROR");
		print OUT "$pass<>$title<>$home<>$bg_img<>$colors";
		close OUT;
	}
	print "下記に入力後、「設定する」を押して下さい。<br><br>\n";
	print "<form action=\"$script\" method=POST>\n";
	print "<input type=hidden name=mode value=\"admin\">\n";
	print "<input type=hidden name=pass value=\"$inpass\">\n";
	print "<input type=hidden name=set value=\"1\">\n";
	print "<input type=submit name=wrt value=\"設定する\"><br><br>\n";

	print "<table bgcolor=\"#dddddd\" cellspacing=10><tr><td><table cellspacing=1 cellpadding=0>\n";
	print "<tr><td><b>タイトル</b></td><td><input type=text size=40 name=title value=\"$title\"></td></tr>\n";
	print "<tr><td><b>ホームURL</b></td><td><input type=text size=60 name=home value=\"$home\"></td></tr>\n";
	print "<tr><td><b>壁紙</b></td><td><input type=text size=60 name=bg_img value=\"$bg_img\"></td></tr>\n";

	print "<tr><td></td><td><a href=\"$base/color.htm\" target=\"_blank\">カラーコード</a></td></tr>\n";
	@name = ('基本背景色','基本文字色','タイトル色','枠色','記事背景色','見出し背景色','本日背景色','スケジュール日','休日','土曜日');
	@colors = split(/,/,$colors);
	for (0 .. $#name) {
		print "<tr><td><b>$name[$_]</b></td><td><table cellspacing=0 cellpadding=0><tr>\n";
		print "<td><input type=text size=10 name=colors value=\"$colors[$_]\" style=\"ime-mode:inactive;\"></td>\n";
		print "<td width=5></td><td width=80 bgcolor=\"$colors[$_]\"></td></tr></table></td></tr>\n";
	}
	print "<tr><td><b>パスワード変更</b></td><td><input type=password size=10 maxlength=8 name=newpass> （英数8文字以内）</td></tr>\n";
	print "</table></td></tr></table></form>\n";
}

###
sub crypt {
	@salt = ('a' .. 'z','A' .. 'Z','0' .. '9');
	srand;
	$salt = "$salt[int(rand($#salt))]$salt[int(rand($#salt))]";
	return crypt($_[0],$salt);
}

###
sub decrypt {
	$salt = $_[1] =~ /^\$1\$(.*)\$/ && $1 || substr($_[1],0,2);
	if (crypt($_[0],$salt) eq $_[1] || crypt($_[0],'$1$' . $salt) eq $_[1]) {return 1;}
	return 0;
}

###
sub error {
	if (!$head) {&header; print "<body><center>\n";}
	print "<br><br><br><br><h3>ERROR !!</h3><font color=red><b>$_[0]</b></font>\n";
	print "</center></body></html>\n";
	exit;
}
