#!/usr/local/bin/perl
#-- ↑Perlへのパスを指定します(１行目) 
#============================================================================
# 打鍵トレーナー ランキングCGI(2003/8/30)
#
# Copyright(C) 2002-2003 Mura's…
# http://www1.harenet.ne.jp/~a-mura/
#  
# 本プログラムはフリーソフトとして配布していますが
# 著作権は放棄していません。
# 著作権表示(リンクを含む)は削除しないでください。
#
# サポートはホームページ上でのみ行います。
#
# このソフトを使用することによるいかなる損害も作者は
# 一切責任を負いません。
#
#============================================================================

require './param.cgi';
require './jcode.pl';

# @niftyは下の文をコメントアウトすること。頭に # を付ける
use Time::Local;

#----------------------------------------------------------------------------
#                                処理開始
#----------------------------------------------------------------------------
#-- 変数
# $start_sec, $end_sec, $endyear, $endmon, $endday, $correct,
# $butname, $daken, $miss, $maxcount, $rankindex, $index, $homeicon
# @rankpos, @rec_label, @ranking, @rec_tag

#-- パラメータ取得
&getParam;

#-- 遊び方表示
if($IN{'mode'} eq 'readme'){&readMe;}
#-- 管理用表示
if($IN{'mode'} eq 'admin'){
    if($FORM{'adpass'} eq ''){&admin;}
    if($FORM{'adpass'} ne $adpass){&admin('パスワードが違います');}
    &lock;
    if($FORM{'admenu'} eq 'sentence'){&adminEdit;}
    if($FORM{'admenu'} eq 'rankdelete'){&rankDeleteMenu;}
}
#-- 例文編集
if($IN{'mode'} eq 'operate'){
    if($FORM{'adpass'} ne $adpass){&admin('パスワードが違います');}
    &lock;
	&composition;
}
#-- 登録時
if($IN{'mode'} eq 'entry'){
    &lock;
	&message(&entrySub($rankpath));
}
#-- ランキング削除
if($IN{'mode'} eq 'deleterank'){
    if($FORM{'adpass'} ne $adpass){&admin('パスワードが違います');}
	&lock;
	&deleteRanking($FORM{'deleteID'});	
}

#-- ファイルロック
&lock;

#-- ボタン名設定
$butname = '登録';
if($FORM{'para0'} != 0){$butname = '登録可';}

#-- 期間＆歴代データラベル読み込み
&readSetup($setpath);

#-- 今回の集計期間計算
&setPeriod;

#-- 集計期間内外処理
&perRenewal($end_sec);

#-- ランキングデータ読み込み
if($IN{'mode'} eq 'record'){@ranking = &getFileData("ranking$IN{'sel'}\.cgi");}
else{@ranking = &getFileData($rankpath);}

#-- ファイルロック解除
&unlock;

#-- 登録総数取得
$maxcount = 0;
foreach(@ranking){$maxcount++;}
if($maxcount > $savemax){$maxcount = $savemax;}
@rankpos = ('[1〜50位]','[51〜100位]','[101〜150位]','[151〜200位]','[201〜250位]','[251〜300位]','[301〜350位]','[351〜400位]','[401〜450位]','[451〜500位]','[501〜550位]','[551〜600位]','[601〜650位]','[651〜700位]','[701〜750位]','[751〜800位]','[801〜850位]','[851〜900位]');
for($i=17; $i>=($maxcount/50); $i--){$rankpos[$i] = '';}
$rankpos[int(($IN{'rank'}-1)/50)] = "<FONT color=\"$nowcolor\">$rankpos[int(($IN{'rank'}-1)/50)]<FONT>";

#-- 入力正確率を計算
if($FORM{'para0'} != 0){
    $correct = int(($FORM{'para0'} / ($FORM{'para0'}+$FORM{'para1'}))*1000) / 10;
    $correctstr = "$correct%";
    $daken = $FORM{'para0'};
    $miss = $FORM{'para1'};
}else{
    $daken = '';
    $miss = '';
    $correct = '';
}

#-- 表示形式で格納
&setViewTag;

#-- ランキング表示
if($IN{'mode'} eq 'show'){&showRank;}
elsif($IN{'mode'} eq 'record'){
    if($rec_label[0] eq ''){&message('過去のデータがありません');}
    my($count) = 2;
    foreach(@rec_label){
        if($count == $IN{'sel'}){push(@rec_tag, "<OPTION SELECTED>$_</OPTION>");}
        else{push(@rec_tag, "<OPTION>$_</OPTION>");}
        $count++;
    }
    &successive;
}

#---------------------------------------------------------------------

