#!/usr/local/bin/perl

use CGI::Carp qw(fatalsToBrowser);

require './jcode.pl';
require './cgi-lib.pl';
&ReadParse;

# このファイルのURL
$cgifile = 'http://210.233.64.168/~tom-b/keijiban/keijiban.cgi';

# ログファイルのパス
$log_data = '../keijiban_dat/keiji_log.dat';

# ロックファイルのパス
$lock_file = '../keijiban_dat/lockfile';

# タイトル,ヘッダ,body
$title = '掲示板';
$head_title = '<HTML><HEAD><TITLE>掲示板</TITLE></HEAD>';
$body = '<BODY BGCOLOR="#FFEFD5" TEXT="#000000">';

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

# 「戻る」のリンク先URL
$top_URL = 'http://210.233.64.168/~tom-b/keijiban/keijiban.cgi';

# 最大件数
$max_log = 90;

# １ページの件数
$page_log = 30;

# パスワード
$password = 'oka';

# sjisに変換
while (($k,$v) = each %in) {
    &jcode'convert(*v,"sjis");
    &jcode'tr(*v,"０１２３４５６７８９", "0123456789");
    $v =~ s/: /:/g;
    $v =~ s/\"/\'/g;
    $in{$k} = $v;
}

# 現在の時間取得
($buf_sec,$buf_min,$buf_hour,$buf_day,$buf_mon,$buf_year,$buf_week) = localtime;
$buf_mon++;
$buf_year = 1900+$buf_year;
$buf_mon  = sprintf("%.2d",$buf_mon);
$buf_day  = sprintf("%.2d",$buf_day);
$buf_hour = sprintf("%.2d",$buf_hour);
$buf_sec  = sprintf("%.2d",$buf_sec);
$buf_min  = sprintf("%.2d",$buf_min);
$buf_week = ('日','月','火','水','木','金','土')[$buf_week];

$buf_jikan = "$buf_year年$buf_mon月$buf_day日($buf_week) $buf_hour時$buf_min分$buf_sec秒";

# 画面制御
if ($in{'act_sts'} eq "s_pas_chk") {
    if ($in{'pass_word'} eq $password) {
        &g_mente;
    } else {
        &g_PasErr
    }
} elsif ($in{'act_sts'} eq "s_pas") {
    &g_Kanri;
} elsif ($in{'act_sts'} eq "s_add") {
    &g_Add;
} elsif ($in{'act_sts'} eq "s_chk") {
    &g_Check;
} elsif ($in{'act_sts'} eq "s_top") {
    &read_File;
    &write_File;
    &renew_top;
    print "Location: $cgifile\n\n";
} elsif ($in{'act_sts'} eq "s_del") {
    &read_File; &g_Del;
} elsif ($in{'act_sts'} eq "s_del2") {
    &read_File;
    &del_Mess;
    &renew_top;
    print "Location: $cgifile\n\n";
} elsif ($in{'act_sts'} eq "renew") {
    &renew_top;
    print "Location: $cgifile\n\n";
} else {
    &read_File;
    &g_Main;
}

# ログファイル読込
sub read_File {
    open(LOG,"$log_data");
    @keiji_logs = <LOG>;
    close(LOG);
}

# ファイルロック
sub file_lock {
    $count    = 0;
    while ( !symlink("$$","$lock_file") ) {
        if ( $count == 5 ) {
            &g_accessErr;
        }
        $count++;
        sleep(2);
    }
}

