#!/usr/local/bin/perl
#----------------------------------------------------------#
#
#		FAQみたいです Var1.00
#			猫み - 猫でいいです
#			http://neko.s18.xrea.com/
#
#----------------------------------------------------------#
#改造する場合、ここを書き込むと簡単かも
#サイトの名前もしくは改造者の名前
$b_name = "COSMOS NET COMMUNICATIONS";

#ＵＲＬ
$b_url = "http://www.cosmos.ne.jp/";

#改造したＣＧＩの名前
$b_cgi = "";

#----------------------------------------------------------#
#	メイン
#----------------------------------------------------------#
require 'jcode.pl';
$config_cgi= './set.cgi'if(!$config_cgi);
require $config_cgi;

$ref = $ENV{'HTTP_REFERER'};
if( $ref_url && !($ref =~ $ref_url) && $ref ){
	print "Location:$ref\n\n";
}

&decode;
$mode	= $FORM{'mode'};
$kate	= $FORM{'kate'};
$pass	= $FORM{'pass'};
$faq	= $FORM{'faq'};

&main;
sub main{
	if( $mode =~ /admin/ ){ &admin; }
	elsif( $mode =~ /process/ ){ &admin_process; }
	else{ &html; }
}


#----------------------------------------------------------#
#	トップページ
#----------------------------------------------------------#
sub html{
	&header;

	print "<big><b>$cgi_title</b></big><br>\n";
	print <<"HTML";
<div align="right">
<form action="$cgi" method="POST">
<input type="text" name="search_word" value="">
<input type="hidden" name="mode" value="search">
<input type="submit" value="検索する">
</form>
</div>
[<a href="$cgi">一覧</a>]
[<a href="javascript:history.go(-1)">1つ前に戻る</A>]<br>
<hr><span style="line-height:140%;font-size:middle">
HTML

	if( $mode eq "kate" ){ &html_kate; }
	elsif( $faq && $kate ){ &faq; }
	elsif( $mode eq "search" ){ &search; }
	else {
		&open_kate;
		foreach (@data_kate) {
			($no_kate,$kate,$name_kate,) = split(/,/, $_);
			print "<font color=#008800>■</font> <a href=$cgi?mode=kate&kate=$kate>$name_kate</a><br>\n<ol>";
			&open_data;
			$i = 0;
			foreach (@data_data) {
				($no,$faq_q,$faq_a) = split(/,/, $_);
				if( $i < $kate_cnt ){
					print "<li><a href=$cgi?kate=$kate&faq=$no>$faq_q</a>\n";
				}
				elsif( $i >= $kate_cnt ){ print "<br><br><a href=\"$cgi?mode=kate&kate=$kate\">$name_kateを一覧表\示</a>\n"; last; }
				$i++;
			}
			print "</ol><hr>\n";
		}
	}
	&admin_form;
	&footer;
}
sub html_kate{
	&open_kate;
	foreach (@data_kate) {
		($no_kate,$kate_id,$name_kate,) = split(/,/, $_);
		if( $kate eq $kate_id ){
			print "$name_kateのFAQ一覧<br>";
			last;
		}
	}
	print "<ol>";
	&open_data;
	foreach (@data_data) {
		($no,$faq_q,$faq_a) = split(/,/, $_);
		print "<li><a href=$cgi?kate=$kate&faq=$no>$faq_q</a>\n";
	}
	print "</ol><hr>\n";
}


#----------------------------------------------------------#
#	FAQ表示
#----------------------------------------------------------#
sub faq{
	&open_data;
	foreach (@data_data) {
		($no,$faq_q,$faq_a) = split(/,/, $_);
		if( $faq eq $no ){
			print <<"HTML";
<font color="#008800">■</font> <big><b>$faq_q</b></big><br>
<blockquote style="line-height:140%;font-size:middle">
$faq_a
</blockquote>
HTML
			last;
		}
	}
}
#----------------------------------------------------------#
#	検索
#----------------------------------------------------------#
sub search{
	$search_word	= $FORM{'search_word'};
	if( !$search_word ){ &error("キーワードが未記入です。"); }
	&open_kate;
	foreach (@data_kate) {
		($no_kate,$kate,$name_kate,) = split(/,/, $_);
		&open_data;
		foreach (@data_data) {
			($no,$faq_q,$faq_a) = split(/,/, $_);

			$keyword = "$faq_q$faq_a";

			#著作権なしのCGIの応用だった気がします……。
			($match, $code) = jcode::getcode(\$keyword);
			$code = 'euc' if $code eq undef and $match > 0;
			$ascii = '[\x00-\x7F]';
			if ($code eq 'euc') {
				if ($keyword !~ /^(?:$jcode::re_euc_c|$jcode::re_euc_kana|$jcode::re_euc_0212|$ascii)*$/ox) {
					if ($str =~ /^(?:$jcode::re_sjis_c|$jcode::re_sjis_kana|$ascii)*$/o) {
						$code = 'sjis';
					}
				}
			}
			jcode::convert(\$keyword, 'euc');
			jcode::convert(\$search_word, 'euc');

	
			if( $keyword =~ /$search_word/ ){
				jcode::convert(\$keyword, $code);
				print <<"HTML";
<b>$name_kate</b> - <a href=$cgi?kate=$kate&faq=$no>$faq_q</a><br>
<br>
HTML
			}
		}
	}
}


