#!/usr/bin/perl
#------------------------------------------#
# ↑このperlのパスはプロバイダによって違う #
# ので、分からないときはプロバイダに聞く。 #
#------------------------------------------#

###########################################################
#  PerlSearch Ver.2.00                                    #
#                                                         #
#  種別　　　　　： Free                                  #
#  作成日　　　　： 09/30/1998                            #
#  更新日　　　　： 09/27/2000                            #
#  著作権者　　　： 飾り職人ひで(Hideyuki Chikada)        #
#  メールアドレス： hideyuki@din.or.jp                    #
#  ホームページ　： http://www.din.or.jp/~hideyuki/home/  #
#                                                         #
#  Copyright (c) 1998 Hideyuki Chikada                    #
#  All rights reserved.                                   #
#=========================================================#
#          この著作権表示は書き換えないで下さい           #
###########################################################


########## ↓ 初期設定(必ず書き換える) ↓ ##########

##### ライブラリの呼び出し(jcode.plのパス)
require '../library/jcode.pl';

##### このファイルのURL(相対URLではなく「http://」から始まる絶対URLで指定)
$thisfile = 'http://contest2.thinkquest.jp/tqj2003/60004/cgi-bin/search/perlsearch.cgi';

##### 検索システムのタイトル
$title = '*WWCD SEARCH*';

##### 文字色や背景色、壁紙などの設定(普通のBODYタグ)
$body = '<BODY BACKGROUND="../w-n21.jpg" TEXT="#000000" LINK="#000000" ALINK="#86CEF9" VLINK="#000000">';

##### FORMタグのMETHOD属性
#--------------------------------------------#
# Method not implemented..というエラーが　　 #
# 出る場合は、POSTを GETに書き換えて下さい。 #
#--------------------------------------------#
$method = 'POST';

##### 「ホームページへ戻る」のリンク先URL
$back = 'http://contest2.thinkquest.jp/tqj2003/60004/top2.html';

##### 検索対象のページがあるディレクトリ(相対パスで指定)
#----------------------------------------------------------------------#
# 複数のディレクトリを指定するには、下のようにカンマで区切って下さい。 #
#----------------------------------------------------------------------#
@sfiles = ('../../');

##### 検索対象のファイルの拡張子
#----------------------------------------------------------------#
# 複数の拡張子を指定するには、下のようにカンマで区切って下さい。 #
#----------------------------------------------------------------#
@ext = ('html','htm');

########## ↑ 初期設定終了 ↑ ##########


#----------------------------------------------------------#
# ここから下をカスタマイズするには、Perlの知識が必要です。 #
# Perlについて十分な知識のない方は、変更しないで下さい。　 #
#----------------------------------------------------------#

##### フォームデータ受け取り
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
    read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
    @pairs = split(/&/,$buffer);
}
else {
    @pairs = split(/&/,$ENV{'QUERY_STRING'});
}

##### フォームデータのデコード、漢字コードをsjisに変換
foreach $pair (@pairs) {
    ($k,$v) = split(/=/,$pair);
    $v =~ tr/+/ /;
    $v =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
    &jcode'convert(*v,"sjis","","z");
    $in{$k} = $v;
}

##### 検索 or フォーム出力
if ($in{'action'} eq "search") {
    &Search; &PrintHtml;
}

else {
    &PrintForm;
}

##### 検索
sub Search {
    $in{'key'} =~ s/(　| )+/ /g;
    if ($in{'key'} =~ /^ $/) {
        $in{'key'} = "";
        &PrintHtml;
    }
    $keyword = $in{'key'};
    $keyword =~ s/(\W)/\\$1/g;
    @keys = split(/\\ /,$keyword);
    $in{'key'} =~ s/\"/&quot;/g;
    $in{'key'} =~ s/</&lt;/g;
    $in{'key'} =~ s/>/&gt;/g;
    $ext = '(' . join('|',@ext) . ')';
    foreach (@sfiles) {
        opendir(DIR,"$_");
        @files = grep(/\.$ext$/,readdir(DIR));
        closedir(DIR);
        $all += @files;
        foreach $url (@files) {
            open(SFILE,"$_$url");
            @souces = <SFILE>;
            close(SFILE);
            $souce = join("",@souces);
            if ($souce =~ m|<TITLE>\s*(.+)\s*</TITLE>|i) {
                $stitle = $1;
            }
            else {
                $stitle = "";
            }
            $souce =~ s/<[^>]*>//g;
            ##### OR検索
            if ($in{'case'} eq "or") {
                $mach = 0;
                foreach $key (@keys) {
                    if ($key eq "") { next; }
                    if ($souce =~ /$key/i) {
                        $mach = 1; last;
                    }
                }
                if ($mach == 1) {
                    push(@hit_urls,"$_$url");
                    push(@hit_titles,$stitle);
                }
            }
            ##### AND検索
            else {
                $mach = 1;
                foreach $key (@keys) {
                    if ($key eq "") { next; }
                    if ($souce !~ /$key/i) {
                        $mach = 0; last;
                    }
                }
                if ($mach == 1) {
                    push(@hit_urls,"$_$url");
                    push(@hit_titles,$stitle);
                }
            }
        }
    }
    $hitcount = @hit_urls;
}