# ログファイルへ出力
sub write_File {

    # ファイルのロック
    # &file_lock;
    
    $in{'text'} =~ s/\r\n/<BR>/g;
    $in{'text'} =~ s/\r/<BR>/g;

    if (substr($keiji_logs[0],1,2) eq ': ') {
        $number = substr($keiji_logs[0],0,1);
    } elsif (substr($keiji_logs[0],2,2) eq ': ') {
        $number = substr($keiji_logs[0],0,2);
    } elsif (substr($keiji_logs[0],3,2) eq ': ') {
        $number = substr($keiji_logs[0],0,3);
    }
    $number++;

    $new_log = "$number: $buf_jikan: $in{'text'}: \n";

    @keiji_logs = ($new_log,@keiji_logs);

    $count = 0;
    foreach $addlog (@keiji_logs) {
        $count++;
        if ($count > $max_log) { last; }
        push (@newlogs,$addlog);
    }

    open(LOG,">$log_data");
    flock(LOG,2);
    print LOG @newlogs;
    flock(LOG,8);
    close(LOG);

    # ロック解除
    # unlink($lock_file);
    
}

# メッセージ表示画面
sub g_Main {

    print "Content-type: text/html\n\n";

&read_tmpl("keijiban_tmpl.html");
    # ヘッダ出力
print $html{'head'};

    # 記事出力
    $count = 0;
    if (! $in{'next'}) { $in{'next'} = 0; }

    foreach ($in{'next'}..$#keiji_logs) {
        if ($count >= $page_log) {
            $nextpage = "on";
            $in{'next'} = $in{'next'} + $count;
            last;
        }
        $count++;

        ($out_number,$out_jikan,$out_kiji,$out_text) = split(/: /,$keiji_logs[$_]);

        #print "<B>$out_jikan</B><P>\n";
        if ( $out_kiji eq "釣果") {
            $out_kijidisp = "<FONT SIZE=\"2\" COLOR=\"#0000FF\"> $out_kiji</FONT>\n";
        } else {
            $out_kijidisp =  "<FONT SIZE=\"2\" COLOR=\"#FF0000\"><B> $out_kiji</B></FONT>\n";
        }
        $out_text =~ /(\d+)年\s*(\d+)月\s*(\d+)日/;
        my ($y,$m,$d) = ($1,$2,$3);
        my ($weather,$kion,$water_t,$water_l,$water,$wind);
        if ($out_text =~ /天気(:|：)(\S+)\s/) {
         $weather = $2;
        }
        if ( $out_text =~ /気温(:|：)(\S+)\s/) {
         $kion = $2;
        }
        if ($out_text =~ /水温(:|：)(\S+)\s/) {
         $water_t = $2;
        }
        if ($out_text =~ /水位(:|：)(\S+)\s/) {
         $water_l = $2;
        }
        if ($out_text =~ /水(:|：)(\S+)\s/) {
         $water = $2;
        }
        if ($out_text =~ /風向(:|：)(\S+)\s/) {
         $wind = $2;
        }
        $out_text = (split(/<p>/, $out_text))[-1];
        if ( $out_kiji eq "釣果") {
        	$status = <<"EOF";
														<table border="0" cellspacing="0" cellpadding="5">
															<tr>
																<td nowrap><font size="2" color="#003399">天気：$weather</font></td>
																<td nowrap><font size="2" color="#003399">気温：$kion</font></td>
																<td nowrap><font size="2" color="#003399">水温：$water_t</font></td>
																<td nowrap><font size="2" color="#003399">水位：$water_l</font></td>
																<td nowrap><font size="2" color="#003399">水質：$water</font></td>
																<td nowrap><font size="2" color="#003399">風向：$wind</font></td>
															</tr>
														</table>
EOF
        } else {
        	$status = '';
        }
        print <<"EOF";
										<table width="550" border="0" cellspacing="1" cellpadding="5" bgcolor="#003399">
											<tr>
												<td bgcolor="white"><font size="2" color="#ff3333"><b>$out_kijidisp　</b>[$y年 $m月 $d日]</font><font size="2" color="#ff6633"><br>
													</font><font size="2">
													$status
													</font>
													<hr>
													<font size="2">$out_text</font></td>
											</tr>
										</table>
										<br> 
EOF
    }

    # ページフッタ出力
    if ($nextpage eq "on") {
        #print "<FONT SIZE=\"2\" COLOR=\"#323232\">１ページに表\示されるのは、最高$page_log件までです。</FONT><BR>\n";
        #print "<FONT SIZE=\"2\" COLOR=\"#323232\">さらに過去の記事を見たいときは、下のボタンを押して下さい。</FONT><P>\n";
        print "<FORM METHOD=\"$method\" ACTION=\"$cgifile\">\n";
        print "<INPUT TYPE=\"HIDDEN\" NAME=\"next\" VALUE=\"$in{'next'}\">\n";
        print "<INPUT TYPE=\"SUBMIT\" VALUE=\"次のページ\">\n";
        print "</FORM>\n\n";##<HR SIZE=2>
    } else {
        #print "<FONT SIZE=\"2\" COLOR=\"#323232\">現在登録されている記事は以上です。</FONT><BR>\n";
        #print "<FONT SIZE=\"2\" COLOR=\"#323232\">$max_log件を越えると古い記事から自動的に削除しています。</FONT><P>\n";
        print "<FONT SIZE=\"2\" COLOR=\"#323232\"><A HREF=\"$top_URL\">ＴＯＰへ戻る</A></FONT>\n";
        #print "<HR SIZE=2>\n";
    }


print $html{'foot'};

    exit;
}