#----------------------------------------------------------#
#	管理室
#----------------------------------------------------------#
sub admin{
	if( $pass ne $adpass ){ &error("管理パスワードが間違っています。"); }

	$cgi_title .= "[管理室]";

	&header;
	print "<big><b>管理室</b></big><br>";

	print <<"HTML";
<br>
[<a href="$cgi">もどる</a>]
[<a href="$cgi?mode=admin&pass=$pass">管理室</a>]
[<a href="$cgi?pass=$pass&mode=admin_kate">カテゴリ編集</a>]
[<a href="$cgi?pass=$pass&mode=admin_newfaq">FAQ追加</a>]
<hr>
HTML
	if( $mode =~ "kate" ){ &admin_kate; }
	elsif( $mode =~ "newfaq" ){ &admin_newfaq; }
	elsif( $kate && $faq ){ &admin_editfaq; }
	elsif( $mode =~ "ada" ){ ; }
	else {
		print <<"HTML";
上のメニューから、行いたい作業を選択してください。<br>
<br>
<b>もどる</b><br>
管理室からFAQトップに戻ります。<br>
<br>
<b>管理室</b><br>
今見ているこのページです。<br>
<br>
<b>カテゴリ編集</b><br>
カテゴリーの追加、削除を行います。<br>
<br>
<b></b><br>


HTML
	}
	if( $msg ){ print "<hr>$msg"; }
	&footer;
}
#----------------------------#
#	管理 - カテゴリー
#----------------------------#
sub admin_kate{
	print "<form action=$cgi method=POST>";
	print "<table border=0>";
	&open_kate;
	foreach (@data_kate) {
		($no,$id,$name_kate,) = split(/,/, $_);
		print "<tr><td>$no<input type=radio name=edit_id value=$id>$id</td><td>：</td><td>$name_kate</td></tr>";
	}
	print "</table>";
	$add_no = $no + 1;
	print <<"HTML";
<inp ut type="submit" name="carry" value="edit/編集">
<input type="submit" name="carry" value="delete/削除">
<input type="checkbox" name="delete"><small>←削除を行う場合、チェックを入れてください。</small>
<br>
<small>
※チェックを入れ削除を押すと、確認なしに選択したカテゴリが削除されます。<br>
※削除するカテゴリに属するFAQも、削除されます。<br>
</small>
<br>
▼ カテゴリの追加<br>
カテゴリID：<input type="text" size="10" name="add_id" value=""><small>※半角英数</small><br>
カテゴリ名：<input type="text" size="30" name="add_name" value=""><br>
<input type="hidden" name="add_no" value="$add_no">
<input type="submit" name="carry" value="add/追加する">

<input type="hidden" name="pass" value="$pass">
<input type="hidden" name="mode" value="process_kate">
</form>
HTML
}
#----------------------------#
#	管理 - FAQ追加
#----------------------------#
sub admin_newfaq{
	&open_kate;
	if( !@data_kate ){ print "カテゴリーがありません。<br>最初にカテゴリーを作成してください。"; &footer; }
	print "<form action=$cgi method=POST>";
	print <<"HTML";
<b>新規FAQ</b><br>
<table>
	<tr>
		<td>カテゴリ</td><td>：</td>
		<td><select name="kate">
		<option value=>カテゴリ選択
HTML
	foreach (@data_kate) {
		($no,$id,$name_kate,) = split(/,/, $_);
		if( $id eq $kate ){
			print "<option value=\"$id\" selected>$name_kate\n";
		} else {
			print "<option value=\"$id\">$name_kate\n";
		}
	}
	print <<"HTML";
		</select></td>
	</tr>
	<tr>
		<td>質問</td><td>：</td>
		<td><input type="text" size="68" name="faq_q" value=""></td>
	</tr>
	<tr>
		<td valign="top">回答</td><td valign="top">：</td>
		<td><textarea cols="48" rows="8" name="faq_a"></textarea></td>
	</tr>
	<tr>
		<td></td><td></td>
		<td><input type="submit" value="　送　信　"></td>
	</tr>
</table>
<input type="hidden" name="pass" value="$pass">
<input type="hidden" name="carry" value="new">
<input type="hidden" name="mode" value="process_newfaq">
</form>
HTML
}
#----------------------------#
#	管理 - FAQ編集
#----------------------------#
sub admin_editfaq{
	&open_kate;
	if( !@data_kate ){ print "カテゴリーがありません。<br>最初にカテゴリーを作成してください。"; &footer; }
	print "<form action=$cgi method=POST>";
	print <<"HTML";
<b>FAQ編集</b><br>
<table>
	<tr>
		<td>カテゴリ</td><td>：</td>
		<td><select name="kate">
		<option value=>カテゴリ選択
HTML
	foreach (@data_kate) {
		($no,$id,$name_kate,) = split(/,/, $_);
		if( $id eq $kate ){
			print "<option value=\"$id\" selected>$name_kate\n";
		} else {
			print "<option value=\"$id\">$name_kate\n";
		}
	}

	&open_data;
	foreach (@data_data) {
		($no,$faq_q,$faq_a) = split(/,/, $_);
		if( $faq eq $no ){
			last;
		}
	}
	$faq_a =~ s/<br>/\r\n/g;
	print <<"HTML";
		</select></td>
	</tr>
	<tr>
		<td>質問</td><td>：</td>
		<td><input type="text" size="68" name="faq_q" value="$faq_q"></td>
	</tr>
	<tr>
		<td valign="top">回答</td><td valign="top">：</td>
		<td><textarea cols="48" rows="8" name="faq_a">$faq_a</textarea></td>
	</tr>
	<tr>
		<td></td><td></td>
		<td><input type="submit" value="　送　信　"></td>
	</tr>
</table>
<input type="hidden" name="pass" value="$pass">
<input type="hidden" name="carry" value="edit">
<input type="hidden" name="old_kate" value="$kate">
<input type="hidden" name="faq" value="$faq">
<input type="hidden" name="mode" value="process_editfaq">
</form>
<hr>
<form action=$cgi method=POST>
<input type="checkbox" name="deleteyes">削除する場合はチェックを入れる
<input type="hidden" name="faq_q" value="$faq_q">
<input type="hidden" name="pass" value="$pass">
<input type="hidden" name="carry" value="edit">
<input type="hidden" name="kate" value="$kate">
<input type="hidden" name="faq" value="$faq">
<input type="hidden" name="mode" value="process_deletefaq">
<input type="submit" value="削除する">
</form>


HTML
}