##### 検索結果出力
sub PrintHtml {
    print "Content-type: text/html\n\n";

    ##### ヘッダ出力
    print "<HTML>\n<HEAD>\n<TITLE>$title</TITLE>\n</HEAD>\n";
    print "$body\n";
    print "<H3>$title</H3><P>\n";
    print "サイト内を全文検索します。キーワードを入力して、検索ボタンを押して下さい。<BR>\n";
    print "複数のキーワードを入力するときは、スペース(空白文字)で区切って下さい。<P>\n";
    print "<TABLE BORDER=\"0\" CELLPADDING=\"0\" CELLSPACING=\"0\" WIDTH=\"100%\">\n";
    print "<TR><TD WIDTH=\"20%\" NOWRAP>\n";
    print "<FORM METHOD=\"$method\" ACTION=\"$thisfile\">\n";
    print "<INPUT TYPE=\"HIDDEN\" NAME=\"action\" VALUE=\"search\">\n";
    print "<INPUT NAME=\"key\" VALUE=\"$in{'key'}\" SIZE=\"30\">\n";
    print "<INPUT TYPE=\"SUBMIT\" VALUE=\"検索\"> \n";
    if ($in{'case'} eq "or") {
        print "<INPUT NAME=\"case\" TYPE=\"RADIO\" VALUE=\"and\">and検索 \n";
        print "<INPUT NAME=\"case\" TYPE=\"RADIO\" VALUE=\"or\" CHECKED>or検索\n";
    }
    else {
        print "<INPUT NAME=\"case\" TYPE=\"RADIO\" VALUE=\"and\" CHECKED>and検索 \n";
        print "<INPUT NAME=\"case\" TYPE=\"RADIO\" VALUE=\"or\">or検索\n";
    }
    print "</TD><TD ALIGN=\"RIGHT\" VALIGN=\"TOP\" WIDTH=\"80%\" NOWRAP>\n";
    print "</FORM>\n";
    print "<A HREF=\"$back\">ホームページへ戻る</A>\n";
    print "</TD></TR>\n";
    print "</TABLE>\n";
    print "<HR>\n";

    ##### 検索結果出力
    if ($hitcount == 0) {
        print "<BR><BR>\n";
        print "<CENTER><B><FONT COLOR=\"#FF0000\">該当するページはありませんでした。<BR>別のキーワードで検索して下さい。</FONT></B></CENTER>\n";
        print "<BR><BR>\n";
    }
    else {
        print "<BR>\n";
        print "<B>検索結果</B> &lt;$allページ中 $hitcount件ヒット&gt;\n";
        print "<P>\n";
        print "<UL>\n";
        foreach (0..$#hit_urls) {
            $delurl = 1;
            while ($hit_urls[$_] =~ s|^\.\./||) { $delurl++; }
            $hit_urls[$_] =~ s|^\./||;
            @thisdir = split(m|/|,$thisfile);
            $#thisdir = $#thisdir - $delurl;
            $hit_urls[$_] = join("/",@thisdir) . "/" . $hit_urls[$_];
            if ($hit_titles[$_] eq "") { $hit_titles[$_] = $hit_urls[$_]; }
            print "<LI><A HREF=\"$hit_urls[$_]\">$hit_titles[$_]</A><BR>\n";
        }
        print "</UL>\n";
        print "<BR>\n";
        print "<A HREF=\"$back\">ホームページへ戻る</A>\n";
    }

    ##### フッダ出力
    print "<HR>\n";

    #--------------------------------#
    # ここは、書き換えないで下さい。 #
    #--------------------------------#
    print "<DIV ALIGN=\"RIGHT\"><B><A HREF=\"http://www.din.or.jp/~hideyuki/home/\" TARGET=\"_top\">PerlSearch Ver.2.00</A></B></DIV>\n";

    print "</BODY>\n</HTML>\n";
    exit;
}

##### フォーム出力
sub PrintForm {
    print "Content-type: text/html\n\n";

    ##### ヘッダ出力
    print "<HTML>\n<HEAD>\n<TITLE>$title</TITLE>\n</HEAD>\n";
    print "$body\n";
    print "<H3>$title</H3><P>\n";
    print "サイト内を全文検索します。キーワードを入力して、検索ボタンを押して下さい。<BR>\n";
    print "複数のキーワードを入力するときは、スペース(空白文字)で区切って下さい。<P>\n";

    ##### フォーム出力
    print "<TABLE BORDER=\"0\" CELLPADDING=\"0\" CELLSPACING=\"0\" WIDTH=\"100%\">\n";
    print "<TR><TD WIDTH=\"20%\" NOWRAP>\n";
    print "<FORM METHOD=\"$method\" ACTION=\"$thisfile\">\n";
    print "<INPUT TYPE=\"HIDDEN\" NAME=\"action\" VALUE=\"search\">\n";
    print "<INPUT NAME=\"key\" SIZE=\"30\">\n";
    print "<INPUT TYPE=\"SUBMIT\" VALUE=\"検索\"> \n";
    print "<INPUT NAME=\"case\" TYPE=\"RADIO\" VALUE=\"and\" CHECKED>and検索 \n";
    print "<INPUT NAME=\"case\" TYPE=\"RADIO\" VALUE=\"or\">or検索\n";
    print "</TD><TD ALIGN=\"RIGHT\" VALIGN=\"TOP\" WIDTH=\"80%\" NOWRAP>\n";
    print "</FORM>\n";
    print "<A HREF=\"$back\">ホームページへ戻る</A>\n";
    print "</TD></TR>\n";
    print "</TABLE>\n";
    print "<P><BR>\n";

    ##### フッダ出力
    print "<HR>\n";

    #--------------------------------#
    # ここは、書き換えないで下さい。 #
    #--------------------------------#
    print "<DIV ALIGN=\"RIGHT\"><B><A HREF=\"http://www.din.or.jp/~hideyuki/home/\" TARGET=\"_top\">PerlSearch Ver.2.00</A></B></DIV>\n";

    print "</BODY>\n</HTML>\n";
    exit;
}