# 管理者画面
sub g_Kanri {
    print "Content-type: text/html\n\n";
    print "$head_title\n";
    print "$body\n";
    print "<H3>管理者</H3>\n";
    print "<P><BR><BR>\n";
    print "<FORM METHOD=\"$method\" ACTION=\"$cgifile\">\n";
    print "<INPUT TYPE=\"HIDDEN\" NAME=\"act_sts\" VALUE=\"s_pas_chk\">\n";
    print "パスワード ";
    print "<INPUT TYPE=\"PASSWORD\" NAME=\"pass_word\">\n";
    print "<INPUT TYPE=\"SUBMIT\" VALUE=\"管理者\">\n";
    print "</FORM>\n";
    print "</BODY>\n</HTML>\n";

    exit;
}

# 追加・削除画面
sub g_mente {
    print "Content-type: text/html\n\n";
    print "$head_title\n";
    print "$body\n";
    print "<H3>登録・削除</H3>\n";
    print "<P><BR>\n";
    print "<FORM METHOD=\"$method\" ACTION=\"$cgifile\">\n";
    print "<INPUT TYPE=\"HIDDEN\" NAME=\"act_sts\" VALUE=\"s_add\">\n";
    print "<INPUT TYPE=\"SUBMIT\" VALUE=\"登録\">\n";
    print "記事を登録する。\n";
    print "</FORM>\n";
    print "<FORM METHOD=\"$method\" ACTION=\"$cgifile\">\n";
    print "<INPUT TYPE=\"HIDDEN\" NAME=\"act_sts\" VALUE=\"s_del\">\n";
    print "<INPUT TYPE=\"SUBMIT\" VALUE=\"削除\">\n";
    print "記事の削除を行う。\n";
    print "</FORM>\n";
    print "</BODY>\n</HTML>\n";

    exit;
}