#----------------------------------------------------------#
#	処理
#----------------------------------------------------------#
sub admin_process{
	if( $pass ne $adpass ){ &error("管理パスワードが間違っています。"); }

	$carry		= $FORM{'carry'};

	if( $mode =~ /kate/ ){ &process_kate; }
	elsif( $mode =~ /newfaq/ ){ &process_newfaq; }
	elsif( $mode =~ /editfaq/ ){ &process_editfaq; }
	elsif( $mode =~ /deletefaq/ ){ &process_deletefaq; }

	&admin;
}
#----------------------------#
#	処理 - カテゴリー
#----------------------------#
sub process_kate{
	$delete		= $FORM{'delete'};

	if( $carry =~ /add/ ){
		$add_no		= $FORM{'add_no'};
		$add_id		= $FORM{'add_id'};
		if( $add_id =~ /[\x80-\xff]/ || !$add_id){ &error("IDが未記入、または全角が混ざっています。"); }
		$add_name	= $FORM{'add_name'};
		if( !$add_name ){ &error("カテゴリ名が未記入です。"); }

		&open_kate;
		foreach (@data_kate) {
			($no,$id,$name_kate,) = split(/,/, $_);
			if( $add_id eq $id ){ &error("同じIDのカテゴリが存在します。"); }
		}

		$add_kate = "$add_no,$add_id,$add_name,\n";
		open(IN, ">> $file_kate");
		 print IN $add_kate;
		close(IN);
	} elsif( $carry =~ /edit/ ){
		#未実装
	} elsif( $carry =~ /delete/ && $delete ){
		$edit_id	= $FORM{'edit_id'};
		&open_kate;
		foreach (@data_kate) {
			($no,$id,$name_kate,) = split(/,/, $_);
			if( $edit_id ne $id ){
				$data_kate .= "$_";
			}
		}
		open(IN, "> $file_kate");
		 print IN $data_kate;
		close(IN);

		if (-f "$fold_data/$file_data\_$id.dat") {
			unlink("$fold_data/$file_data\_$edit_id.dat")
		}
	}
}
#----------------------------#
#	処理 - 新規FAQ
#----------------------------#
sub process_newfaq{

	if( !$kate ){ &error("カテゴリーが選択されていません。"); }

	$carry	= $FORM{'carry'};

	if( $carry eq "new" ){
		$faq_q	= $FORM{'faq_q'};
		if( !$faq_q ){ &error("質問が未記入です。"); }
		$faq_a	= $FORM{'faq_a'};
		if( !$faq_a ){ &error("回答が未記入です。"); }

		#禁止タグを封じる
		foreach(0 .. $#ng) {
			$no = $_;
			$faq_a =~ s/<$ng[$_]/&lt;$ng[$_]/g;
			$faq_a =~ s/$ng[$_]>/$ng[$_]&gt;/g;
		}#foreach

		#オートリンク
		if( $auto ){
			$faq_a =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/$1<a href=\"$2\" target='_blank'>$2<\/a>/g;
		}


		&open_data;
		$last_faq = pop(@data_data);
		( $no,$q,$a, ) = split(/,/, $last_faq);
		$no++;
		$new_faq = "$no,$faq_q,$faq_a,\n";

		open(IN, ">> $fold_data/$file_data\_$kate.dat");
		 print IN $new_faq;
		close(IN);

		$msg = "FAQが追加されました。<br><a href=$cgi?kate=$kate&faq=$no target=_blank>$faq_q</a><br>\n";
	}
#	&error("[$new_faq|$last_faq|$fold_data/$file_data\_$kate.dat]");
}
#----------------------------#
#	処理 - FAQ編集
#----------------------------#
sub process_editfaq{

	if( !$kate ){ &error("カテゴリーが選択されていません。"); }

	$carry		= $FORM{'carry'};
	$old_kate	= $FORM{'old_kate'};

	if( $carry eq "edit" ){
		$faq_q	= $FORM{'faq_q'};
		if( !$faq_q ){ &error("質問が未記入です。"); }
		$faq_a	= $FORM{'faq_a'};
		if( !$faq_a ){ &error("回答が未記入です。"); }

		#禁止タグを封じる
		foreach(0 .. $#ng) {
			$no = $_;
			$faq_a =~ s/<$ng[$_]/&lt;$ng[$_]/g;
			$faq_a =~ s/$ng[$_]>/$ng[$_]&gt;/g;
		}#foreach

		#オートリンク
		if( $auto ){
			$faq_a =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+)/$1<a href=\"$2\" target='_blank'>$2<\/a>/g;
		}

		#カテゴリー変更した場合
		if( $kate ne $old_kate ){
			&open_data;
			$last_faq = pop(@data_data);
			( $no,$q,$a, ) = split(/,/, $last_faq);
			$no++;
			$new_faq = "$no,$faq_q,$faq_a,\n";

			open(IN, ">> $fold_data/$file_data\_$kate.dat");
			 print IN $new_faq;
			close(IN);

			$new_kate = $kate;
			$kate = $old_kate;
			&open_data;
			$new_faq = "";
			foreach(@data_data) {
				( $n,$q,$a, ) = split(/,/, $_);
				if( $n ne $faq ){
					$new_faq .= "$n,$q,$a,\n";
				}
			}
			open(IN, "> $fold_data/$file_data\_$kate.dat");
			 print IN $new_faq;
			close(IN);
			$kate = $new_kate;
		} else {
			&open_data;
			$new_faq = "";
			foreach(@data_data) {
				( $n,$q,$a, ) = split(/,/, $_);
				if( $n eq $faq ){
					$new_faq .= "$faq,$faq_q,$faq_a,\n";
				} else {
					$new_faq .= "$n,$q,$a,\n";
				}
			}
			open(IN, "> $fold_data/$file_data\_$kate.dat");
			 print IN $new_faq;
			close(IN);
			$no = $faq;
		}
		$msg .= "FAQが更新されました。<br><a href=$cgi?kate=$kate&faq=$no target=_blank>$faq_q</a><br>\n";
	}
