#!/usr/bin/perl

###############################################
#   inf6.cgi
#      V2.0 (2005.10.7)
#                     Copyright(C) CGI-design
###############################################

$script = 'inf6.cgi';
$base = './infdata';				#データ格納ディレクトリ
$inffile = "$base/inf.txt";			#記事
$nofile = "$base/no.txt";			#記事番号
$opfile = "$base/option.txt";		#オプション

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<>Ｑ＆Ａ<><><><>$base/style.css<>#ffeeee,#000000,#e1c4c4,#a00000,#ffffff,#764747,#e1c4c4,#ffffff<>30<>10";
	close OUT;
	chmod(0666,$inffile); 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;
	if (defined($in{$n})) {$in{$n} .= "\0$val";} else {$in{$n} = $val;}
}
$mode = $in{'mode'};
$num = $in{'num'};

open (IN,"$opfile") || &error("OPEN ERROR");
($pass,$title,$tcom,$home,$bg_img,$style,$colors,$menurate,$page) = split(/<>/,<IN>);
close IN;
($bg_color,$text_color,$mbg_color,$title_color,$sub_color,$subbg_color,$qstbg_color,$ansbg_color) = split(/,/,$colors);
if ($page == 0) {$page = 10;}

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

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=\"$style\"></head>\n";
	$head = 1;
}

###
sub frame {
	&header;
	print "<frameset cols=\"$menurate%,*\" border=0 frameborder=0>\n";
	print "<frame src=\"$script?mode=menu\" scrolling=\"auto\">\n";
	print "<frame src=\"$script?mode=main\" name=\"inf6\" scrolling=\"auto\">\n";
	print "</frameset>\n";
	print "</html>\n";
	exit;
}

###
sub menu {
	&header;
	print "<body background=\"$bg_img\" bgcolor=\"$mbg_color\" text=\"$text_color\" link=\"$text_color\" vlink=\"$text_color\" alink=\"$text_color\" style=\"scrollbar-arrow-color:$text_color; scrollbar-face-color:$mbg_color; scrollbar-track-color:$mbg_color; scrollbar-3dlight-color:$mbg_color; scrollbar-highlight-color:$mbg_color; scrollbar-shadow-color:$mbg_color; scrollbar-darkshadow-color:$mbg_color;\"><center>\n";
	if ($home) {print "｜<a href=\"$home\" target=\"_parent\">HOME</a>";}
	print "｜<a href=\"$script?mode=main\" target=\"inf6\">全記事表\示</a>｜<hr color=\"$text_color\" size=1>\n";
	print "<table width=100%>\n";
	open (IN,"$inffile") || &error("OPEN ERROR");
	while (<IN>) {
		($no,$sub) = split(/<>/);
		print "<tr><td><a href=\"$script?mode=main&no=$no\" target=\"inf6\">■$sub</a></td></tr>\n";
	}
	close IN;
	print "</table><hr color=\"$text_color\" size=1>\n";
	print "<table width=100%><tr><td><a href=\"$script?mode=admin\" target=\"_parent\">[編集]</a></td></tr></table>\n";
}

###
sub main {
	&header;
	print "<body background=\"$bg_img\" bgcolor=\"$bg_color\" text=\"$text_color\" link=\"$text_color\" vlink=\"$text_color\" alink=\"$text_color\"><center>\n";
	print "<font color=\"$title_color\" size=\"+1\"><b>$title</b></font>\n";
	print "<table><tr><td>$tcom</td></tr></table>\n";
	if ($in{'no'}) {
		open (IN,"$inffile") || &error("OPEN ERROR");
		while (<IN>) {
			($no,$sub,$com,$res) = split(/<>/);
			if ($no eq $in{'no'}) {last;}
		}
		close IN;
		&infdsp;
	} else {
		&dsp;
	}
	# 次の行は著作権表示ですので削除しないで下さい。#
	print "<a href=\"http://cgi-design.net\" target=\"_blank\">CGI-design</a>\n";
}

###
sub dsp {
	$back = $num - $page;
	$next = $num + $page;
	$m = -1;
	open (IN,"$inffile") || &error("OPEN ERROR");
	while (<IN>) {
		$m++;
		if ($m < $num || $next <= $m) {next;}
		($no,$sub,$com,$res) = split(/<>/);
		&infdsp;
	}
	close IN;
	if ($mode eq 'admin') {print "</form>\n";}

	print "<table width=90% cellpadding=0><tr>\n";
	if (0 <= $back) {
		print "<td width=55><form action=\"$script\" method=POST>\n";
		print "<input type=hidden name=mode value=\"$mode\">\n";
		print "<input type=hidden name=pass value=\"$inpass\">\n";
		print "<input type=hidden name=num value=\"$back\">\n";
		print "<input type=submit value=\"BACK\"></td></form>\n";
	}
	if ($next <= $m) {
		print "<td><form action=\"$script\" method=POST>\n";
		print "<input type=hidden name=mode value=\"$mode\">\n";
		print "<input type=hidden name=pass value=\"$inpass\">\n";
		print "<input type=hidden name=num value=\"$next\">\n";
		print "<input type=submit value=\"NEXT\"></td></form>\n";
	}
	print "<td align=right>全 ",$m+1,"件</td></tr></table></td></tr></table>\n";
}