# 追加画面
sub g_Add {
    print "Content-type: text/html\n\n";
    print "$head_title\n";
    print "$body\n";
    print "<H3>追加</H3>\n";
    print "<P><BR>\n";
    print "<FORM METHOD=\"$method\" ACTION=\"$cgifile\">\n";
    print "<INPUT TYPE=\"HIDDEN\" NAME=\"act_sts\" VALUE=\"s_chk\">\n";
    print "記事<BR>\n";
    print "<INPUT TYPE=\"RADIO\" NAME=\"f_kiji\" VALUE=\"tyou\" CHECKED>釣果";
    print "<INPUT TYPE=\"RADIO\" NAME=\"f_kiji\" VALUE=\"sira\">お知らせ <p>";
    
    print "日時：";
    print "<INPUT TYPE=\"text\" VALUE=$buf_year NAME=b_year size=5 >年";
    print "<INPUT TYPE=\"text\" VALUE=$buf_mon  NAME=\"b_mon\"  size=3 >月";
    print "<INPUT TYPE=\"text\" VALUE=$buf_day  NAME=\"b_day\"  size=3 >日 <BR>";
    
    print "天気<BR>\n";
    print "<INPUT TYPE=\"RADIO\" NAME=\"tenki\" VALUE=\"hare\" CHECKED>晴れ";
    print "<INPUT TYPE=\"RADIO\" NAME=\"tenki\" VALUE=\"kumori\">曇り";
    print "<INPUT TYPE=\"RADIO\" NAME=\"tenki\" VALUE=\"ame\">雨 ";
    print "<INPUT TYPE=\"RADIO\" NAME=\"tenki\" VALUE=\"yuki\">雪 <p>";

    print "気温：";
    print "<INPUT TYPE=\"text\"  NAME=b_kion size=5 >度<BR>";
    
    print "水温：";
    print "<INPUT TYPE=\"text\"  NAME=b_suion size=5 >度<BR>";

    print "水位：";
    print "<INPUT TYPE=\"text\"  NAME=b_suii size=5 >ｃｍ<BR>";
    
    print "水質<BR>\n";
    print "<INPUT TYPE=\"RADIO\" NAME=\"nigori\" VALUE=\"nigo\" CHECKED>濁る";
    print "<INPUT TYPE=\"RADIO\" NAME=\"nigori\" VALUE=\"hutu\">普通";
    print "<INPUT TYPE=\"RADIO\" NAME=\"nigori\" VALUE=\"sumu\">澄む<p>";
    
    print "風向：";
    print "<INPUT TYPE=\"text\"  NAME=wind size=8 ><BR>";
    
    print "内容<BR>\n";
    print "<TEXTAREA NAME=\"text\" ROWS=\"5\" COLS=\"50\" WRAP></TEXTAREA>\n";
    print "<P>\n";
    print "<INPUT TYPE=\"SUBMIT\" VALUE=\"確認\">\n";
    print "<INPUT TYPE=\"RESET\" VALUE=\"クリア\">\n";
    print "</FORM>\n";
    print "</BODY>\n</HTML>\n";

    exit;
}

# 追加確認画面
sub g_Check {
    print "Content-type: text/html\n\n";
    print "$head_title\n";
    print "$body\n";
    print "<H3>追加確認</H3>\n";
    print "<HR>\n";

    if ($in{'f_kiji'} eq "tyou") {
        print " 釣果<BR>\n";
        $buf_kiji = "釣果: ";

        print "$in{'b_year'}年 $in{'b_mon'}月 $in{'b_day'}日\n";
        
        if ($in{'tenki'} eq "hare") {
            print " 天気:晴れ<BR>\n";
            $buf_tenki = "天気:晴れ";
        } elsif ($in{'tenki'} eq "ame") {
            print " 天気:雨<BR>\n";
            $buf_tenki = "天気:雨";
        } elsif ($in{'tenki'} eq "kumori") {
            print " 天気:曇り<BR>\n";
            $buf_tenki = "天気:曇り";
        } elsif ($in{'tenki'} eq "yuki") {
            print " 天気:雪<BR>\n";
            $buf_tenki = "天気:雪";
        }

        print "気温: $in{'b_kion'}度\n";
        print "水温: $in{'b_suion'}度\n";
        print "水位: $in{'b_suii'}ｃｍ\n";
    
        if ($in{'nigori'} eq "nigo") {
            print " 水:濁る<BR>\n";
            $buf_nigori = "水:濁る";
        } elsif ($in{'nigori'} eq "hutu") {
            print " 水:普通<BR>\n";
            $buf_nigori = "水:普通";
        } elsif ($in{'nigori'} eq "sumu") {
            print " 水:曇り<BR>\n";
            $buf_nigori = "水:澄む";
        }
        
        print "風向: $in{'wind'}\n";
        
    } elsif ($in{'f_kiji'} eq "sira") {
        print " お知らせ<BR>\n";
        $buf_kiji = "お知らせ: ";

        print "$in{'b_year'}年 $in{'b_mon'}月 $in{'b_day'}日<BR>\n";
        
        $buf_tenki = "";
        $buf_nigori = "";
    }

    

    $buf_txt =$in{'text'};
    $buf_txt =~ s/\n/<BR>/g;

    print "$buf_txt\n";
    print "<HR>\n";
    print "この内容で登録を実行する時は、下の確認ボタンを押して下さい。<BR>\n";
    print "キャンセルの場合は、ブラウザーのバックボタンで戻って下さい。<P>\n";
    print "<FORM METHOD=\"$method\" ACTION=\"$cgifile\">\n";
    print "<INPUT TYPE=\"HIDDEN\" NAME=\"act_sts\" VALUE=\"s_top\">\n";
    if ($in{'f_kiji'} eq "tyou") {
        print "<INPUT TYPE=\"HIDDEN\" NAME=\"text\" VALUE=\"$buf_kiji <p> $in{'b_year'}年 $in{'b_mon'}月 $in{'b_day'}日  $buf_tenki <p>  気温：$in{'b_kion'}度  水温：$in{'b_suion'}度   水位：$in{'b_suii'}ｃｍ   $buf_nigori    風向：$in{'wind'} <p> $buf_txt\">\n";
    } else {
        print "<INPUT TYPE=\"HIDDEN\" NAME=\"text\" VALUE=\"$buf_kiji <p> $in{'b_year'}年 $in{'b_mon'}月 $in{'b_day'}日  <p> $buf_txt\">\n";
    }
    print "<INPUT TYPE=\"SUBMIT\" VALUE=\"確認\">\n";
    print "</FORM>\n";
    print "</BODY>\n</HTML>\n";

    exit;
}

