#!/usr/local/bin/perl

# 日本語コード
require './cfg.pl';

&decode;
if($form{'mode'} eq "all"		) { &HTML_all;		}
if($form{'mode'} eq "howto"		) { &HTML_how;		}
if($form{'mode'} eq "kana"		) { &HTML_kana;		}
if($form{'mode'} eq "genre"		) { &HTML_genre;	}
if($form{'mode'} eq "engnum"	) { &HTML_engnum;	}
if($form{'mode'} eq "names"		) { &HTML_names;	}
if($form{'mode'} eq "edit"		) { &HTML_edit;		}
if($form{'mode'} eq "write"		) { &write;			}
if($form{'mode'} eq "add"		) { &add;			}
if($form{'mode'} eq "edit2"		) { &edit;			}
if($form{'mode'} eq "adminedit"	) { &adminedit;		}
&HTML;

##########################
#　基本HTML表示
##########################
sub HTML
{
@dat = &FileRead("$LogDir/index.dat");
@dat = grep{(split(/<>/))[2] ne "削除済み"} @dat;

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

print <<EOM;
<center>
<table width="80%" cellspacing="0" cellpadding="3">
  <tr bgcolor="$tclr"> 
    <td><font color="$wclr"><b>&nbsp;■&nbsp;一覧表\示</b> : 新着･更新 $newdisp件</font></td>
  </tr>
  <tr>
    <td>
<br>
<dl>
EOM
my @buf=@dat;
$newdisp-=1;
for(($form{'page'}*$newdisp) .. (($form{'page'}+1)*$newdisp)){
	if(!defined $buf[$_]){last}
	my($num, $yomi, $name, $genre, $pass, $date) = split('<>', "$buf[$_]");
	$date = sprintf("%4d年%02d月%02d日", substr($date, 0, 4), substr($date, 4, 2), substr($date, 6, 2));
	print "<dd><a href=\"$script_name?mode=names&no=$num\">[$genre] $name</a><font size=-1 color=$color_date> - $date</font> <font size=-1 color=$color_no>No.$num</font>\n";
}
print "<dd>&nbsp;";
print "<dd>";
for($i=0,$j=0;$i<($#dat/$newdisp);$i++,$j++){
	if($j == $form{'page'}){
		print "<font color=$pagecolor>[".($j+1)."]</font> "
	}else{
		print "<a href=\"$script_name?page=$j\">[".($j+1)."]</a> \n";
	}
}



print <<EOM;
<dl>
    </td>
  </tr>
</table>
</center>
<br>
EOM

&footer;
exit;
}



##########################
#　全部の記事の見出し
#　ページを表示
##########################
sub HTML_all
{
@dat = &FileRead("$LogDir/index.dat");
@dat = grep{(split(/<>/))[2] ne "削除済み"} @dat;
print "Content-type: text/html\n\n";
&header;

print <<EOM;
<center>
<table width="80%" cellspacing="0" cellpadding="3">
  <tr bgcolor="$tclr"> 
    <td><font color="$wclr"><b>&nbsp;■&nbsp;一覧表\示</b> : 全件表\示</font></td>
  </tr>
  <tr>
    <td>
<br>
<dl>
EOM
{
my @buf;
#ソート
@buf = map {$_->[0]}
	sort {$a->[4] cmp $b->[4] or $a->[2] cmp $b->[2]}
		map {[$_, split /<>/]} @dat;
		
$alldisp-=1;
for(($form{'page'}*$alldisp) .. (($form{'page'}+1)*$alldisp)){
	if(!defined $buf[$_]){last}
	my($num, $yomi, $name, $genre, $pass, $date) = split('<>', "$buf[$_]");
	$date = sprintf("%4d年%02d月%02d日", substr($date, 0, 4), substr($date, 4, 2), substr($date, 6, 2));
	print "<dd><a href=\"$script_name?mode=names&no=$num\">[$genre] $name</a><font size=-1 color=$color_date> - $date</font> <font size=-1 color=$color_no>No.$num</font>\n";
}
}
print "<dd>&nbsp;";
print "<dd>";
	for($i=0,$j=0;$i<($#dat/$alldisp);$i++,$j++){
		if($j == $form{'page'}){
			print "<font color=$pagecolor>[".($j+1)."]</font> "
		}else{
			print "<a href=\"$script_name?mode=all&page=$j\">[".($j+1)."]</a> \n";
		}
	}
print <<EOM;
<dl>
    </td>
  </tr>
</table>
</center>
<br>
EOM

&footer;
exit;
}

##########################
#　選択された名前の
#　ページを表示
##########################
sub HTML_names
{
	my($num, $yomi, $name, $genre, $date);
	@dat = &FileRead("$LogDir/index.dat");
	@dat = grep{(split(/<>/))[2] ne "削除済み"} @dat;
	
	foreach(@dat){
		($num, $yomi, $name, $genre, $pass, $date) = split(/<>/);
		if($num == $form{'no'}){
			last;
		}
	}

{
my($year, $month, $day, $weeknum, $hour, $min) = unpack 'a4a2a2a1a2a2', $date;
my $t_f_tmp = $time_format2;
$t_f_tmp =~ s/\$year/$year/gi;
$t_f_tmp =~ s/\$month/$month/gi;
$t_f_tmp =~ s/\$day/$day/gi;
$t_f_tmp =~ s/\$week/$week[$weeknum]/gi;
$t_f_tmp =~ s/\$hour/$hour/gi;
$t_f_tmp =~ s/\$min/$min/gi;

$date = $t_f_tmp;
}

print "Content-type: text/html\n\n";
&header;
print <<EOM;
<center>
<table width="80%" cellspacing="0" cellpadding="3">
  <tr bgcolor="$tclr"> 
    <td><font color="$wclr"><nobr>&nbsp;■&nbsp;[$genre]&nbsp;<WBR>$name&nbsp;<WBR>($yomi)</nobr></font></td>
    <td align=right>$date - No.$num</td>
  </tr>
  <tr>
    <td colspan="2">
      <br>
      <ul>
EOM
@dat2 = &FileRead("$LogDir/$form{'no'}.txt");
foreach(@dat2){
	my($comment, $name, $fontcolor, $date) = split(/<>/);

{
my($year, $month, $day, $weeknum, $hour, $min) = unpack 'a4a2a2a1a2a2', $date;
my $t_f_tmp = $time_format2;
$t_f_tmp =~ s/\$year/$year/gi;
$t_f_tmp =~ s/\$month/$month/gi;
$t_f_tmp =~ s/\$day/$day/gi;
$t_f_tmp =~ s/\$week/$week[$weeknum]/gi;
$t_f_tmp =~ s/\$hour/$hour/gi;
$t_f_tmp =~ s/\$min/$min/gi;

$date = $t_f_tmp;
}


if($wordlinkkey){	
	foreach(@dat){
		my($i_num, $i_yomi, $i_name, $i_genre) = (split(/<>/))[0,1,2,4];
		
		$i_name =~ s/(\W)/'%'.unpack("H2", $1)/ego;
		$i_yomi =~ s/(\W)/'%'.unpack("H2", $1)/ego;
		$i_genre =~ s/(\W)/'%'.unpack("H2", $1)/ego;
		$comment =~ s/(\W)/'%'.unpack("H2", $1)/ego;
		
		$comment =~ s/($i_name|$i_yomi)/$PREMATCH\&nbsp\;<a href=\'$script_name\?mode=names\&no=$i_num\'>$&<\/a>\&nbsp\;$POSTMATCH/g;
		$comment =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
		
	}
}
	
	print "<li><font color=\"$fontcolor\">$comment</font><font size=-1 color=$color_date> - $nameさん [$date]</font>\n";
	
}
print "      </ul>";
print <<EOM;
    </td>
	</tr>
	<tr>
	<td align=left colspan="2">
EOM
&HTML_addform;
print <<EOM;
	</td>
  </tr>
</table>
</center>
<br>
EOM

&footer;
exit;
}

##########################
#　選んだアルファベットの
#　ページを表示
##########################
sub HTML_engnum
{
@dat = &FileRead("$LogDir/index.dat");
@dat = grep{(split(/<>/))[2] ne "削除済み"} @dat;
print "Content-type: text/html\n\n";
&header;

@wordstartlist	=('A','D','G','J','M','P','S','V','Y');
@wordendlist	=('C','F','I','L','O','R','U','X','1');

my($wordstart,$wordend) = ($wordstartlist[$form{'word'}], $wordendlist[$form{'word'}]);

for($wordstart .. $wordend){$wordse .= $_;}

$wordse.='1' if($wordend eq '1');

print <<EOM;
<center>
<table width="80%" cellspacing="0" cellpadding="3">
  <tr bgcolor="$tclr"> 
    <td><font color="$wclr"><b>&nbsp;■&nbsp;一覧表\示</b> : $wordse</font></td>
  </tr>
  <tr>
    <td>
<br>
<dl>
EOM

#名前でソート
@dat = map {$_->[0]}
	sort {$a->[3] cmp $b->[3]}
		map {[$_, split /<>/]} @dat;

for(0 .. $#dat){
	my($num, $yomi, $name, $genre, $pass, $date) = split('<>', "$dat[$_]");
	

my($year, $month, $day, $weeknum, $hour, $min) = unpack 'a4a2a2a1a2a2', $date;

$time_format1 =~ s/\$year/$year/gi;
$time_format1 =~ s/\$month/$month/gi;
$time_format1 =~ s/\$day/$day/gi;
$time_format1 =~ s/\$week/$week[$weeknum]/gi;
$time_format1 =~ s/\$hour/$hour/gi;
$time_format1 =~ s/\$min/$min/gi;

$date = $time_format1;

	my $head = $name;
	$head = substr($head,0,1);
	$head = uc($head);
	if($head ge $wordstart and $head le $wordend){
		print "<dd><a href=\"$script_name?mode=names&no=$num\">$name</a><font size=-1 color=$color_date> - $date</font> <font size=-1 color=$color_no>No.$num</font>\n";
		$found=true;
	}elsif(($head =~ /[0-9]/ or $head =~ /[YZyz]/) and $wordend eq '1'){
		print "<dd><a href=\"$script_name?mode=names&no=$num\">$name</a><font size=-1 color=$color_date> - $date</font> <font size=-1 color=$color_no>No.$num</font>\n";
		$found=true;
	}
}
if(!$found){
	print "<dd>このデータは一件も登録されていません";
}

print <<EOM;
<dl>
    </td>
  </tr>
</table>
</center>
<br>
EOM

&footer;
exit;
}

##########################
#　かなで選んだ50音の行から
#　表示
##########################
sub HTML_kana
{
@dat = &FileRead("$LogDir/index.dat");
@dat = grep{(split(/<>/))[2] ne "削除済み"} @dat;
print "Content-type: text/html\n\n";
&header;

@wordstartlist	=('ぁ','か','さ','た','な','は','ま','や','ら','わ','ぁ');
@wordendlist	=('お','ご','ぞ','ど','の','ぽ','も','よ','ろ','ん','ん');

my($wordstart,$wordend) = ($wordstartlist[$form{'word'}], $wordendlist[$form{'word'}]);

print <<EOM;
<center>
<table width="80%" cellspacing="0" cellpadding="3">
  <tr bgcolor="$tclr"> 
    <td><font color="$wclr"><b>&nbsp;■&nbsp;一覧表\示</b> : $wordstart行</font></td>
  </tr>
  <tr>
    <td>
<br>
<dl>
EOM

#よみがなでソート
@dat = map {$_->[0]}
	sort {$a->[2] cmp $b->[2]}
		map {[$_, split /<>/]} @dat;

for(0 .. $#dat){
	my($num, $yomi, $name, $genre, $pass, $date) = split('<>', "$dat[$_]");
	
my($year, $month, $day, $weeknum, $hour, $min) = unpack 'a4a2a2a1a2a2', $date;

$time_format1 =~ s/\$year/$year/gi;
$time_format1 =~ s/\$month/$month/gi;
$time_format1 =~ s/\$day/$day/gi;
$time_format1 =~ s/\$week/$week[$weeknum]/gi;
$time_format1 =~ s/\$hour/$hour/gi;
$time_format1 =~ s/\$min/$min/gi;

$date = $time_format1;

	if(substr($yomi,0,2) ge $wordstart and substr($yomi,0,2) le $wordend){
		print "<dd><a href=\"$script_name?mode=names&no=$num\">$name</a><font size=-1 color=$color_date> - $date</font> <font size=-1 color=$color_no>No.$num</font>\n";
		$found=true;
	}
}
if(!$found){
	print "<dd>このデータは一件も登録されていません";
}

print <<EOM;
<dl>
    </td>
  </tr>
</table>
</center>
<br>
EOM

&footer;
exit;
}

##########################
#　選んだジャンルの
#　項目を表示
##########################
sub HTML_genre
{
@dat = &FileRead("$LogDir/index.dat");
@dat = grep{(split(/<>/))[2] ne "削除済み"} @dat;
print "Content-type: text/html\n\n";
&header;
print <<EOM;
<center>
<table width="80%" cellspacing="0" cellpadding="3">
  <tr bgcolor="$tclr"> 
    <td><font color="$wclr"><b>&nbsp;■&nbsp;一覧表\示</b> : $form{'word'}</font></td>
  </tr>
  <tr>
    <td>
<br>
<dl>
EOM

#よみがなでソート
@dat = map {$_->[0]}
	sort {$a->[2] cmp $b->[2]}
		map {[$_, split /<>/]} @dat;

for(0 .. $#dat){
	my($num, $yomi, $name, $genre, $pass, $date) = split('<>', "$dat[$_]");
my($year, $month, $day, $weeknum, $hour, $min) = unpack 'a4a2a2a1a2a2', $date;

$time_format1 =~ s/\$year/$year/gi;
$time_format1 =~ s/\$month/$month/gi;
$time_format1 =~ s/\$day/$day/gi;
$time_format1 =~ s/\$week/$week[$weeknum]/gi;
$time_format1 =~ s/\$hour/$hour/gi;
$time_format1 =~ s/\$min/$min/gi;

$date = $time_format1;
	
	if($genre eq $form{'word'}){
		print "<dd><a href=\"$script_name?mode=names&no=$num\">[$genre] $name</a><font size=-1 color=$color_date> - $date</font> <font size=-1 color=$color_no>No.$num</font>\n";
		$found=true;
	}
}
if(!$found){
	print "<dd>このデータは一件も登録されていません";
}

print <<EOM;
<dl>
    </td>
  </tr>
</table>
</center>
<br>
EOM

&footer;
exit;
}


##########################
#　注意事項項目表示部
##########################
sub HTML_att
{
print "<table width=50%>\n" ;
print "  <tr>\n" ;
print "    <td>\n" ;

foreach (@attention) {
	print "      <li>$_</li>\n";
}

print "      <li>現在 ".($#dat+1)." 件登録されています。</li>\n";
print "    </td>\n" ;
print "  </tr>\n" ;
print "</table>\n" ;
}

##########################
#　カラーリスト表示部
##########################
sub HTML_color
{
print "<SELECT NAME=\"color\" SIZE=\"1\">";
	foreach (0 .. $#color) {
		print "<OPTION VALUE=\"$color[$_]\" style=\"color:$color[$_];\">$color_name[$_]\n";
	}
print "</SELECT>";
}

##########################
#　追記フォームを表示する
##########################
sub HTML_addform
{
my(@genrelist)=@_;
print <<EOM;
<FORM action="$script_name" method="POST">
<TABLE width=500>
<TBODY>
<TR vAlign=bottom>
<TD><B>追加情報 </B>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD>Name</TD>
<TD><INPUT size=18 name=name> </TD></TR>
<TR>
<TD>color </TD>
<TD> 
EOM
&HTML_color;
print <<EOM;
</TD></TR></TBODY></TABLE></TD>
<TD><TEXTAREA name=comment rows=3 wrap=PHYSICAL cols=64></TEXTAREA> </TD>
<TD><input type=hidden name="mode" value="add">
<input type=hidden name="no" value=$form{'no'}>
</TD></TR>
<tr>
<td>
</td>
<td>
<DIV align=right>
<INPUT type=submit value=追記> 
</DIV>
</td>
</tr>
</TBODY></TABLE></TD></TR></TBODY></TABLE>
</FORM>
EOM
}

##########################
#　登録フォームを表示する
##########################
sub HTML_registform
{
my(@genrelist)=@_;
print <<EOM;
<FORM action="$script_name" method="POST">
<center>
<hr>
新規用語登録
<table border=0>
  <tbody> 
  <tr> 
    <td>&nbsp;登録者名 </td>
    <td> 
      <input size=36 name=tname>
    </td>
  </tr>
  <tr> 
    <td>&nbsp;項目名 </td>
    <td> 
      <input size=36 name=name>
    </td>
  </tr>
  <tr> 
    <td>&nbsp;よみがな </td>
    <td> 
      <input size=36 name=yomi>
    </td>
  </tr>
  <tr> 
    <td height="17" colspan="2">&nbsp;情報/コメント<br>
      <textarea name="comment" wrap="soft" rows=7 cols=50></textarea>
    </td>
  </tr>
  <tr> 
    <td height="17" colspan="2"> 
      <div align="right">ジャンル 
        <select size=1 name=genre>
          <OPTION>(新規ジャンル)
EOM
            foreach (@genrelist){
                    print " <OPTION VALUE=\"$_\">$_\n" ;
            }
print <<EOM;
        </select>
        新規ジャンルの追加 
        <input size=25 name="newgenre"><br>
        文字色 
EOM
&HTML_color;
print <<EOM;
        パスワード 
        <input maxlength=4 size=5 name=pass>
        <input type=submit value="書き込む">
        <input type=reset value=リセット>
        <input type=hidden value="write" name=mode>
      </div>
    </td>
  </tr>
  </tbody> 
</table>
</center>
</FORM>
EOM
}


##########################
#　削除ページを表示する
##########################
sub HTML_edit
{
if($form{'no'} eq "" or $form{'pass'} eq ""){return;}
# $form{'no'} $form{'pass'}
@dat = &FileRead("$LogDir/index.dat");
@dat = grep{(split(/<>/))[2] ne "削除済み"} @dat;

my $parent="", $admin=0;
	foreach(@dat){
		my($no, $yomi, $name, $genre, $pass, $date) = split(/<>/);
		
		if($no == $form{'no'}){
			if($admin_pass eq $form{'pass'}){
				$admin = 1;
				$parent = $_;
				last;
			}elsif($pass eq $form{'pass'}){
				$parent = $_;
				last;
			}
		}
	}
	&error("パスワードが違います。") if(!$parent);
	print "Content-type: text/html\n\n";
	&header;
	
	if($admin){# 管理者パスワードだったら
		my @txt = &FileRead("$LogDir/$form{'no'}.txt");
		print "<h4>項目修正処理(管理者用)</h4>\n" ;
		print "<form action=\"$script_name\" method=\"POST\">\n" ;
		my($no, $yomi, $pname, $genre, $pass, $date) = split(/<>/,$parent);
		print "<table>";
		
		print "<tr><td>";
		print "ジャンル";
		print "</td><td>";
		print "<input size=36 name=genre value=\"$genre\">";
		print "</td></tr>";
		
		print "<tr><td>";
		print "項目名";
		print "</td><td>";
		print "<input size=36 name=name value=\"$pname\">";
		print "</td></tr>";
		
		print "<tr><td>";
		print "よみがな";
		print "</td><td>";
		print "<input size=36 name=yomi value=\"$yomi\">";
		print "</td></tr>";
		
		print "</table>";
		print "<input type=hidden name=\"mode\" value=\"edit2\">\n" ;
		print "<input type=hidden name=\"no\" value=\"$form{'no'}\">\n" ;
		print "<input type=reset value=\" リセット \">\n" ;
		print "<input type=submit value=\" 修正 \" name=command>\n" ;
		print "</form>\n";
		
		print "<hr>";
		print "<B>コメント修正削除処理</B>";
		print "<form action=\"$script_name\" method=\"POST\">\n" ;
		print "<dl>\n";
		print "<dt><INPUT type=checkbox value=on name=all><font color=#FF0000><b>[$genre] $pname No.$no</b></font><br>\n";
		foreach(0 .. $#txt){
			my($comment, $name, $color, $time) = split("<>",$txt[$_]);
			print "<dd><INPUT type=checkbox value=on name=$_><font color=$color>$name &gt; $comment</font>\n";
		}
		print "</dl>";
		print "<input type=submit value=\" 削除 \" name=\"command\">\n<br>\n" ;
		
print <<EOM;

<br>
(書き換える場合、修正するコメントにチェックをつけ下記を入力し修正をクリックしてください)
<TABLE width=500>
	<TBODY>
	<TR vAlign=bottom>
	<TD>
		<TABLE cellSpacing=0 cellPadding=0 border=0>
		<TBODY>
			<TR>
				<TD>Name</TD>
				<TD><INPUT size=18 name=name> </TD></TR>
			<TR>
				<TD>color </TD>
				<TD> 
EOM
&HTML_color;
print <<EOM;
				</TD>
			</TR>
		</TBODY>
	</TABLE>
	</TD>
	<TD><TEXTAREA name=comment rows=3 wrap=PHYSICAL cols=64></TEXTAREA> </TD>
	<TD>
		</DIV>
	</TD>
	</TR>
	</TBODY>
</TABLE>
</TD>
</TR>
</TBODY>
</TABLE>
EOM

		print "<input type=hidden name=\"mode\" value=\"adminedit\">\n" ;
		print "<input type=hidden name=\"no\" value=\"$form{'no'}\">\n" ;
		print "<input type=submit value=\" 修正 \" name=\"command\">\n" ;
		print "</form>\n" ;
	}else{# 投稿者パスワードだったら
		print "<h4>削除修正処理</h4>\n" ;
		print "<form action=\"$script_name\" method=\"POST\">\n" ;
		my($no, $yomi, $pname, $genre, $pass, $date) = split(/<>/,$parent);
		print "<table>";
		
		print "<tr><td>";
		print "ジャンル";
		print "</td><td>";
		print "<input size=36 name=genre value=\"$genre\">";
		print "</td></tr>";
		
		print "<tr><td>";
		print "項目名";
		print "</td><td>";
		print "<input size=36 name=name value=\"$pname\">";
		print "</td></tr>";
		
		print "<tr><td>";
		print "よみがな";
		print "</td><td>";
		print "<input size=36 name=yomi value=\"$yomi\">";
		print "</td></tr>";
		
		print "</table>";
		print "<input type=hidden name=\"mode\" value=\"edit2\">\n" ;
		print "<input type=hidden name=\"no\" value=\"$form{'no'}\">\n" ;
		print "<input type=submit value=\" 削除 \" name=command>\n" ;
		print "<input type=reset value=\" リセット \">\n" ;
		print "<input type=submit value=\" 修正 \" name=command>\n" ;
		print "</form>\n" ;
	}
		print "<hr>";

&footer;
exit;
}


##########################
#　削除フォーム表示形式部
##########################
sub HTML_delform
{
print <<EOM;
	<center>
<FORM action="$script_name" method="POST">
	<hr>
<INPUT type=hidden value="edit" name=mode> 
<FONT color=#4000a0><SMALL>- 登録項目を修正削除することができます -</FONT><BR>
 記事No <INPUT maxlength=4 size=5 name=no value="$form{'no'}"> 暗証キー <INPUT 
type=password maxlength=4 size=5 name=pass></SMALL> 
<INPUT type=submit value=送信>
	<hr>
	</FORM>
</center>

EOM
}


##########################
#　留意事項の
#　ページを表示
##########################
sub HTML_how
{
$strtag = $tagkey?"以下のものが<b>使用可</b>です。<br><font color=\"$tclr\"><i>font,marquee,button,input,b,i,s,strike,tt,u,sup,sub,em,strong,blink,img,hr</i></font>":"<b>使用不可</b>です。";
print "Content-type: text/html\n\n";
print <<"end_of_show_header";
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja-JP">
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE>$title_str</TITLE>
</HEAD>
$body
<center>
<h1>辞典の使い方</h1>
<hr>
$link
<hr>
</center>
end_of_show_header

print <<EOM;
<center>
<table width="80%" cellspacing="0" cellpadding="3">
  <tr bgcolor="$tclr"> 
    <td align=center><font color="$wclr"><b>&nbsp;■&nbsp;新規用語登録について&nbsp;■&nbsp;</b></font></td>
  </tr>
  <tr bgcolor="#FFFFFF">
    <td>
	<br>
<ul>
 <li><b>項目名</b>、<b>よみがな</b>、<b>情報/コメント</b>は<font color="#FF0000">必須項目</font>です。<br><br>
 <li><b>登録者名</b>が未記入の場合"$noname1"と表\示されます。<br><br>
 <li><b>ジャンル</b>については<b>新規ジャンルの追加</b>が優先されます。<br><br>
 <li><b>パスワード</b>は設定しておくと、投稿者が記事の修正削除が行なえます。<br><br>
 <li>タグについては<b>情報/コメント欄</b>に対し、$strtag<br><br>
 <li>投稿された用語に関しては誰にでも閲覧･追記することができます。<br>
</ul>
    </td>
  </tr>
</table>
<table width="80%" cellspacing="0" cellpadding="3">
  <tr bgcolor="$tclr"> 
    <td align=center><font color="$wclr"><b>&nbsp;■&nbsp;新追加情報について&nbsp;■&nbsp;</b></font></td>
  </tr>
  <tr bgcolor="#FFFFFF">
    <td>
	<br>
<ul>
 <li><b>Name</b>が未記入の場合"$noname2"と表\示されます。<br><br>
 <li><b>コメント</b>が未記入の場合、何も書き込まれません<br><br>
 <li>タグについては新規用語登録の<b>情報/コメント欄</b>を参照ください。<br><br>
 <li>こちらから追記された内容は管理者のみ編集削除ができます。<br>
</ul>
    </td>
  </tr>
</table>
<br>

<hr>
</center>
</BODY>
</HTML>
EOM
exit;
}


##########################
#　項目表示形式部
##########################
sub HTML_list
{
print <<EOM;
<center>
<table width="80%" cellspacing="0" cellpadding="3">
  <tr bgcolor="$tclr"> 
    <td><font color="$wclr"><b>&nbsp;■&nbsp;項目表\示形式</b></font></td>
  </tr>
  <tr>
    <td>
      <table>
        <tr>
          <td> </td>
          <td>[ <a href="$script_name">新着･更新</a> / <a href="$script_name?mode=all">全件</a> ]</td>
        </tr>
        <tr>
          <td>ジャンル</td>
          <td>[ 
EOM
@genrelist = &Make_list(3,@dat);
@genrelist = sort(@genrelist);
foreach(0 .. $#genrelist){
	my($url)=$genrelist[$_];
	$url =~ s/&lt;/</g;
	$url =~ s/&gt;/>/g;
	$url =~ s/(\W)/'%'.unpack("H2", $1)/ego;
	
	print "<a href=\"$script_name?mode=genre&word=$url\">$genrelist[$_]</a>";
	print " / " if(defined($genrelist[($_+1)]));
}

print <<EOM;
 ]</td>
        </tr>
        <tr>
          <td>英数</td>
          <td>[ <a href="$script_name?mode=engnum&word=0">ABC</a> / <a href="$script_name?mode=engnum&word=1">DEF</a> / <a href="$script_name?mode=engnum&word=2">GHI</a> / <a href="$script_name?mode=engnum&word=3">JKL</a> / <a href="$script_name?mode=engnum&word=4">MNO</a> / <a href="$script_name?mode=engnum&word=5">PQR</a> / <a href="$script_name?mode=engnum&word=6">STU</a> / <a href="$script_name?mode=engnum&word=7">VWX</a> / <a href="$script_name?mode=engnum&word=8">YZ1</a> ]</td>
        </tr>
        <tr>
          <td>かな</td>
          <td>[ <a href="$script_name?mode=kana&word=0">あ行</a> / <a href="$script_name?mode=kana&word=1">か行</a> / <a href="$script_name?mode=kana&word=2">さ行</a> / <a href="$script_name?mode=kana&word=3">た行</a> / <a href="$script_name?mode=kana&word=4">な行</a> / <a href="$script_name?mode=kana&word=5">は行</a> / <a href="$script_name?mode=kana&word=6">ま行</a> / <a href="$script_name?mode=kana&word=7">や行</a> / <a href="$script_name?mode=kana&word=8">ら行</a> / <a href="$script_name?mode=kana&word=9">わ行･ん</a> ]</td>
        </tr>
      </table>
    </td>
  </tr>
</table>
</center>
EOM

}


##########################
#　ファイルを読み込んで
#　指定された縦列を配列にし返す
#　引数(列番号,配列)
##########################
sub Make_list{

	my ($num,@dat) = (@_);
	my @genrelist;
	
	foreach (@dat){
		{
		my $genre = (split(/<>/))[$num];
		unshift(@genrelist,$genre);
		}
	}
	
	{
	my %count;	
	@genrelist = grep(!$count{$_}++, @genrelist);
	}
	return @genrelist;
}


##########################
#　index.datに書き込む
##########################
sub write
{
my @Index = &FileRead("$LogDir/index.dat");

($form{'tname'}=$noname1) if($form{'tname'} eq "");
&error("項目名を入力してください") if($form{'name'} eq "");
&error("読みは全角ひらがなで入力してください") if($form{'yomi'} lt "ぁ" || $form{'yomi'} gt "ァ");
&error("読みは全角ひらがなのみで入力してください") if($form{'yomi'} =~ /[a-z0-9]/ig);
&error("情報/コメントを入力してください") if($form{'comment'} eq "");
my($genre) = ($form{'newgenre'})?($form{'newgenre'}):($form{'genre'});
&error("ジャンルが選択、入力されていません") if($genre eq "(新規ジャンル)");
&error("多重投稿です。") if($form{'name'} eq (split("<>", $Index[0]))[2]);

$time = &TimeGet;
$newnum = $#Index;
$newnum += 2;


unshift(@Index,"$newnum<>$form{'yomi'}<>$form{'name'}<>$genre<>$form{'pass'}<>$time\n");
&FileWrite("$LogDir/index.dat", @Index);

push(@dat,("$form{'comment'}<>$form{'tname'}<>$form{'color'}<>$time\n"));
&FileWrite("$LogDir/$newnum.txt", @dat);

}

##########################
#　txtに追記する
##########################
sub add{
(return) if($form{'comment'} eq "");
($form{'name'}=$noname2) if($form{'name'} eq "");

# 番号のtxtにコメントを書き込む
my @dat = &FileRead("$LogDir/$form{'no'}.txt");
&error("多重投稿です。") if($form{'comment'} eq (split("<>", $dat[-1]))[0]);

$time = &TimeGet;
push(@dat,("$form{'comment'}<>$form{'name'}<>$form{'color'}<>$time\n"));
&FileWrite("$LogDir/$form{'no'}.txt", @dat);

# index.datの順番を変える
my @Index = &FileRead("$LogDir/index.dat");
my @buf;
foreach(@Index){
	my $num = (split(/<>/))[0];
	if($num eq $form{'no'}){
		$tmp = $_;
		next;
	}
	push(@buf,$_);
}
unshift(@buf,$tmp);

&FileWrite("$LogDir/index.dat", @buf);
}


##########################
#　記事内容を修正削除
##########################
sub edit
{
	my @Index = &FileRead("$LogDir/index.dat");
	my @buf;
if($form{"command"} eq " 削除 "){
# 元記事からの削除
	foreach(@Index){
		my ($num, $yomi, $name, $genre, $pass, $date) = split(/<>/);
		if($num eq $form{'no'}){
			push(@buf,"$num<><>削除済み<><>$pass<>$date");
			next;
		}
		push(@buf,$_);
	}
	&FileWrite("$LogDir/index.dat", @buf);
}elsif($form{"command"} eq " 修正 "){
	&error("項目名を入力してください") if($form{'name'} eq "");
	&error("読みは全角ひらがなで入力してください") if($form{'yomi'} lt "ぁ" || $form{'yomi'} gt "ァ");
	&error("読みは全角ひらがなのみで入力してください") if($form{'yomi'} =~ /[a-z0-9]/ig);
	&error("ジャンルが空白文字の\可\能\性があります") if($form{'genre'} eq "");

	$time = &TimeGet;
		foreach(@Index){
			my ($num, $yomi, $name, $genre, $pass, $date) = split(/<>/);
			if($num == $form{'no'}){
				push(@buf,"$num<>$form{'yomi'}<>$form{'name'}<>$form{'genre'}<>$pass<>$time\n");
				next;
			}
			push(@buf,$_);
		}
	&FileWrite("$LogDir/index.dat", @buf);
}
}


##########################
#　記事内容を修正削除(管理者)
##########################
sub adminedit
{
if($form{"command"} eq " 削除 "){
	# 元記事からの削除
	if($form{"all"} eq "on"){
	
	my @Index = &FileRead("$LogDir/index.dat");
	my @buf;
	foreach(@Index){
		my ($num, $yomi, $name, $genre, $pass, $date) = split(/<>/);
		if($num eq $form{'no'}){
			push(@buf,"$num<><>削除済み<><>$pass<>$date");
			next;
		}
		push(@buf,$_);
	}
	
	&FileWrite("$LogDir/index.dat", @buf);
	}
	
	# 番号のtxtのコメント行を削除
	my @dat = &FileRead("$LogDir/$form{'no'}.txt");
	@buf = grep{$form{$count++} ne "on"} @dat;
	&FileWrite("$LogDir/$form{'no'}.txt", @buf);
}elsif($form{"command"} eq " 修正 "){
	my @buf=();
	# 修正
	$time = &TimeGet;
	
	# 番号のtxtのコメント行を修正
	my @dat = &FileRead("$LogDir/$form{'no'}.txt");
	foreach(0 .. $#dat){
		if($form{$_} eq "on"){
			push(@buf,("$form{'comment'}<>$form{'name'}<>$form{'color'}<>$time\n"));
			next;
		}
		push(@buf, $dat[$_]);
	}
	&FileWrite("$LogDir/$form{'no'}.txt", @buf);
}
}


##########################
#　時間を得る
#　戻り値　dateに入っている時間
##########################
sub TimeGet
{
	#タイム・ゾーン(地方時間帯)をJapan(JST-9)として日本標準時にセットする
	$ENV{'TZ'}="JST-9";
	#時間を取得し変数に入れる
	my($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time);

	#指定された書式(第一引数)でdateに入れる
	my $date=sprintf("%04d%02d%02d%d%2d%02d%02d",$year+1900,$mon+1,$mday,$wday,$hour,$min);

	return $date;
}

##########################
#　ファイルをロックする
#　引数(ファイル名)
##########################

sub lock {
	my($retry)=0;
	foreach (1 .. 5) {
		if (-e "$lockfile") {
			sleep(1);
		}
		else {
			if (open(FILE, ">$lockfile")) {
				close(FILE);
				$rerty = 1;
				return 1;
			}
		}
	}
	return 0;
}

##########################
#　ファイルのロックを解除する
#　引数(ファイル名)
##########################

sub unlock 
{
	if(-e $lockfile) { unlink($lockfile); }
}


##########################
#　デコード処理ルーチン
##########################

sub decode
{
	#POSTかGETか調べて、bufに格納する
	if($ENV{'REQUEST_METHOD'} eq "POST"){
		read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
	} else {
		$buf = $ENV{'QUERY_STRING'};
	}
	if ($buf eq '') { return; }
	#bufの文字列を&で区切り、名前と値のpair(ペア)に分ける
	@pairs = split(/&/, $buf);
	foreach(@pairs){
		#現在のpairs($_)からnameとvalueに振り分ける
		($name, $value) = split(/=/, $_);
		#tr(translitarate)を使って間にある + を半角スペースに変換する
		$value =~ tr/\+/ /;
		#16進数を取り出し($1に入る)、hex関数で10進数にする。
		#pack関数で型指定("C")をして、文字に変換する
		#それからs/で(%??)を(e(評価する)を使って)pack関数を評価した値に置き換える
		$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
		&jcode::convert ( $value, 'sjis' );
		#文字を実体名に置き換える
		$value =~ s/&/&amp;/g;	#ampersand		(?)
		$value =~ s/"/&quot;/g;	#quotation mark	(")	
		$value =~ s/</&lt;/g;
		$value =~ s/>/&gt;/g;
		$value =~ s/<>/&lt;&gt;/g;
		$value =~ s/(\t|\r\n|\r|\n)/<br>/g;#\t(タブ)\r(キャリッジリターン)\n(ニューライン)を消す
		
		#nameをキーに、valueを値にしてハッシュに代入する
		$form{$name} = $value;
	}
	#サイズチェック
	if(length($form{"comment"}) > $data_size){
		print "Content-type: text/html\n\n";
		&error("投稿量が多すぎです。") 
	}
	&tag($form{"comment"}) if($tagkey);
}
##########################
#　ヘッダー部表示ルーチン
##########################

sub header
{
print <<"end_of_show_header";
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja-JP">
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE>$title_str</TITLE>
</HEAD>
$body
end_of_show_header
print "<center>";
	if($title_img){
		print "<img src=\"$title_img\" width=\"$title_width\" height=\"$title_height\">\n" ;
	}else{
		print "<b style='color:$title_color; font-size:$title_size;'>$title_str</b>";
	}
print "<hr>";
print "$link";
print "<hr>\n";
&HTML_att;
print "<hr>";
print "</center>";
print "<br>";
}

##########################
#　著作権部表示ルーチン
##########################

sub copyright
{
print <<"end_of_show_copyright";
	<center>
	<h9>- <A HREF=http://ander_song.at.infoseek.co.jp/>辞典CGI 3.09</A>. -</h9>
	</center>

end_of_show_copyright
}

##########################
#　フッター部表示ルーチン
##########################

sub footer
{
&HTML_list;
&HTML_registform(@genrelist);
&HTML_delform;
&copyright;
print <<"end_of_show_footer";
</BODY>
</HTML>
end_of_show_footer
}


##########################
#　ファイルに書き込む
#　引数(ファイル名、書き込む配列)
##########################

sub FileWrite
{
&lock if($lockkey);
	#ローカライズし
	#引数をfilenameとLINESに格納する
	my($filename, @LINES) = @_;	
	#open関数でファイルを開く(このあとOUTは<STDIN>のように使える)
	#失敗したらエラーページで終了
	if( !(open(OUT,">$filename")) ){
		&error("$filenameに書き込めません。");
	}
	#OUTに@LINESを出力する
	print OUT @LINES;
	#ファイルを閉じる
	close (OUT);
&unlock if($lockkey);
}

##########################
#　ファイルを読み込む
#　引数(ファイル名)
##########################

sub FileRead
{
&lock if($lockkey);
	#ローカライズする
	my($filename,@LOG);
	#引数のファイル名(@_)を$filenameに格納する
	($filename) = @_;
	#open関数でファイルを開く(このあとINは<STDIN>のように使える)
	#失敗したらエラーページで終了
	if( !(open(IN,"$filename")) ){
		&error("$filenameが開けません。");
	}
	#@LOGに読み込んだ内容を格納し
	@LOG = <IN>;
	#ファイルを閉じ
	close(IN);
	#配列を返す
&unlock if($lockkey);
	return @LOG;
}


##########################
#　エラー処理ルーチン
##########################

sub error
{
	print "Content-type: text/html\n\n";
	&header;
	print "$body";
	my($error,@error_fields) = @_;
	
	print "<center><h1><br><br><br>$_[0]<br><br><br></h1></center>";
	
	&footer;
	exit;
}

##########################
#　タグを有効にして閉じ忘れを補完する
#　引数(文字列)
##########################
sub tag{
		my @allowtag = qw(font marquee button input b i s strike tt u sup sub em strong blink img hr);
		my ($found,$invalue,$tag,$intag,$outtag,%count);
		my $arg = $_[0];
		my @value = split(/&lt;/,$arg);
		my $first = shift(@value);

		foreach(@value){
			$found=$tag=$intag=$outtag='';
			$invalue = $_;			
			foreach (@allowtag){
				if($invalue =~ /^($_)\b(.*?)&gt;(.*)/i){
					($tag,$intag,$outtag) = ($1,$2,$3);
					$intag =~ s/\'|\"//g;
					$intag =~ s/&quot;/"/g;	#quotation mark	(")	
					if($_ eq 'img'){ # img固有の処理
						last if($intag =~ /^\/|dynsrc|file:|mailto:|\?/i);
						last if($intag !~ /^\s/);
						$intag =~ s/\b(width|height)\s*=\s*(\d|\%)*\s*//gi;
					}
					elsif($_ eq 'hr'){ # hr固有の処理
						$intag =~ s/\b(width|height)\s*=\s*(\d|\%)*\s*//gi;
					}
					elsif($_ eq 'font' || $_ eq 'marquee' || $_ eq 'button' || $_ eq 'input'){
						last if($intag =~ /\b(javascript\s*:|style\s*=|point\-size\s*=)/i);
					}
					elsif($_ eq 'b' || $_ eq 'i' || $_ eq 's' || $_ eq 'strike' || $_ eq 'tt' || $_ eq 'u' || $_ eq 's' || $_ eq 'sup' || $_ eq 'sub' || $_ eq 'em' || $_ eq 'strong' || $_ eq 'blink'){
						last if($intag);
					}
					$count{$_}++;
				}
				elsif($invalue =~ /^(\/$_)&gt;(.*)/i && $_ ne 'hr' && $_ ne 'img'){ # 閉じタグの場合
					$count{"_$_"}++;
					($tag,$outtag) = ($1,$2);
				}
				else{
					next;
				}
				$found++;
				last;
			}
			if($found){
				$_ = "<$tag$intag>$outtag";
			}
			else{
				$_ = "&lt;$_";
			}
		}

		unshift(@value,$first);
		$arg = join('',(@value));

		#タグ閉じ補完(marqueeを最初に閉じるようにsort）
		my @tagkey = grep(!/_|img|hr/,keys(%count));
		my $i = 0;
		foreach(@tagkey){
			if($i != 0 && $tagkey[$i] eq 'marquee'){ #先頭がmarqueeじゃなかったら入れ替える
				($tagkey[0],$tagkey[$i]) = ($tagkey[$i],$tagkey[0]);
				last;
			}
			$i++;
		}
		foreach(@tagkey){
			$arg .= "</$_>" x $count{$_};
		}
		$_[0] = $arg;
}