#	&error("[$new_faq|$last_faq|$fold_data/$file_data\_$kate.dat]");
}
#----------------------------#
#	処理 - FAQ削除
#----------------------------#
sub process_deletefaq{

	if( !$kate ){ &error("カテゴリーが選択されていません。"); }

	$carry		= $FORM{'carry'};
	$old_kate	= $FORM{'old_kate'};

	&open_data;
	$new_faq = "";
	foreach(@data_data) {
		( $n,$q,$a, ) = split(/,/, $_);
		if( $n ne $faq ){
			$new_faq .= "$n,$q,$a,\n";
		}
	}
	open(IN, "> $fold_data/$file_data\_$kate.dat");
	 print IN $new_faq;
	close(IN);
	$no = $faq;

	$kate = "";
	$msg .= "FAQを削除しました。<br>\n";
}


#----------------------------------------------------------#
#	ログイン用のフォーム
#----------------------------------------------------------#
sub admin_form{
	print <<"HTML";
<div align="right"><form action="$cgi" method="POST">
<input type="hidden" name="mode" value="admin">
<input type="password" name="pass" size="10" value="$pass">
<input type="hidden" name="kate" value="$kate">
<input type="hidden" name="faq" value="$faq">
<input type="submit" value="管理画面">
</form></div>
HTML
}