# 削除画面
sub g_Del {
    print "Content-type: text/html\n\n";
    print "$head_title\n";
    print "$body\n";
    print "<H3>削除画面</H3>\n";
    print "<P><BR>\n";
    print "削除する記事をチェックし、削除ボタンを押して下さい。<BR>\n";
    print "<FORM METHOD=\"$method\" ACTION=\"$cgifile\">\n";
    print "<INPUT TYPE=\"HIDDEN\" NAME=\"act_sts\" VALUE=\"s_del2\">\n";
    print "<TABLE BORDER=2 BORDERCOLOR=BLUE CELLPADDING=3 CELLSPACING=1>\n";

    foreach (@keiji_logs) {
        ($out_number,$out_jikan,$out_text) = split(/: /,$_);
        $out_text =~ s/<BR>/ /g;
        if (length($out_text) > 40) {
            $out_text = substr($out_text,0,38) . '...';
        }
        print "<TR>\n";
        print "<TD><INPUT NAME=\"$out_number\" TYPE=\"CHECKBOX\">$out_number</TD>\n";
        print "<TD>$out_jikan</TD>\n";
        print "<TD><TT>$out_text</TT></TD>\n";
        print "</TR>\n";
    }

    print "</TABLE>\n<BR>\n";
    print "<INPUT TYPE=\"SUBMIT\" VALUE=\"削除\">\n";
    print "<INPUT TYPE=\"RESET\" VALUE=\"クリア\">\n";
    print "</FORM>\n";
    print "</BODY>\n</HTML>\n";

    exit;
}

# 削除
sub del_Mess {

    # ファイルのロック
    # &file_lock;
 
    foreach (@keiji_logs) {
        ($out_number,$out_jikan,$out_text) = split(/: /,$_);
        if (! $in{$out_number}) {
            push(@newlogs,$_);
        }
    }
    open(LOG,">$log_data");
    flock(LOG,2);
    print LOG @newlogs;
    flock(LOG,8);
    close(LOG);

    # ロック解除
    # unlink($lock_file);
}


