#!/usr/bin/perl
#-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
# FAQ2 Ver. 1.0
# Copyright Mikazo's Box
# E-mail webmaster@mikazo.net
# URL http://www.mikazo.net/
#-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
$home = "http://www.denno-cabinet.com/"; # 戻りのURL
$title_txt = "FAQ-よくある質問"; # タイトル
$title_img = ""; # タイトル画像のファイル名(使用しない場合は""にしてください)
$img_w = ""; # タイトル画像の幅
$img_h = ""; # タイトル画像の高さ
$tagkey = 1; # タグ(0:不可 1:可)
$pwd = "datacabi"; # 管理人用パスワード(必ず変えてください)でないと私が遊んじゃうよん♪
$page = 10; # カテゴリ表示時の1ページの件数
@week = ('日','月','火','水','木','金','土'); # 週の表示方法
$list_style = "UL"; # 一覧表示時に質問のリスト(UL または OL)
$sort_flg = 1; # ソート順(0:昇順 1:降順)
$msg_flg = 0; # 管理人からのお知らせ(0:表示しない 1:表示する)
$target = "_top"; # 記事からのリンクする時のターゲット指定
# カテゴリ
$category[0] = "お\申\\込\前のよくある質問";
$category[1] = "機\能\に関するよくある質問";
$script = "./faq2.cgi"; # スクリプトファイル
$logfile = "./faq2log.cgi"; # データファイル
$msgfile = "./kanri.cgi"; # 管理人からのお知らせファイル
$cssfile = "./form.css"; # CSSファイル
$lockfile = "./file.lock"; # ロックファイル
require './jcode.pl'; # jcode.plが同一ディレクトリにない場合だけ変更
#------------------------------------------------------------------------
# 処理です。
#------------------------------------------------------------------------
&decode;
$cate_no = -1;
if ($data{'cate_no'} ne "") {
$cate_no = $data{'cate_no'};
if ($cate_no > $#category) { $cate_no = -1; }
}
if ($data{'action'} eq "admin") { # 管理モード
if ( $data{'pass'} ne $pwd ) { &error("管理パスワードが不正です"); }
if ($data{'proc'} eq "admin_mainte") { # 編集画面
&admin_mainte;
} elsif ($data{'proc'} eq "write") { # 書き込み
&write;
} elsif ($data{'proc'} eq "kanri_msg") { # 管理人からのお知らせ入力画面
&kanri_msg;
} elsif ($data{'proc'} eq "msg_write") { # 管理人からのお知らせ登録
&msg_write;
}
} elsif ($data{'action'} eq "answer") { # 個別表示
&answer;
} elsif ($data{'action'} eq "category") { # カテゴリ毎に表示
&category;
}
&list;
exit;
#------------------------------------------------------------------------
# デコード
#------------------------------------------------------------------------
sub decode {
if($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{CONTENT_LENGTH});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
# 文字コードをS-JIS変換
&jcode'convert(*value, "sjis", "", "z");
# タグ処理
if (($tagkey == 1) || ($name eq "message")) {
$value =~ s/<>/<>/g;
} else {
$value =~ s/</g;
$value =~ s/>/>/g;
}
# 改行等処理
if (($name eq "answer") || ($name eq "message")) {
$value =~ s/\r\n/
/g;
$value =~ s/\r/
/g;
$value =~ s/\n/
/g;
} else {
$value =~ s/\r//g;
$value =~ s/\n//g;
}
$data{$name} = $value;
}
}
#------------------------------------------------------------------------
# 質問一覧表示
#------------------------------------------------------------------------
sub list {
# ヘッダ
&header(0);
print "
\n";
# 質問一覧の表示の表示
# 管理人メッセージ
if ($msg_flg) { &kanri_view; }
&readfile($sort_flg); # ファイルのオープン
$cate_w = "";
print "
\n";
foreach (@dat) {
($no,$cate,$question,$answer,$indate) = split(/<>/,$_);
if ($cate ne $cate_w) {
if ($cate_w ne "") { print "$list_style>\n"; }
print "\n<$list_style class=\"list\">\n";
}
print "$question\n";
$cate_w = $cate;
}
if ($cate_w eq "") {
print " データがありません ";
} else {
print "$list_style>\n";
}
print " |
\n
\n";
&admin_form("new");
# フッダ
&footer;
}
#------------------------------------------------------------------------
# 管理人パスワード入力フォーム
#------------------------------------------------------------------------
sub admin_form {
print "\n";
print "
\n";
}
#------------------------------------------------------------------------
# カテゴリ毎に表示
#------------------------------------------------------------------------
sub category {
if ($cate_no < 0) { &error("カテゴリが不正です"); }
&readfile($sort_flg);
# ヘッダ
&header(1);
print "\n";
# 管理人メッセージ
if ($msg_flg) { &kanri_view; }
print "
\n";
print "
\n";
$scnt = 0;
if ($data{'start'} ne "") { $scnt = $data{'start'}; }
$ecnt = $scnt + $page - 1;
if ($ecnt > $#dat) { $ecnt = $#dat; }
$cnt = -1;
$next_flg = 0;
$back_flg = 0;
foreach (@dat) {
($no,$cate,$question,$answer,$indate) = split(/<>/,$_);
if ($cate eq $cate_no) { $cnt++; }
else { next; }
if ($cnt < $scnt) { $back_flg = 1; next; }
if ($cnt > $ecnt) { $next_flg = 1; next; }
&format;
}
print "
\n";
if ($back_flg) {
# BACKを表示
$back = $scnt - $page;
print " | \n";
}
if ($next_flg) {
# NEXTを表示
$next = $scnt + $page;
print " | \n";
}
print "
\n";
print "
\n";
&admin_form("new");
# フッダ
&footer;
exit;
}
#------------------------------------------------------------------------
# 個別表示
#------------------------------------------------------------------------
sub answer {
&readfile($sort_flg);
if ($#dat < 0) { &error("データがありません"); }
# ヘッダ
&header(2);
print "\n";
foreach (@dat) {
($no,$cate,$question,$answer,$indate) = split(/<>/,$_);
if ($no eq $data{'no'}) {
print "
■$category[$cate]■
\n";
&format;
}
}
print "
\n";
&admin_form("$data{'no'}");
# フッダ
&footer;
exit;
}
#------------------------------------------------------------------------
# 答えのフォーマット
#------------------------------------------------------------------------
sub format {
&date("$indate");
$answer =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1$2<\/A>/g;
print "\n";
print "$question |
\n";
print " \n";
print "$answer\n |
\n";
print "
\n";
}
#------------------------------------------------------------------------
# 記事の編集
#------------------------------------------------------------------------
sub admin_mainte {
&readfile($sort_flg);
# ヘッダ
&header(3);
print "
\n";
if ($data{'no'} ne "new") {
# データの検索
foreach (@dat) {
(@work) = split(/<>/,$_);
if ($data{'no'} eq $work[0]) {
$no = $work[0];
$cate = $work[1];
$question = $work[2];
$answer = $work[3];
$answer =~ s/\
/\n/g;
last;
}
}
} else {
$no = "new";
$cate = "-1";
$question = "";
$answer = "";
}
print "
\n";
print "
\n
\n";
# 質問一覧の表示の表示
$cate_w = "";
print "
\n
\n";
# フッダ
&footer;
exit;
}
#------------------------------------------------------------------------
# ファイルに書きこみ
#------------------------------------------------------------------------
sub write {
# 必須項目のチェック
if ($data{'category'} < 0) { &error("カテゴリを選択して下さい。"); }
if ($data{'question'} eq "") { &error("質問を入力して下さい。"); }
if ($data{'answer'} eq "") { &error("回答を入力して下さい。"); }
&lock;
#日付の取得
$ENV{'TZ'} = "JST-9";
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$syear = sprintf("%02d",$year + 1900);
$smonth = sprintf("%02d",$mon + 1);
$sday = sprintf("%02d",$mday);
$shour = sprintf("%02d",$hour);
$smin = sprintf("%02d",$min);
# ファイルのオープン
&readfile(-1);
if ($data{'no'} eq "new") {
# 最大値の取得
(@maxget) = split(/<>/,$dat[0]);
$maxget[0]++;
$no = $maxget[0];
$indate = $syear.$smonth.$sday.$shour.$smin;
$dat = "$no<>$data{'category'}<>$data{'question'}<>$data{'answer'}<>$indate\n";
unshift(@dat,$dat);
@new = @dat;
} else {
@new = ();
# データの検索
foreach (@dat) {
($no,$cate,$question,$answer,$indate) = split(/<>/,$_);
if ($data{'no'} eq $no) {
if ($data{'del'} eq "") {
$indate = $syear.$smonth.$sday.$shour.$smin;
push(@new,"$no<>$data{'category'}<>$data{'question'}<>$data{'answer'}<>$indate\n");
}
} else {
push(@new,"$_");
}
}
}
if ( !(open(OUT,">$logfile")) ) { &unlock; &error("データファイル[$logfile]がオープン出来ません"); }
print OUT @new;
close(OUT);
&unlock;
&refresh;
}
#------------------------------------------------------------------------
# ファイルのオープン
#------------------------------------------------------------------------
sub readfile {
# リストファイルを開いて読んで閉じる
if ( !(open(RD,"$logfile")) ) { &error("データファイル[$logfile]がオープン出来ません"); }
@work=
;
close(RD);
if ($_[0] < 0) {
@dat = sort {
(split /<>/, $b)[0] <=> (split /<>/, $a)[0]
} @work;
} elsif ($_[0] == 0) {
@dat = sort {
(split /<>/, $a)[1] <=> (split /<>/, $b)[1] ||
(split /<>/, $a)[4] <=> (split /<>/, $b)[4]
} @work;
} else {
@dat = sort {
(split /<>/, $a)[1] <=> (split /<>/, $b)[1] ||
(split /<>/, $b)[4] <=> (split /<>/, $a)[4]
} @work;
}
}
#------------------------------------------------------------------------
# ヘッダー
#------------------------------------------------------------------------
sub header {
print "Content-type: text/html\n\n";
print "\n";
print "\n";
print "\n";
print "\n";
print "$title_txt\n";
print "\n";
print "\n";
print "\n";
print "\n";
print '
大容量にも使える!ファイル転送・ファイル共有サービス 〜電脳デタキャビ〜
\n";
print "\n";
print "\n";
}
#------------------------------------------------------------------------
# エラー
#------------------------------------------------------------------------
sub error {
&header("");
print "
\n";
print "
$_[0]\n";
print "
戻る\n";
print "
";
&footer;
exit;
}
#------------------------------------------------------------------------
# ロック
#------------------------------------------------------------------------
sub lock {
foreach (1 .. 5) {
if (-e $lockfile) {
# ファイル使用中しばらく待機
sleep(1);
} else {
# 書きこみOK♪
open(LOCK,">$lockfile");
close(LOCK);
return;
}
}
&error("他の方が書き込み中です。");
}
#------------------------------------------------------------------------
# ロック解除
#------------------------------------------------------------------------
sub unlock {
if (-e $lockfile) { unlink $lockfile; }
}
#------------------------------------------------------------------------
# リフレッシュ♪(二重投稿禁止用)
#------------------------------------------------------------------------
sub refresh {
print "Content-type: text/html\n\n";
print "
";
exit;
}
#------------------------------------------------------------------------
# 管理人メッセージの表示
#------------------------------------------------------------------------
sub kanri_view {
if ( !(open(RD,"$msgfile")) ) { &error("データファイル[$msgfile]がオープン出来ません"); }
@msg=
;
close(RD);
($title,$message,$indate) = split(/<>/,$msg[0]);
&date("$indate");
$message =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1$2<\/A>/g;
print "\n";
print " $title \n";
print "$message \n";
print "$date \n";
print " |
\n";
}
#------------------------------------------------------------------------
# 管理人メッセージの入力
#------------------------------------------------------------------------
sub kanri_msg {
# 管理人からのお知らせ
if ( !(open(RD,"$msgfile")) ) { &unlock; &error("データファイル[$msgfile]がオープン出来ません"); }
@msg=;
close(RD);
($title,$message,$indate) = split(/<>/,$msg[0]);
&date("$indate");
$message =~ s/\
/\n/g;
$menu = " [戻る]\n";
&header($menu);
print "
";
&footer;
exit;
}
#------------------------------------------------------------------------
# 管理人メッセージに書きこみ
#------------------------------------------------------------------------
sub msg_write {
# 必須項目のチェック
if ($data{'message'} eq "") { &error("メッセージを入力して下さい。"); }
&lock;
# ファイルのオープン
if ( !(open(RD,"$msgfile")) ) { &unlock; &error("データファイル[$msgfile]がオープン出来ません"); }
@msg=;
close(RD);
#日付の取得
$ENV{'TZ'} = "JST-9";
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$syear = sprintf("%02d",$year + 1900);
$smonth = sprintf("%02d",$mon + 1);
$sday = sprintf("%02d",$mday);
$shour = sprintf("%02d",$hour);
$smin = sprintf("%02d",$min);
$indate = $syear.$smonth.$sday.$shour.$smin;
$dat = "$data{'title'}<>$data{'message'}<>$indate\n";
if ( !(open(OUT,">$msgfile")) ) { &unlock; &error("データファイル[$msgfile]がオープン出来ません"); }
print OUT $dat;
close(OUT);
&unlock;
&refresh;
}
#------------------------------------------------------------------------
# 日付フォーマット
#------------------------------------------------------------------------
sub date {
$yy = substr($_[0],0,4);
$mm = sprintf("%d",substr($_[0],4,2));
$dd = sprintf("%d",substr($_[0],6,2));
$hh = sprintf("%d",substr($_[0],8,2));
$mi = sprintf("%02d",substr($_[0],10,2));
$date = "$yy/$mm/$dd";
# 曜日の取得
if ($mm<=2) {$yy--;$mm+=12;}
$w = (($yy+int($yy/4)-int($yy/100)+int($yy/400)+int((13*$mm+8)/5)+$dd)%7);
$ww = $week[$w];
$date = "$date($ww) $hh:$mi";
}