#===========
# 共通部分
#===========
sub head{
print qq|Content-type: text/html\n\n|;
print qq|<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\n|;
print qq|<HTML>\n|;
print qq|<HEAD>\n|;
print qq|<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">\n|;
print qq|<META http-equiv="Content-Style-Type" content="text/css">\n|;
print qq|<META http-equiv="Content-Style-Type" content="text/javascript">\n|;
print qq|<TITLE>打鍵トレーナー</TITLE>\n|;
print qq|<STYLE type="text/css">\n|;
print qq|<!--\n|;
print qq|BODY {font-size:10pt; background:$typebackcol url(img/star.gif) fixed no-repeat bottom right;}\n|;
print qq|TABLE.tbase {font-size:$basefont;}\n|;
print qq|TABLE.toplink {font-size:$topfont;}\n|;
print qq|TABLE.thisscore {font-size:$basefont;\n|;
print qq|                 color:#660000;}\n|;
print qq|TABLE.rank {background-color:$itembg;\n|;
print qq|            color:$itemtext;\n|;
print qq|            font-size:9pt;}\n|;
print qq|TABLE.admin {font-size:9pt;\n|;
print qq|             background-color:#ffcccc;}\n|;
print qq|TD.rank {background-color:$rankbg;\n|;
print qq|         color:$ranktext;\n|;
print qq|         font-size:$ranksize;}\n|;
print qq|TD.wordedit {color:#800000;\n|;
print qq|             font-size:12pt;}\n|;
print qq|TABLE.readme {font-size:$rmfontsize;\n|;
print qq|              color:$rmtextcol;\n|;
print qq|              background-color:$rmtablecol;}\n|;
print qq|TD.rectitle {font-size:$recsize;\n|;
print qq|             font-weight:bold;\n|;
print qq|             color:$reccolor;}\n|;
print qq|FONT.rmtitle {font-size:$rmtitlesize;\n|;
print qq|              color:$rmtitlecol;}\n|;
print qq|-->\n|;
print qq|</STYLE>\n|;
}
sub table{
print qq|<TABLE border="$itemborder" width="640" cellspacing="$itemspace" cellpadding="1" class="rank">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD align="center" nowrap>順位</TD>\n|;
print qq|      <TD align="center" nowrap>ネーム</TD>\n|;
print qq|      <TD align="center" nowrap>打鍵</TD>\n|;
print qq|      <TD align="center" nowrap>ミス</TD>\n|;
print qq|      <TD align="center" nowrap>正確率</TD>\n|;
print qq|      <TD align="center" nowrap>コメント</TD>\n|;
print qq|      <TD align="center" nowrap>日時</TD>\n|;
print qq|    </TR>\n|;
foreach(@viewtag){print "$_\n";}
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|<TABLE border="0" cellspacing="2" width="640" class="tbase">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD align="center" width="100"><A href="JavaScript:moveRank(1)" class="mvlink">$rankpos[0]</A></TD>\n|;
print qq|      <TD align="center" width="100"><A href="JavaScript:moveRank(51)" class="mvlink">$rankpos[1]</A></TD>\n|;
print qq|      <TD align="center" width="100"><A href="JavaScript:moveRank(101)" class="mvlink">$rankpos[2]</A></TD>\n|;
print qq|      <TD align="center" width="100"><A href="JavaScript:moveRank(151)" class="mvlink">$rankpos[3]</A></TD>\n|;
print qq|      <TD align="center" width="100"><A href="JavaScript:moveRank(201)" class="mvlink">$rankpos[4]</A></TD>\n|;
print qq|      <TD align="center" width="100"><A href="JavaScript:moveRank(251)" class="mvlink">$rankpos[5]</A></TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR>\n|;
print qq|      <TD align="center" width="100"><A href="JavaScript:moveRank(301)" class="mvlink">$rankpos[6]</A></TD>\n|;
print qq|      <TD align="center" width="100"><A href="JavaScript:moveRank(351)" class="mvlink">$rankpos[7]</A></TD>\n|;
print qq|      <TD align="center" width="100"><A href="JavaScript:moveRank(401)" class="mvlink">$rankpos[8]</A></TD>\n|;
print qq|      <TD align="center" width="100"><A href="JavaScript:moveRank(451)" class="mvlink">$rankpos[9]</A></TD>\n|;
print qq|      <TD align="center" width="100"><A href="JavaScript:moveRank(501)" class="mvlink">$rankpos[10]</A></TD>\n|;
print qq|      <TD align="center" width="100"><A href="JavaScript:moveRank(551)" class="mvlink">$rankpos[11]</A></TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR>\n|;
print qq|      <TD align="center" width="100"><A href="JavaScript:moveRank(601)" class="mvlink">$rankpos[12]</A></TD>\n|;
print qq|      <TD align="center" width="100"><A href="JavaScript:moveRank(651)" class="mvlink">$rankpos[13]</A></TD>\n|;
print qq|      <TD align="center" width="100"><A href="JavaScript:moveRank(701)" class="mvlink">$rankpos[14]</A></TD>\n|;
print qq|      <TD align="center" width="100"><A href="JavaScript:moveRank(751)" class="mvlink">$rankpos[15]</A></TD>\n|;
print qq|      <TD align="center" width="100"><A href="JavaScript:moveRank(801)" class="mvlink">$rankpos[16]</A></TD>\n|;
print qq|      <TD align="center" width="100"><A href="JavaScript:moveRank(851)" class="mvlink">$rankpos[17]</A></TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR>\n|;
print qq|      <TD colspan="6" align="right"><A href="$murasurl" target="_blank" class="toplink">打鍵トレーナー$muras Mura's…</A></TD>\n|;
print qq|    </TR>\n|;
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|<BR>\n|;
print qq|</CENTER>\n|;
print qq|<INPUT type="hidden" name="para0" value="$FORM{'para0'}">\n|; # 打鍵数
print qq|<INPUT type="hidden" name="para1" value="$FORM{'para1'}">\n|; # ミス数
print qq|<INPUT type="hidden" name="para2" value="">\n|; # 正確率
print qq|<INPUT type="hidden" name="para3" value="">\n|; # ネーム
print qq|<INPUT type="hidden" name="para4" value="">\n|; # パスワード
print qq|<INPUT type="hidden" name="para5" value="">\n|; # HPアドレス
print qq|<INPUT type="hidden" name="para6" value="">\n|; # コメント
print qq|<INPUT type="hidden" name="para7" value="$FORM{'para2'}">\n|; # 終了時間
print qq|</FORM>\n|;
print qq|</BODY>\n|;
print qq|</HTML>\n|;
}

#===========
# 歴代表示
#===========
sub successive{
&head;
print qq|<SCRIPT type="text/javascript">\n|;
print qq|<!--\n|;
print qq|function changeSel(){window.location = "rank.cgi?mode=record&rank=1&sel=" + (document.form1.period.selectedIndex+2);}\n|;
print qq|function moveRank(no){window.location = "rank.cgi?mode=record&rank=" + no + "&sel=" + (document.form1.period.selectedIndex+2);}\n|;
print qq|-->\n|;
print qq|</SCRIPT>\n|;
print qq|</HEAD>\n|;
print qq|<BODY>\n|;
print qq|<FORM name="form1">\n|;
print qq|<CENTER>\n|;
print qq|<TABLE border="0" width="620" cellspacing="0" cellpadding="0" class="toplink">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD align="center"><A href="$toppath" class="toplink">[TOP]</A> <A href=\"$typepath\" class="toplink">[タイピング画面へ]</A> <A href="rank.cgi?mode=show&rank=1" class="toplink">[現在のランキング]</A> <A href="rank.cgi?mode=readme" class="toplink">[遊び方]</A> <A href="rank.cgi?mode=admin" class="toplink">[管理用]</A></TD>\n|;
print qq|    </TR>\n|;
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|<HR size="1" width="640">\n|;
print qq|<TABLE border="0" width="640" cellspacing="2" cellpadding="3" class="tbase">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD align="center" class="rectitle">$rectitle<BR></TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR>\n|;
print qq|      <TD align="center">期間選択：<SELECT name="period" onChange="changeSel()">\n|;
foreach(@rec_tag){print "        $_\n";}
print qq|      </SELECT></TD>\n|;
print qq|    </TR>\n|;
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|<BR>\n|;
&table;
exit;
}

#=============
# ランク表示
#=============
sub showRank{
&head;
print qq|<SCRIPT type="text/javascript">\n|;
print qq|<!--\n|;
print qq|function startFunc(){\n|; # 初期設定
print qq|    if(getCookie("dakenId") != null){document.form1.id.value = getCookie("dakenId");}\n|;
print qq|    if(getCookie("dakenPass") != null){document.form1.pass.value = getCookie("dakenPass");}\n|;
print qq|    if(getCookie("dakenHP") != null){document.form1.homepage.value = getCookie("dakenHP");}\n|;
print qq|    if(getCookie("dakenCom") == " "){document.form1.comment.value = "";}\n|;
print qq|    else if(getCookie("dakenCom") != null){document.form1.comment.value = getCookie("dakenCom");}\n|;
print qq|}\n|;
print qq|function regist(){\n|; # 登録操作
print qq|    if(document.form1.para0.value == 0){return;}\n|; # 打鍵数0の時
print qq|    if(document.form1.id.value == ""){alert("ネームを入力してください。");return;}\n|;
print qq|    if(document.form1.pass.value == ""){alert("パスワードを入力してください。");return;}\n|;
print qq|    document.form1.para2.value = "$correct";\n|;
print qq|    document.form1.para3.value = document.form1.id.value;\n|;
print qq|    document.form1.para4.value = document.form1.pass.value;\n|;
print qq|    if(document.form1.homepage.value == ""){document.form1.para5.value = "http://"}\n|;
print qq|    else{document.form1.para5.value = document.form1.homepage.value;}\n|;
print qq|    if(document.form1.comment.value == ""){document.form1.para6.value = " ";}\n|;
print qq|    else{document.form1.para6.value = document.form1.comment.value;}\n|;
print qq|    document.form1.submit();\n|;
print qq|}\n|;
print qq|function moveRank(no){window.location = "rank.cgi?mode=show&rank=" + no;}\n|;
print qq|function getCookie(keyname){\n|; # クッキー読み込み
print qq|    var tmp = document.cookie + ";";\n|;
print qq|    var index1 = tmp.indexOf(keyname, 0);\n|;
print qq|    if(index1 != -1){\n|;
print qq|        tmp = tmp.substring(index1, tmp.length);\n|;
print qq|        var index2 = tmp.indexOf("=", 0) + 1;\n|;
print qq|        var index3 = tmp.indexOf(";", index2);\n|;
print qq|        return(unescape(tmp.substring(index2, index3)));\n|;
print qq|    }\n|;
print qq|}\n|;
print qq|//-->\n|;
print qq|</SCRIPT>\n|;
print qq|</HEAD>\n|;
print qq|<BODY onLoad="JavaScript:startFunc()">\n|;
print qq|<FORM name="form1" action="rank.cgi?mode=entry&rank=$IN{'rank'}" method="POST">\n|;
print qq|<CENTER>\n|;
print qq|<TABLE border="0" width="620" cellspacing="0" cellpadding="0" class="toplink">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD align="center"><A href="$toppath" class="toplink">[TOP]</A> <A href=\"$typepath\" class="toplink">[タイピング画面へ]</A> <A href="rank.cgi?mode=record&rank=1&sel=2" class="toplink">[過去のランキング]</A> <A href="rank.cgi?mode=readme" class="toplink">[遊び方]</A> <A href="rank.cgi?mode=admin" class="toplink">[管理用]</A></TD>\n|;
print qq|    </TR>\n|;
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|<HR size="1" width="640">\n|;
print qq|<IMG src="$titleimg" border="0" width="$titlewidth" height="$titleheight"><BR><BR>\n|;
print qq|<TABLE border="0" width="500" cellspacing="1" cellpadding="0" class="thisscore">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD width="96">今回の記録</TD>\n|;
print qq|      <TD align="right" width="60">打鍵数：</TD>\n|;
print qq|      <TD nowrap width="52">$daken</TD>\n|;
print qq|      <TD align="right" width="60">ミス数：</TD>\n|;
print qq|      <TD width="60">$miss</TD>\n|;
print qq|      <TD width="60" align="right">正確率：</TD>\n|;
print qq|      <TD width="89">$correctstr</TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR><TD></TD></TR>\n|;
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|<TABLE border="0" width="530" cellspacing="1" class="tbase">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD nowrap align="right">ネーム：</TD>\n|;
print qq|      <TD nowrap><INPUT type="text" maxlength="20" name="id" size="20"></TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR>\n|;
print qq|      <TD nowrap align="right">パスワード：</TD>\n|;
print qq|      <TD nowrap><INPUT type="password" maxlength="8" name="pass" size="12"> <INPUT type="checkbox" name="savecookie" value="save" CHECKED>クッキーに保存する</TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR>\n|;
print qq|      <TD nowrap align="right">ホームページ：</TD>\n|;
print qq|      <TD nowrap><INPUT type="text" maxlength="60" size="45" name="homepage" value="http://"></TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR>\n|;
print qq|      <TD nowrap align="right">コメント：</TD>\n|;
print qq|      <TD nowrap><INPUT type="text" maxlength="100" name="comment" size="45"> <INPUT type="button" onClick="JavaScript:regist()" value="$butname"></TD>\n|;
print qq|    </TR>\n|;
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|<HR size="1" width="640">\n|;
print qq|<TABLE border="0" width="640" class="tbase">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD align="center">集計期間 （$styear/$stmon/$stday〜$endyear/$endmon/$endday） $newterm時間以内のランクインには <IMG src="$newimg" width="$newwidth" height="$newheight" border="0"> が付きます</TD>\n|;
print qq|    </TR>\n|;
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
&table;
exit;
}

#============
# 遊び方表示
#============
sub readMe{
&head;
print qq|</HEAD>\n|;
print qq|<BODY>\n|;
print qq|<CENTER>\n|;
print qq|<TABLE border="0" width="620" cellspacing="0" cellpadding="0" class="toplink">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD align="center"><A href="$toppath" class="toplink">[TOP]</A> <A href=\"$typepath\" class="toplink">[タイピング画面へ]</A> <A href="rank.cgi?mode=show&rank=1" class="toplink">[現在のランキング]</A> [遊び方] <A href="rank.cgi?mode=admin" class="toplink">[管理用]</A></TD>\n|;
print qq|    </TR>\n|;
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|<HR size="1" width="640">\n|;
print qq|<BR>\n|;
print qq|<FONT class="rmtitle">$rmtitletext</FONT><BR><BR>\n|;
print qq|<TABLE border="1" width="640" cellspacing="1" class="readme" cellpadding="5">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD bgcolor="$rmbackcol">\n|;
print "$rmcontent\n";
print qq|      </TD>\n|;
print qq|    </TR>\n|;
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|<BR>\n|;
print qq|<TABLE border="0" width="640" class="tbase">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD align="right"><A href="$murasurl" target="_blank" class="toplink">打鍵トレーナー$muras Mura's…</A></TD>\n|;
print qq|    </TR>\n|;
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|</CENTER>\n|;
print qq|</BODY>\n|;
print qq|</HTML>\n|;
exit;
}

#===============
# 管理用表示No1
#===============
sub admin(str){
&head;
print qq|</HEAD>\n|;
print qq|<BODY>\n|;
print qq|<CENTER>\n|;
print qq|<FORM action="rank.cgi?mode=admin" method="POST">\n|;
print qq|<TABLE border="0" width="620" cellspacing="0" cellpadding="0" class="toplink">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD align="center"><A href="$toppath" class="toplink">[TOP]</A> <A href=\"$typepath\" class="toplink">[タイピング画面へ]</A> <A href="rank.cgi?mode=show&rank=1" class="toplink">[現在のランキング]</A> <A href="rank.cgi?mode=readme" class="toplink">[遊び方]</A> [管理用]</TD>\n|;
print qq|    </TR>\n|;
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|<HR size="1" width="640">\n|;
print qq|$_[0]<BR>\n|;
print qq|<TABLE border="0" class="tbase">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD><INPUT type="radio" name="admenu" value="sentence" checked>タイピング文編集　　<INPUT type="radio" name="admenu" value="rankdelete">ランキングデータ削除<BR><BR></TD>\n|;
print qq|    </TR>\n|;
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|<TABLE border="0" class="tbase">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD>入室用パスワード <INPUT type="password" name="adpass" maxlength="8" size="10"> <INPUT type="submit" value="これでOK"></TD>\n|;
print qq|    </TR>\n|;
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|<BR>\n|;
print qq|<TABLE border="0" width="640" class="tbase">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD align="right"><A href="$murasurl" target="_blank" class="toplink">打鍵トレーナー$muras Mura's…</A></TD>\n|;
print qq|    </TR>\n|;
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|</FORM>\n|;
print qq|</CENTER>\n|;
print qq|</BODY>\n|;
print qq|</HTML>\n|;
exit;
}

#===============
# 管理用表示No2
#===============
sub adminEdit{
my($i);
my($maxcount) = 0;
my($flg) = 0;
my($buflg) = 0;
my(@view, @input, @yomi, @data, @para);
@data = &getFileData($wordpath);
foreach(@data){
    $_ =~ s/"//;
    @para = split(/"/, $_);
    if($para[0] eq '//START>>'){$flg = 1; next;}
    if($para[0] eq '//END>>'){$flg = 0; $buflg++;}
    if($flg == 1){
        if($buflg == 0){push(@view, "$para[0]"); $maxcount++;}
        elsif($buflg == 1){push(@input, "$para[0]");}
        elsif($buflg == 2){
            if($para[0] ne ''){
                push(@yomi, 'OK');
            }else{
                push(@yomi, '-');
            }
        }
    }
}
$warning = '下表で半角の「\\」は「\\\\」と表示されますが、動作上問題ありません。';
&head;
print qq|<SCRIPT type="text/javascript">\n|;
print qq|<!--\n|;
print qq|var view = new Array(|;
foreach(@view){print "\"$_\",";}
print qq|"");\n|;
print qq|var input = new Array(|;
foreach(@input){print "\"$_\",";}
print qq|"");\n|;
print qq|var yomi = new Array(|;
foreach(@yomi){print "\"$_\",";}
print qq|"");\n|;
print qq|var yomi_data = "";\n|;
print qq|var yomi_pos = 0;\n|;
print qq|var exflg = 0;\n|;
print qq|st=new Array(302);\n|;
print qq|st[0]="あ";st[1]="い";st[2]="う";st[3]="え";st[4]="お";st[5]="か";st[6]="き";st[7]="く";st[8]="け";st[9]="こ";\n|;
print qq|st[10]="さ";st[11]="し";st[12]="す";st[13]="せ";st[14]="そ";st[15]="た";st[16]="ち";st[17]="つ";st[18]="て";st[19]="と";\n|;
print qq|st[20]="な";st[21]="に";st[22]="ぬ";st[23]="ね";st[24]="の";st[25]="は";st[26]="ひ";st[27]="ふ";st[28]="へ";st[29]="ほ";\n|;
print qq|st[30]="ま";st[31]="み";st[32]="む";st[33]="め";st[34]="も";st[35]="や";st[36]="ゆ";st[37]="よ";\n|;
print qq|st[38]="ら";st[39]="り";st[40]="る";st[41]="れ";st[42]="ろ";st[43]="わ";st[44]="を";st[45]="ん";\n|;
print qq|st[46]="ぁ";st[47]="ぃ";st[48]="ぅ";st[49]="ぇ";st[50]="ぉ";st[51]="っ";st[52]="ゃ";st[53]="ゅ";st[54]="ょ";st[55]="ゎ";\n|;
print qq|st[56]="ヵ";st[57]="ヶ";st[58]="が";st[59]="ぎ";st[60]="ぐ";st[61]="げ";st[62]="ご";\n|;
print qq|st[63]="ざ";st[64]="じ";st[65]="ず";st[66]="ぜ";st[67]="ぞ";st[68]="だ";st[69]="ぢ";st[70]="づ";st[71]="で";st[72]="ど";\n|;
print qq|st[73]="ば";st[74]="び";st[75]="ぶ";st[76]="べ";st[77]="ぼ";st[78]="ぱ";st[79]="ぴ";st[80]="ぷ";st[81]="ぺ";st[82]="ぽ";\n|;
print qq|st[83]="ア";st[84]="イ";st[85]="ウ";st[86]="エ";st[87]="オ";st[88]="カ";st[89]="キ";st[90]="ク";st[91]="ケ";st[92]="コ";\n|;
print 'st[93]="サ";st[94]="シ";st[95]="ス";st[96]="セ";st[97]="ソ";st[98]="タ";st[99]="チ";st[100]="ツ";st[101]="テ";st[102]="ト";'."\n";
print qq|st[103]="ナ";st[104]="ニ";st[105]="ヌ";st[106]="ネ";st[107]="ノ";st[108]="ハ";st[109]="ヒ";st[110]="フ";st[111]="ヘ";st[112]="ホ";\n|;
print qq|st[113]="マ";st[114]="ミ";st[115]="ム";st[116]="メ";st[117]="モ";st[118]="ヤ";st[119]="ユ";st[120]="ヨ";\n|;
print qq|st[121]="ラ";st[122]="リ";st[123]="ル";st[124]="レ";st[125]="ロ";st[126]="ワ";st[127]="ヲ";st[128]="ン";\n|;
print qq|st[129]="ァ";st[130]="ィ";st[131]="ゥ";st[132]="ェ";st[133]="ォ";st[134]="ッ";st[135]="ャ";st[136]="ュ";st[137]="ョ";st[138]="ヮ";\n|;
print qq|st[139]="ガ";st[140]="ギ";st[141]="グ";st[142]="ゲ";st[143]="ゴ";st[144]="ザ";st[145]="ジ";st[146]="ズ";st[147]="ゼ";st[148]="ゾ";\n|;
print qq|st[149]="ダ";st[150]="ヂ";st[151]="ヅ";st[152]="デ";st[153]="ド";st[154]="バ";st[155]="ビ";st[156]="ブ";st[157]="ベ";st[158]="ボ";\n|;
print 'st[159]="パ";st[160]="ピ";st[161]="プ";st[162]="ペ";st[163]="ポ";st[164]="１";st[165]="２";st[166]="３";st[167]="４";st[168]="５";'."\n";
print qq|st[169]="６";st[170]="７";st[171]="８";st[172]="９";st[173]="０";st[174]="ー";st[175]="＾";st[176]="￥";st[177]="1";st[178]="2";\n|;
print qq|st[179]="3";st[180]="4";st[181]="5";st[182]="6";st[183]="7";st[184]="8";st[185]="9";st[186]="0";st[187]="-";st[188]="^";st[189]="\\\\";\n|;
print qq|st[190]="！";st[191]="”";st[192]="＃";st[193]="＄";st[194]="％";st[195]="＆";st[196]="’";st[197]="（";st[198]="）";st[199]="＝";\n|;
print qq|st[200]="〜";st[201]="｜";st[202]="!";st[203]="\\"";st[204]="#";st[205]="\$";st[206]="%";st[207]="&";st[208]="'";st[209]="(";st[210]=")";\n|;
print qq|st[211]="=";st[212]="~";st[213]="\|";st[214]="＠";st[215]="「";st[216]="；";st[217]="：";st[218]="」";st[219]="、";st[220]="。";\n|;
print qq|st[221]="・";st[222]="‘";st[223]="｛";st[224]="＋";st[225]="＊";st[226]="｝";st[227]="＜";st[228]="＞";st[229]="？";st[230]="＿";\n|;
print qq|st[231]="@";st[232]="[";st[233]=";";st[234]=":";st[235]="]";st[236]=",";st[237]=".";st[238]="/";st[239]="`";st[240]="{";st[241]="+";\n|;
print qq|st[242]="*";st[243]="}";st[244]="<";st[245]=">";st[246]="?";st[247]="_";st[248]="　";st[249]=" ";st[250]="a";st[251]="b";st[252]="c";\n|;
print qq|st[253]="d";st[254]="e";st[255]="f";st[256]="g";st[257]="h";st[258]="i";st[259]="j";st[260]="k";st[261]="l";st[262]="m";st[263]="n";\n|;
print qq|st[264]="o";st[265]="p";st[266]="q";st[267]="r";st[268]="s";st[269]="t";st[270]="u";st[271]="v";st[272]="w";st[273]="x";st[274]="y";\n|;
print qq|st[275]="z";st[276]="A";st[277]="B";st[278]="C";st[279]="D";st[280]="E";st[281]="F";st[282]="G";st[283]="H";st[284]="I";st[285]="J";\n|;
print qq|st[286]="K";st[287]="L";st[288]="M";st[289]="N";st[290]="O";st[291]="P";st[292]="Q";st[293]="R";st[294]="S";st[295]="T";st[296]="U";\n|;
print qq|st[297]="V";st[298]="W";st[299]="X";st[300]="Y";st[301]="Z";\n|;
print qq|function movement(){\n|;
print qq|    if(document.form1.no.selectedIndex != 0 && document.form1.operate.selectedIndex != 0 && document.form1.operate.selectedIndex != 3){\n|;
print qq|        document.form1.view_box.value = view[document.form1.no.selectedIndex-1];\n|;
print qq|        document.form1.input_box.value = input[document.form1.no.selectedIndex-1];\n|;
print qq|        if(document.form1.operate.selectedIndex == 4){\n|;
print qq|            yomi_pos = 0;\n|;
print qq|            yomi_data = "";\n|;
print qq|            setYomiWord(0);\n|;
print qq|            document.form1.input_box.value = "";\n|;
print qq|        }else{\n|;
print qq|            document.form1.yomi_word.value = "";\n|;
print qq|        }\n|; 
print qq|    }else{\n|;
print qq|        document.form1.view_box.value = "";\n|;
print qq|        document.form1.input_box.value = "";\n|;
print qq|        document.form1.yomi_word.value = "";\n|;
print qq|    }\n|;
print qq|}\n|;
print qq|function moveFocus(){document.form1.view_box.focus();}\n|;
print qq|function pushSubmitButton(){\n|;
print qq|    if(document.form1.no.selectedIndex != 0 && document.form1.operate.selectedIndex == 4){\n|;
print qq|        document.form1.yomi_form.value = yomi_data;\n|;
print qq|    }\n|;
print qq|    if(document.form1.no.selectedIndex == 0){\n|;
print qq|        if(document.form1.operate.selectedIndex == 1 \|\| document.form1.operate.selectedIndex == 2 \|\| document.form1.operate.selectedIndex == 4){return;}\n|;
print qq|    }\n|;
print qq|    var checkflg = 0;\n|;
print qq|    for(i=0; i<document.form1.input_box.value.length; i++){\n|;
print qq|        checkflg = 0;\n|;
print qq|        for(k=0; k<302; k++){\n|;
print qq|            if(st[k] == document.form1.input_box.value.charAt(i)){\n|;
print qq|                checkflg = 1;\n|;
print qq|            }\n|;
print qq|        }\n|;
print qq|        if(checkflg == 0){\n|;
print qq|            alert("入力文に認識できない文字が含まれています（" + document.form1.input_box.value.charAt(i) + "）");\n|;
print qq|            return;\n|;
print qq|        }\n|;
print qq|    }\n|;
print qq|    document.form1.submit();\n|;
print qq|}\n|;
print qq|function setYomiWord(start){\n|;
print qq|    document.form1.yomi_box.value = "";\n|;
print qq|    document.form1.view_box.value = view[document.form1.no.selectedIndex-1].substr(yomi_pos);\n|;
print qq|    document.form1.yomi_box.focus();\n|;
print qq|    for(i=start; i<view[document.form1.no.selectedIndex-1].length; i++){\n|;
print qq|        exflg = 0;\n|;
print qq|        for(k=0; k<302; k++){\n|;
print qq|            if(st[k] == view[document.form1.no.selectedIndex-1].charAt(yomi_pos)){\n|;
print qq|                yomi_data += st[k];\n|;
print qq|                yomi_pos++;\n|;
print qq|                exflg = 1;\n|;
print qq|            }\n|;
print qq|        }\n|;
print qq|        if(exflg == 0){\n|;
print qq|            document.form1.yomi_word.value = view[document.form1.no.selectedIndex-1].charAt(yomi_pos);\n|;
print qq|            break;\n|;
print qq|        }\n|;
print qq|    }\n|;
print qq|    if(yomi_pos >= view[document.form1.no.selectedIndex-1].length){\n|;
print qq|        document.form1.yomi_word.value = "";\n|;
print qq|        document.form1.yomi_box.value = "";\n|;
print '          alert("読みの入力は全て完了しました。\n\n「実行」ボタンを押してください。");'."\n";
print qq|        document.form1.submitbutton.focus();\n|;
print qq|    }\n|;
print qq|}\n|;
print qq|function pushYomiOK(){\n|;
print qq|    if(document.form1.yomi_word.value == ""){return;}\n|;
print qq|    document.form1.yomi_box.focus();\n|;
print qq|    if(document.form1.yomi_word.value != "" && document.form1.yomi_box.value == ""){\n|;
print qq|        alert("漢字に対応する読みをひらがなで入力してください。");\n|;
print qq|        return;\n|;
print qq|    }\n|;    
print qq|    var yomilen = document.form1.yomi_box.value.length;\n|;
print qq|    for(i=0; i<yomilen-1; i++){\n|;
print qq|        yomi_data += ">";\n|;
print qq|    }\n|;
print qq|    yomi_data += "a";\n|;
print qq|    setYomiWord(++yomi_pos);\n|;
print qq|}\n|;
print qq|function pushConfirmButton(){\n|;
print qq|    alert(yomi_data);\n|;
print qq|    document.form1.yomi_box.focus();\n|;
print qq|}\n|;
print qq|//-->\n|;
print qq|</SCRIPT>\n|;
print qq|</HEAD>\n|;
print qq|<BODY onLoad="moveFocus()">\n|;
print qq|<CENTER>\n|;
print qq|<FORM name="form1" action="rank.cgi?mode=operate" method="POST">\n|;
print qq|<TABLE border="0" width="680" cellspacing="0" cellpadding="0" class="toplink">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD align="center"><A href="$toppath" class="toplink">[TOP]</A> <A href=\"$typepath\" class="toplink">[タイピング画面へ]</A> <A href="rank.cgi?mode=show&rank=1" class="toplink">[現在のランキング]</A> <A href="rank.cgi?mode=readme" class="toplink">[遊び方]</A> [管理用]</TD>\n|;
print qq|    </TR>\n|;
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|<HR size="1" width="680">\n|;
print qq|<TABLE border="0" width="640" cellspacing="1" cellpadding="1" class="tbase">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD class="wordedit"><B>タイピング文編集</B></TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR>\n|;
print qq|      <TD>　　　・編集したい文Noと操作内容を指定して実行ボタンを押してください</TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR>\n|;
print qq|      <TD>　　　・半角の &quot; &lt; &gt; は使えません</TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR>\n|;
print qq|      <TD>　　　・長すぎる文は環境によって登録できない場合があります</TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR>\n|;
print qq|      <TD>　　　・入力文には 漢字→ひらがな に変換した文を入力します</TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR>\n|;
print qq|      <TD>　　　・英文字・記号・カタカナはそのままで入力文にコピーします</TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR>\n|;
print qq|      <TD>　　　・基本文・入力文の登録後、漢字読みの登録ができます</TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR><TD></TD></TR><TR><TD></TD></TR>\n|;
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|<TABLE border="0" width="680" cellspacing="1" cellpadding="1" class="tbase">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD width="70" align="right">文No：</TD>\n|;
print qq|      <TD width="70"><SELECT name="no" onChange="movement()"><OPTION value="0" SELECTED></OPTION>\n|;
for($i=1; $i<=$maxcount; $i++){print "<OPTION value=\"$i\">$i</OPTION>";}
print qq|</SELECT></TD>\n|;
print qq|      <TD width="70" align="right" nowrap>操作内容：</TD>\n|;
print qq|      <TD width="340"><SELECT name="operate" onChange="movement()"><OPTION value="new" SELECTED>新規登録</OPTION><OPTION value="edit">１文修正</OPTION><OPTION value="delete">１文削除</OPTION><OPTION value="alldelete">全文削除</OPTION><OPTION value="yomioperate">漢字読み登録</OPTION></SELECT>　 <INPUT type="button" name="submitbutton" value="実行" onClick="javascript:pushSubmitButton()"> <INPUT type="button" value="元に戻す" onClick="movement()"></TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR>\n|;
print qq|      <TD></TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR>\n|;
print qq|      <TD width="70" align="right" nowrap>基本文：</TD>\n|;
print qq|      <TD colspan="3"><INPUT type="text" size="65" name="view_box"></TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR>\n|;
print qq|      <TD width="70" align="right" nowrap>入力文：</TD>\n|;
print qq|      <TD colspan="3"><INPUT type="text" size="65" name="input_box"></TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR>\n|;
print qq|      <TD></TD>\n|;
print qq|      <TD colspan="3">例）基本文：新規作成　⇒　入力文：しんきさくせい　(半角 \\ ⇒ \\\\ で入力)</TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR>\n|;
print qq|      <TD></TD>\n|;
print qq|      <TD colspan="3">$warning</TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR>\n|;
print qq|      <TD></TD>\n|;
print qq|      <TD colspan="3">↓対応するひらがな読みを右のテキストボックスに入力して「OK」を押してください。</TD>\n|;
print qq|    </TR>\n|;
print qq|    <TR>\n|;
print qq|      <TD align="right" nowrap>漢字読み：</TD>\n|;
print qq|      <TD colspan="3"><INPUT type="text" name="yomi_word" size="5" readonly><INPUT type="text" name="yomi_box" maxlength="10"> <INPUT type="button" value=" OK " onClick="javascript:pushYomiOK()"><INPUT type="hidden" name="yomi_form"> <INPUT type="button" value="入力の確認" onClick="pushConfirmButton()"></TD>\n|;
print qq|    </TR>\n|;
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|<HR size="1" width="680">\n|;
print qq|<TABLE border="0" width="680" cellpadding="2" cellspacing="2" class="admin">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR><TD align="center" width="35">No</TD><TD align="center" width="270">基本文</TD><TD align="center" width="270">入力文</TD><TD align="center" width="35" nowrap>読み</TD></TR>\n|;
for($i=1; $i<=$maxcount; $i++){print "<TR bgcolor=\"#fff0f5\" valign=\"top\"><TD align=\"center\">$i</TD><TD>$view[$i-1]</TD><TD>$input[$i-1]</TD><TD align=\"center\" valign=\"middle\" nowrap>$yomi[$i-1]</TD></TR>\n"}
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|<BR><BR>\n|;
print qq|<input type="hidden" name="adpass" value="$FORM{'adpass'}">\n|;
print qq|<input type="hidden" name="admenu" value="$FORM{'admenu'}">\n|;
print qq|</FORM>\n|;
print qq|</CENTER>\n|;
print qq|</BODY>\n|;
print qq|</HTML>\n|;
&unlock;
exit;
}
#=======================
# ランクデータ削除画面
#=======================
sub rankDeleteMenu(){
&head;
my(@rank_sel);
#-- ランキング読み込み
if(open(FILE, "<$rankpath")){
    my(@data) = <FILE>;
    close(FILE);
    my($index) = 1;
    my(@para);
    foreach(@data){
        $_ =~ s/\r//g;
        $_ =~ s/\n//g;
        @para = split(/<>/, $_);
        push(@rank_sel, "<OPTION value=\"$para[3]$para[8]\">No.$index $para[3] 打鍵[$para[0]] ミス[$para[1]] $para[6]</OPTION>");
        $index++;
    }
}
print qq|</HEAD>\n|;
print qq|<BODY>\n|;
print qq|<CENTER>\n|;
print qq|<FORM action="rank.cgi?mode=deleterank" method="POST">\n|;
print qq|<TABLE border="0" width="620" cellspacing="0" cellpadding="0" class="toplink">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD align="center"><A href="$toppath" class="toplink">[TOP]</A> <A href=\"$typepath\" class="toplink">[タイピング画面へ]</A> <A href="rank.cgi?mode=show&rank=1" class="toplink">[現在のランキング]</A> <A href="rank.cgi?mode=readme" class="toplink">[遊び方]</A> [管理用]</TD>\n|;
print qq|    </TR>\n|;
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|<HR size="1" width="640"><BR>\n|;
print qq|<TABLE border="0" class="tbase">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD>削除するデータ：<SELECT name="deleteID">\n|;
foreach(@rank_sel){print "$_\n";}
print qq|<SELECT></TD>\n|;
print qq|    </TR>\n|;
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|<BR>\n|;
print qq|<TABLE border="0" class="tbase">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD><INPUT type="submit" value="削除"></TD>\n|;
print qq|    </TR>\n|;
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|<BR>\n|;
print qq|<TABLE border="0" width="640" class="tbase">\n|;
print qq|  <TBODY>\n|;
print qq|    <TR>\n|;
print qq|      <TD align="right"><A href="$murasurl" target="_blank" class="toplink">打鍵トレーナー$muras Mura's…</A></TD>\n|;
print qq|    </TR>\n|;
print qq|  </TBODY>\n|;
print qq|</TABLE>\n|;
print qq|<input type="hidden" name="adpass" value="$FORM{'adpass'}">\n|;
print qq|<input type="hidden" name="admenu" value="$FORM{'admenu'}">\n|;
print qq|</FORM>\n|;
print qq|</CENTER>\n|;
print qq|</BODY>\n|;
print qq|</HTML>\n|;
&unlock;
exit;
}
#======================
# ランキング削除処理
#======================
sub deleteRanking(deleteID){
    if(!open(FILE, "+<$rankpath")){$IN{'mode'} = 'show';&message('ランキングファイル読み込みエラー');}
    my(@data) = <FILE>;
    seek(FILE,0,0);
    truncate(FILE,0);
    
    foreach(@data){
        $_ =~ s/\r//g;
        $_ =~ s/\n//g;
        @para = split(/<>/, $_);

        if("$para[3]$para[8]" eq $_[0]){next;}
        print FILE "$_\n";
    }
    close(FILE);
    &message('完了しました');
}
#=============
# 文編集操作
#=============
sub composition{
    if($FORM{'operate'} ne 'alldelete' && $FORM{'operate'} ne 'yomioperate'){
        if($FORM{'view_box'} eq '' || $FORM{'input_box'} eq ''){$IN{'mode'} = 'admin'; &message('基本文と入力文の両方に文字を入力してください');}
    }
    if($FORM{'view_box'} =~ /&lt;/ || $FORM{'view_box'} =~ /&gt;/ || $FORM{'view_box'} =~ /&quot;/ ||
       $FORM{'input_box'} =~ /&lt;/ || $FORM{'input_box'} =~ /&gt;/ || $FORM{'input_box'} =~ /&quot;/){$IN{'mode'} = 'admin'; &message('半角の &quot; &lt; &gt; は使えません');}
    if($FORM{'operate'} ne 'new' && $FORM{'operate'} ne 'alldelete' && $FORM{'no'} == 0){$IN{'mode'} = 'admin'; &message('文Noを選択してください');}

    my($flg) = 0;
    if(!open(FILE, "+<$wordpath")){$IN{'mode'} = 'admin'; &message('例文ファイル読み込みエラー')};
    my(@data) = <FILE>;
    foreach(@data){$_ =~ s/\r//g;$_ =~ s/\n//g;} # 改行削除
    seek(FILE,0,0);
    truncate(FILE,0);

    if($FORM{'operate'} eq 'new'){ # 新規作成
        foreach(@data){
            if($_ eq '//END>>'){
                if($flg == 0){print FILE "\"$FORM{'view_box'}\"\,\n$_\n"; $flg++;}
                elsif($flg == 1){print FILE "\"$FORM{'input_box'}\"\,\n$_\n"; $flg++;}
                elsif($flg == 2){print FILE "\"$FORM{'yomi_form'}\"\,\n$_\n";}
            }else{
                print FILE "$_\n";
            }
        }

    }elsif($FORM{'operate'} eq 'edit' || $FORM{'operate'} eq 'delete'){ # １文修正と１文削除
        my($count) = 0;
        my($buflg) = 0;
        foreach(@data){
            if($_ eq '//START>>'){$flg = 1; $count = 0;}
            elsif($_ eq '//END>>'){$flg = 0; $buflg++;}

            if($flg == 1 && $count++ == $FORM{'no'}){
                if($FORM{'operate'} eq 'delete'){next;} # 削除の時データを書き込まない
                if($buflg == 0){
                    print FILE "\"$FORM{'view_box'}\"\,\n";
                }elsif($buflg == 1){
                    print FILE "\"$FORM{'input_box'}\"\,\n";
                }elsif($buflg == 2){
                    print FILE "\"$FORM{'yomi_form'}\"\,\n";
                }
            }else{
                print FILE "$_\n";
            }
        }

    }elsif($FORM{'operate'} eq 'alldelete'){ # 全文削除
        foreach(@data){
            if($_ eq '//START>>'){$flg = 1; print FILE "$_\n"; next;}
            elsif($_ eq '//END>>'){$flg = 0;}

            if($flg == 1){next;}
            else{print FILE "$_\n";}
        }

    }elsif($FORM{'operate'} eq 'yomioperate'){ # 漢字読み
        my($count) = 0;
        my($buflg) = 0;
        foreach(@data){
            if($_ eq '//START>>'){$flg = 1; $count = 0;}
            elsif($_ eq '//END>>'){$flg = 0; $buflg++;}

            if($flg == 1 && $count == $FORM{'no'}){
                if($buflg == 2){
                    $FORM{'yomi_form'} =~ s/&gt;/>/g;
                    print FILE "\"$FORM{'yomi_form'}\"\,\n";
                }else{
                    print FILE "$_\n";
                }
            }else{
                print FILE "$_\n";
            }
            $count++;
        }
    }
    close(FILE);
    &message('完了しました');
}

#=================
# 表示形式で格納
#=================
sub setViewTag{
    if($IN{'rank'} eq ''){$IN{'rank'} = 1;}
    my($rankindex) = $IN{'rank'};
    my($index) = 1;
    my(@para_data, $timestr);
    foreach(@ranking){
        $_ =~ s/\r//g;
        $_ =~ s/\n//g;
        $timestr = '';
        $homeicon = '';
        if($_ eq '' || $rankindex >= ($IN{'rank'}+50) || $rankindex > $savemax){last;} # 表示終了条件
        if($index < $IN{'rank'}){$index++;next;} # 必要なデータになるまでインクリメント
        @para_data = split(/<>/, $_);
        $timestr = &getTimeStr($para_data[7]);
        if(((time+32400)-$para_data[7]) <= ($newterm*3600)){$timestr .= " <IMG src=\"$newimg\" width=\"$newwidth\" height=\"$newheight\" border=\"0\">";}
        if($para_data[5] ne 'http://'){$homeicon = "<A href=\"$para_data[5]\" target=\"_blank\"><IMG src=\"$homeimg\" width=\"$homewidth\" height=\"$homeheight\" border=\"0\"></A>";}
        push(@viewtag, "    <TR>
      <TD class=\"rank\" align=\"center\" width=\"37\">$rankindex</TD>
      <TD class=\"rank\" width=\"125\">$para_data[3] $homeicon</TD>
      <TD class=\"rank\" align=\"center\" width=\"42\">$para_data[0]</TD>
      <TD class=\"rank\" align=\"center\" width=\"34\">$para_data[1]</TD>
      <TD class=\"rank\" align=\"center\" width=\"47\">$para_data[2]%</TD>
      <TD class=\"rank\" width=\"225\">$para_data[6]</TD>
      <TD class=\"rank\" width=\"95\">$timestr</TD>
    </TR>");
        $rankindex++;
    }
}

#===========
# 登録処理
#===========
sub entrySub(path){
    $ref_url = $ENV{'HTTP_REFERER'};
    $ref_url =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    if( !($ref_url =~ /$base_url/i) && $base_url ne "") {$IN{'mode'} = 'show';&message('他サイトアクセス禁止エラー');}
	
    # 例外処理
    my($name) = $FORM{'para3'};
    $name =~ s/ //g;
    $name =~ s/　//g;
    if($name eq ''){$IN{'mode'} = 'show';&message('スペースだけのネームは作れません');}
    foreach(@errWord){if($FORM{'para3'} =~ /$_/ || $FORM{'para5'} =~ /$_/ || $FORM{'para6'} =~ /$_/){$IN{'mode'} = 'show';&message('禁止されているワードが含まれています');}}
    foreach(@errHost){if($ENV{'REMOTE_ADDR'} =~ /$_/ || $ENV{'REMOTE_HOST'} =~ /$_/){$IN{'mode'} = 'show';&message('ホスト制限されています');}}

    if(!open(FILE, "+<$_[0]")){$IN{'mode'} = 'show';&message('ランキングファイル読み込みエラー');}
    my(@data) = <FILE>;
    my($fileindex) = 0;
    foreach(@data){if(++$fileindex > $savemax){$_ = '';}}

    my($now) = time + 32400; # 現在時取得
    # 1つもデータがない場合
    if($data[0] eq ''){
        seek(FILE,0,0);
        truncate(FILE,0);
        print FILE "$FORM{'para0'}<>$FORM{'para1'}<>$FORM{'para2'}<>$FORM{'para3'}<>$FORM{'para4'}<>$FORM{'para5'}<>$FORM{'para6'}<>$now<>$FORM{'para7'}<>$ENV{'REMOTE_ADDR'}<>$ENV{'REMOTE_HOST'}\n";
        close(FILE);
        return '1位 に登録されました';
    }

    # 1つ以上データがある
    my(@para); my($Exindex) = 0; my($Inindex) = -1; my($Bsindex) = 0; my($Expoint) = 0; my($Exflg) = 0; my($Exmiss) = 0;
    foreach(@data){
        $_ =~ s/\r//g;
        $_ =~ s/\n//g;
        @para = split(/<>/, $_);

        # 二重登録チェック
        if($ENV{'REMOTE_ADDR'} eq $para[9] && $FORM{'para7'} == $para[8]){$IN{'mode'} = 'show';&message('二重登録はできません');}
        if($para[3] eq $FORM{'para3'} && $samename != 1){ # 同じネームが存在する
            if($para[4] ne $FORM{'para4'}){close(FILE);$IN{'mode'} = 'show';&message('パスワードが違います');}
            $Exindex = $Bsindex; # 存在するインデックス
            $Expoint = $para[0]; # 存在する得点
            $Exmiss = $para[1];  # 存在するミス数
            $Exflg = 1;
        }
        if($FORM{'para0'} > $para[0] && $Inindex == -1){$Inindex = $Bsindex;} # 入り込めるインデックス
        $Bsindex++;
    }

    my($count) = 0;
    # 同じネームがある
    if($Exflg == 1){
        seek(FILE,0,0);
        truncate(FILE,0);
        if($Inindex == -1 || $Exindex < $Inindex){ # HPアド・コメントなど更新
            foreach(@data){
                @para = split(/<>/, $_);
                if($count == $Exindex){
                    if($Expoint == $FORM{'para0'} && $Exmiss > $FORM{'para1'}){ # 打鍵同じでミスが減った
                        print FILE "$para[0]<>$FORM{'para1'}<>$FORM{'para2'}<>$para[3]<>$para[4]<>$FORM{'para5'}<>$FORM{'para6'}<>$para[7]<>$FORM{'para7'}<>$ENV{'REMOTE_ADDR'}<>$ENV{'REMOTE_HOST'}\n";
                    }else{
                        print FILE "$para[0]<>$para[1]<>$para[2]<>$para[3]<>$para[4]<>$FORM{'para5'}<>$FORM{'para6'}<>$para[7]<>$FORM{'para7'}<>$ENV{'REMOTE_ADDR'}<>$ENV{'REMOTE_HOST'}\n";
                    }
                }else{print FILE "$_\n";}
                $count++;
            }
            close(FILE);
            return '順位は変わりませんでした';
        }
        if($Exindex == $Inindex && $Expoint < $FORM{'para0'}){   # 順位が変わらず打鍵更新
            foreach(@data){
                if($count == $Exindex){
                    print FILE "$FORM{'para0'}<>$FORM{'para1'}<>$FORM{'para2'}<>$FORM{'para3'}<>$FORM{'para4'}<>$FORM{'para5'}<>$FORM{'para6'}<>$now<>$FORM{'para7'}<>$ENV{'REMOTE_ADDR'}<>$ENV{'REMOTE_HOST'}\n";
                }else{print FILE "$_\n";}
                $count++;
            }
            close(FILE);
            $Exindex++;
            return "順位は $Exindex位 のままでしたが、打鍵数を $FORM{'para0'} に更新しました";
        }
        if($Exindex > $Inindex){ # 順位更新
            foreach(@data){
                if($count == $Inindex){
                    print FILE "$FORM{'para0'}<>$FORM{'para1'}<>$FORM{'para2'}<>$FORM{'para3'}<>$FORM{'para4'}<>$FORM{'para5'}<>$FORM{'para6'}<>$now<>$FORM{'para7'}<>$ENV{'REMOTE_ADDR'}<>$ENV{'REMOTE_HOST'}\n$_\n";
                }elsif($count == $Exindex){$count++;next;
                }else{print FILE "$_\n";}
                $count++;
            }
        }
        close(FILE);
        $Inindex++;
        return "$Inindex位 に順位を更新しました";

    # 同じネームがない
    }else{
        seek(FILE,0,0);
        truncate(FILE,0);
        foreach(@data){
            if($count == $Inindex){
                print FILE "$FORM{'para0'}<>$FORM{'para1'}<>$FORM{'para2'}<>$FORM{'para3'}<>$FORM{'para4'}<>$FORM{'para5'}<>$FORM{'para6'}<>$now<>$FORM{'para7'}<>$ENV{'REMOTE_ADDR'}<>$ENV{'REMOTE_HOST'}\n$_\n";
            }else{print FILE "$_\n";};
            $count++;
        }
        if($Inindex == -1){
            print FILE "$FORM{'para0'}<>$FORM{'para1'}<>$FORM{'para2'}<>$FORM{'para3'}<>$FORM{'para4'}<>$FORM{'para5'}<>$FORM{'para6'}<>$now<>$FORM{'para7'}<>$ENV{'REMOTE_ADDR'}<>$ENV{'REMOTE_HOST'}\n";
            close(FILE);
            $count++;
            return "$count位 に登録されました";
        }
        close(FILE);
        $Inindex++;
        return "$Inindex位 に登録されました";
    }
}

#================
# 集計期間計算
#================
sub setPeriod{
    if($usetimelocal == 1){
        $start_sec = timegm(0,0,0,$stday,$stmon-1,$styear-1900);
    }else{
        $start_sec = timegmSub($styear, $stmon, $stday);
    }

    if($monthreset == 1){
        my($i);
        for($i=1; $i<35; $i++){
            $end_sec = $start_sec + (86400 * $i);
            ($endday,$endmon,$endyear) = &getGMtime($end_sec);
            if($stmon != $endmon){
                last;
            }
        }
        $i--;
        $end_sec = $start_sec + (86400 * $i);
        ($endday,$endmon,$endyear) = &getGMtime($end_sec);
    }else{
        $end_sec = $start_sec + 86400*($resetday-1);
        ($endday,$endmon,$endyear) = &getGMtime($end_sec);
    }
}

#=============
# 標準時取得
#=============
sub getGMtime(sec){
    my($day,$mon,$year) = (gmtime($_[0]))[3..5];
    $mon++;
    $year += 1900;
    return ($day,$mon,$year);
}

#====================
# 簡易標準時取得関数
#====================
sub timegmSub($year, $mon, $day){
    my($yearsub, $monsub, $daysub, $now, $count);

    $count = 0;
    $now = time + 32400;
    while($count < 50) {
        ($daysub, $monsub, $yearsub) = (gmtime($now))[3..5];
        $monsub++;
        $yearsub += 1900;

        if($yearsub != $_[0]){
            $now -= ($yearsub - $_[0]) * 31536000;
        }elsif($monsub != $_[1]){
            $now -= ($monsub - $_[1]) * 2592000;
        }elsif ($daysub != $_[2]) {
            $now -= ($daysub - $_[2]) * 86400;
        }else{
            last;
        }
        $count++;
    }
    return $now;
}

#===================
# 集計期間内外処理
#===================
sub perRenewal(endsec){
    if(($_[0]+86400) > (time+32400)){return;} # 期間内の時終了
    foreach(@rec_label){$_ = '';}     # 歴代期間文字配列クリヤ

    my($i, $k);
    my(@data);
    for($i=$rankfilemax; $i>1; $i--){
        $k = $i - 1;
        open(FILE, "<ranking$k\.cgi") or &message('ランキングデータ更新エラー:１');
        @data = <FILE>;
        close(FILE);

        open(FILE, "+<ranking$i\.cgi") or &message('ランキングデータ更新エラー：２'); 
        seek(FILE,0,0);
        truncate(FILE,0);
        foreach(@data){
            print FILE "$_";
        }
        close(FILE);
    }
    open(FILE, ">ranking1.cgi") or &message('ランキングデータのクリヤに失敗しました');
    close(FILE);
    my($eday,$emon,$eyear) = &getGMtime($_[0]);       # 最終日付
    my($nday,$nmon,$nyear) = &getGMtime($_[0]+86400); # 新しい開始日付

    open(FILE, "+<$setpath") or &message('期間設定ファイル読み込みエラー');
    @data = <FILE>;
    seek(FILE,0,0);
    truncate(FILE,0);
    print FILE "$nyear<>$nmon<>$nday\n"; # 新しい開始日付
    print FILE "$styear<>$stmon<>$stday<>$eyear<>$emon<>$eday\n"; # 前回の範囲
    push(@rec_label, "$styear/$stmon/$stday〜$eyear/$emon/$eday");
    $k = 0;
    my(@para);
    foreach(@data){
        if($k == 0){$k++;next;}
        if(++$k >= $rankfilemax){last;}
        print FILE "$_";
        $_ =~ s/\r//g;
        $_ =~ s/\n//g;
        @para = split(/<>/, $_);
        push(@rec_label, "$para[0]/$para[1]/$para[2]〜$para[3]/$para[4]/$para[5]");
    }
    close(FILE);
    $styear = $nyear;
    $stmon = $nmon;
    $stday = $nday;
    &setPeriod;
}

#====================
# 時間表示文字列取得
#====================
sub getTimeStr(gmtcount){
    my($sec,$min,$hour,$mday,$mon,$year) = (gmtime($_[0]))[0..5];
    $mon++;
    $year += 1900;
    return "$year/$mon/$mday<BR>$hour:$min:$sec";
}

#===================================
# 指定したパスのファイルを読み込む
#===================================
sub getFileData(path){
    open(FILE, "<$_[0]") or &message($_[0].' 読み込みエラー');
    my(@data) = <FILE>;
    close(FILE);
    foreach(@data){$_ =~ s/\r//g;$_ =~ s/\n//g;}
    return @data;
}

#===================
# 期間開始日付格納
#===================
sub readSetup(path){
    open(FILE, "+<$_[0]") or &message('期間設定ファイル読み込みエラー');
    my(@data) = <FILE>;
    if($data[0] eq '' || $data[0] == 0){ # ファイルが空
        seek(FILE,0,0);
        truncate(FILE,0);
        print FILE "$styear<>$stmon<>$stday\n";
        close(FILE);
        return;
    }
    close(FILE);
    my($flg) = 0;
    my(@para);
    foreach(@data){
        $_ =~ s/\r//g;
        $_ =~ s/\n//g;
        @para = split(/<>/, $_);
        if($flg > 0){
            push(@rec_label, "$para[0]/$para[1]/$para[2]〜$para[3]/$para[4]/$para[5]");
        }else{
            $styear = $para[0];
            $stmon = $para[1];
            $stday = $para[2];
        }
        $flg++;
    }
}

#=================
# パラメータ取得
#=================
sub getParam{
    my($query, $i, $name, $value);
    read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
    #-- データ復元
    for($i=0; $i<=1; $i++){
        if($i == 1){$query = $ENV{'QUERY_STRING'};}
        foreach(split(/&/, $query)){
            ($name, $value) = split(/=/, $_);
            $value =~ tr/+/ /;
            $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
            $value =~ s/</&lt;/g;
            $value =~ s/>/&gt;/g;
            $value =~ s/"/&quot;/g;
            &jcode'convert(*value,'euc');
            if($i == 0){$FORM{$name} = $value;}
            else{$IN{$name} = $value;}
        }
    }
}

#===========
# 変換処理
#===========
sub convert(str){
    $_[0] =~ s/&quot;/\\"/g;
    $_[0] =~ s/&gt;/>/g;
    $_[0] =~ s/&lt;/</g;
    return $_[0];
}