# パスワードエラー
sub g_PasErr {
    print "Content-type: text/html\n\n";
    print "$head_title\n";
    print "$body\n";
    print "<CENTER>\n";
    print "<BR>\n";
    print "<FONT SIZE=\"5\" COLOR=\"#FF0000\"><I>パスワードエラー</I></FONT><P>\n";
    print "パスワードが違います。\n";
    print "管理者以外の方の登録はできません。\n";
    print "</CENTER>\n";
    print "</BODY>\n";
    print "</HTML>\n";

    exit;
}

# ファイルロックエラー
sub g_accessErr {
    print "Content-type: text/html\n\n";
    print "$head_title\n";
    print "$body\n";
    print "<CENTER>\n";
    print "<BR>\n";
    print "<FONT SIZE=\"5\" COLOR=\"#FF0000\"><I>ファイルロック中</I></FONT><P>\n";
    print "しばらくしてから再実行して下さい\n";
    print "</CENTER>\n";
    print "</BODY>\n";
    print "</HTML>\n";

    exit;
}

# トップ更新
sub renew_top {

open(LOG,"$log_data");
my $keiji_log = <LOG>;
close(LOG);

&read_tmpl("../index.html");

open FILE,">../index.html";


###はじめ
print FILE $html{'head'};

###情報
($out_number,$out_jikan,$out_kiji,$out_text) = split(/: /,$keiji_log);
if ( $out_kiji eq "釣果") {
    $out_kijidisp = "<FONT SIZE=\"2\" COLOR=\"#0000FF\"> $out_kiji</FONT>\n";
} else {
    $out_kijidisp =  "<FONT SIZE=\"2\" COLOR=\"#FF0000\"><B> $out_kiji</B></FONT>\n";
}
$out_text =~ /(\d+)年\s*(\d+)月\s*(\d+)日/;
my ($y,$m,$d) = ($1,$2,$3);
$out_text =~ /天気(:|：)(\S+)\s/;
my $weather = $2;
$out_text =~ /気温(:|：)(\S+)\s/;
my $kion = $2;
$out_text =~ /水温(:|：)(\S+)\s/;
my $water_t = $2;
$out_text =~ /水位(:|：)(\S+)\s/;
my $water_l = $2;
$out_text =~ /水(:|：)(\S+)\s/;
my $water = $2;
$out_text =~ /風向(:|：)(\S+)\s/;
my $wind = $2;
$out_text = (split(/<p>/, $out_text))[-1];



print FILE <<"EOF";
<!-- section -->
<font size="2" color="#ff3300"><b>[ $y年 $m月 $d日]</b></font><font size="2"><br>
EOF

if ($out_kiji eq "釣果") {
print FILE <<"EOF";
天気：$weather　気温：$kion　水温：$water_t　水位：$water_l<br>
水質：$water　風向：$wind<br>
EOF
}

print FILE <<"EOF";
$out_text<br>
<!-- section -->
EOF

###おわり
print FILE $html{'foot'};

close FILE;
chmod(0666, "../index.html");
}

#テンプレート読込---------------------------------------------------------------------------------------
sub read_tmpl ($) {
	#第１引数で指定した場所のテンプレートを読み込みます
	######ここではしません→######テンプレートはSHIFT_JISで作成してもらい、ここでEUC-JPに変換します
	#規格1:メインルーチンの%htmlに読み込んだ値を代入します
	#規格2:%htmlは、HTMLファイル内に埋め込んだコメント"<!-- section -->"を境界として、
	#$html{'head'},$html{'body'},$html{'foot'}の三つに分かれています
	#
	my ($dir) = @_;
	my $line;
	my $sec = $/;
	open TMP, "$dir" or return 0;
	undef $/;
	$line = <TMP>;
	close TMP;
	
	#if ($line =~ /charset=SHIFT_JIS/i) {
	#	$line =~ s/charset=SHIFT_JIS/charset=EUC-JP/i;
	#	&jcode::convert(\$line,'euc');
	#}
	($html{'head'}, $html{'body'}, $html{'foot'}) = split /<!-- section -->/, $line;
	$/ = $sec;
}