###
sub infdsp {
	$com =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/$1<a href=\"$2\" target=\"_blank\">$2<\/a>/g;
	$res =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/$1<a href=\"$2\" target=\"_blank\">$2<\/a>/g;

	print "<table width=95% cellspacing=0 cellpadding=4><col span=1 valign=top>\n";
	print "<tr><td bgcolor=\"$subbg_color\" align=center colspan=2><table width=100% cellspacing=0 cellpadding=0><tr>\n";
	print "<td><font color=\"$sub_color\">■<b>$sub</b></font></td>\n";
	if ($mode eq 'admin') {
		print "<td align=right nowrap><select name=num$m>";
		for (0 .. $#data) {
			if ($_ == $m) {$sel = ' selected';} else {$sel = '';}
			print "<option value=\"$_\"$sel>",$_+1,"</option>\n";
		}
		print "</select>　<input type=submit name=$no value=\"修正\"></td>";
	}
	print "</tr></table></td></tr>\n";
	print "<tr bgcolor=\"$qstbg_color\"><td width=5% align=center><b>Ｑ</b></td><td style=\"line-height:128%\">$com</td></tr>\n";
	print "<tr bgcolor=\"$ansbg_color\"><td width=5% align=center><b>Ａ</b></td><td style=\"line-height:128%\">$res</td></tr>\n";
	print "</table><br>\n";
}

###
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 name=pass size=10 maxlength=8>\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 "<td align=right><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=submit value=\"新規/修正\">\n";
	print "<input type=submit name=set value=\"基本設定\"></td></form><td width=10></td></tr></table><br>\n";

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

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

	open (IN,"$inffile") || &error("OPEN ERROR");		@data = <IN>;		close IN;
	&in_form;
	print "<hr width=700>修正、削除する場合は[修正]をクリックして下さい。\n";
	print "<table width=",100-$menurate,"% bgcolor=\"$bg_color\" cellspacing=4><tr><td align=right>\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=edt value=\"1\">\n";
	print "<input type=hidden name=num value=\"$num\">\n";
	print "<input type=submit name=sort value=\"並び替え\">　　　　　　&nbsp;</td></tr><tr><td align=center>\n";
	&dsp;
}

###
sub in_form {
	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'}) {
		foreach (@data) {
			($no,$sub,$com,$res) = split(/<>/);
			if ($in{$no}) {last;}
		}
		print "<input type=hidden name=no value=\"$no\">\n";
		print "<input type=hidden name=num value=\"$num\">\n";
		$com =~ s/<br>/\r/g;
		$res =~ s/<br>/\r/g;
	} else {
		$sub=$com=$res='';
	}
	print "<table bgcolor=\"#e6e4ce\" cellspacing=10><tr><td><table cellspacing=1 cellpadding=0>\n";
	print "<tr><td>題名&nbsp;</td><td><input type=text size=80 name=sub value=\"$sub\" style=\"ime-mode:active;\"></td></tr>\n";
	print "<tr><td valign=top><br>質問</td><td><textarea cols=80 rows=8 name=com style=\"ime-mode:active;\">$com</textarea></td></tr>\n";
	print "<tr><td valign=top><br>回答</td><td><textarea cols=80 rows=12 name=res style=\"ime-mode:active;\">$res</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 align=center><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 edtsort {
	@new = ();
	%num = ();
	open (IN,"$inffile") || &error("OPEN ERROR");		@data = <IN>;		close IN;
	for (0 .. $#data) {
		if ($in{"num$_"} eq '') {$num{$_} = $_;} else {$num{$_} = $in{"num$_"};}
	}
	foreach (sort {$num{$a} <=> $num{$b}} keys(%num)) {push(@new,$data[$_]);}
	open (OUT,">$inffile") || &error("OPEN ERROR");		print OUT @new;		close OUT;
	$in{'edt'} = '';
}

###
sub newwrt {
	$in{'com'} =~ s/\r\n|\r|\n/<br>/g;
	$in{'res'} =~ s/\r\n|\r|\n/<br>/g;
	open (IN,"$nofile") || &error("OPEN ERROR");		$no = <IN>; 		close IN;
	$no++;
	open (OUT,">$nofile") || &error("OPEN ERROR");		print OUT $no;		close OUT;

	open (IN,"$inffile") || &error("OPEN ERROR");		@new = <IN>;		close IN;
	unshift(@new,"$no<>$in{'sub'}<>$in{'com'}<>$in{'res'}<>\n");
	open (OUT,">$inffile") || &error("OPEN ERROR");		print OUT @new;		close OUT;
}

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

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

###
sub setup {
	if ($wrt) {
		if ($in{'newpass'} ne '') {$pass = &crypt($in{'newpass'});}
		$title = $in{'title'};
		$tcom = $in{'com'};		$tcom =~ s/\r\n|\r|\n/<br>/g;
		$home = $in{'home'};
		$bg_img = $in{'bg_img'};
		$style = $in{'style'};
		$colors = $in{'colors'};	$colors =~ s/\0/,/g;
		$menurate = $in{'menurate'};
		$page = $in{'page'};

		open (OUT,">$opfile") || &error("OPEN ERROR");
		print OUT "$pass<>$title<>$tcom<>$home<>$bg_img<>$style<>$colors<>$menurate<>$page";
		close OUT;
	}
	print "下記に入力後、「設定する」を押して下さい。\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\" style=\"ime-mode:active;\"></td></tr>\n";
	$tcom =~ s/<br>/\r/g;
	print "<tr><td valign=top><br><b>コメント</b></td><td><textarea cols=60 rows=6 name=com style=\"ime-mode:active;\">$tcom</textarea></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><b>スタイルシート</b></td><td><input type=text size=60 name=style value=\"$style\"></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=text size=3 name=menurate value=\"$menurate\" style=\"text-align:right; ime-mode:disabled;\">%</td></tr>\n";
	print "<tr><td><b>記事表\示</b></td><td><input type=text size=3 name=page value=\"$page\" style=\"text-align:right; ime-mode:disabled;\">件/ページ</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;
}