#----------------------------------------------------------#
#	ヘッダー
#----------------------------------------------------------#
sub header{
	print "Content-type: text/html\n\n";
	print <<"EOM";
<html>
	<head>
		<title>$cgi_title</title>
		<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
<link rel="stylesheet" href="$css">
<style type="text/css" ><!--
$css2
form {margin: 0px;}
//--></style>
	</head>
$body
$koukoku
EOM
}


#----------------------------------------------------------#
#	フッター
#----------------------------------------------------------#
sub footer{
  print "<hr>";
  print "<div align=\"right\">";
  print "<small>$tia</small></div>\n";
  print "</TD></TR></table>";
  print "<script src=\"http://www.google-analytics.com/urchin.js\" type=\"text/javascript\"></script>\n";
  print "<script type=\"text/javascript\">\n";
  print "_uacct = \"UA-535834-1\"\;\n";
  print "urchinTracker()\;\n";
  print "</script>\n";
  print "</body>\n";
  print "</html>";
  exit;
}

#----------------------------------------------------------#
#	エラー
#----------------------------------------------------------#
sub error{
	local ($error) = @_;
	&header;
	print "ERROR発生です！<br><br>\n";
	print "$error<br>\n";
	print "<br>\n";
	&footer;
	exit;
}


#----------------------------------------------------------#
#	ファイル
#----------------------------------------------------------#
sub open_kate{
	open(INK, "<$file_kate");
	@data_kate = <INK>;
	close(INK);
}
sub open_data{
	open(INK, "< $fold_data/$file_data\_$kate.dat");
	@data_data = <INK>;
	close(INK);
}


#-------------------------------------------------------------------#
#		データ習得
#-------------------------------------------------------------------#
sub nd{
	   ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
	$mon = ($mon + 1);
	$year = ($year + 1900);
	   if ($sec < 10)  { $sec = "0$sec";   }
	   if ($min < 10)  { $min = "0$min";   }
	   if ($hour < 10) { $hour = "0$hour"; }
	   if ($mday < 10) { $mday = "0$mday"; }
	   if ($mon < 10)  { $mon = "0$mon";  }
	$time = "$mon月$mday日$hour時$min分";
	$addr = $ENV{'REMOTE_ADDR'};
	$host = $ENV{'REMOTE_HOST'};
}
sub ti{
	$tia = "オリジナル - <a href=\"http://neko.s18.xrea.com/\" target=\"_top\">FAQみたいです</a> - 猫でいいです<br>\n";
	if( $b_name ){
		$tia .= "改造 - <a href=\"$b_url\" target=\"_top\">$b_cgi</a> - $b_name<br></span>\n";
	}
}


#----------------------------------------------------------#
#	デコード
#----------------------------------------------------------#
sub decode{
  if ($ENV{'REQUEST_METHOD'} eq "POST") {
	read(STDIN, $Form_Data, $ENV{'CONTENT_LENGTH'});
  } else {
	$Form_Data = $ENV{'QUERY_STRING'};
  }

  &ti;
  @pairs = split(/&/, $Form_Data);
  foreach (@pairs){
    ($name, $value) = split(/=/, $_);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
	if( $tag ){
		$value =~ s/</&lt;/g;
		$value =~ s/>/&gt;/g;
	}
    $value =~ s/\r\n/<br>/g;
    $value =~ s/,/，/g;
    $FORM{$name} = $value;
  }
	$host = $ENV{'REMOTE_HOST'};
	$addr = $ENV{'REMOTE_ADDR'};
}
