#!/usr/local/bin/perl
# ************** go53.cgi V1.0(2003/8/30)*************
# 53次CGIの本体
# Copyright (c) とまて

# 配布元URL:『go53.cgiのページ』http://www3.kcn.ne.jp/~tomate/o_gate/go53.html
# 『とまての実験室』http://www3.kcn.ne.jp/~tomate/index 内
#############################################################
# jcode.plを組み込む必要があります。PATHは、設置の環境により指定します。
require 'jcode.pl';

$pass_set="x";               # パスワードの指定""でパスワード無し

$me="go53.cgi";              # このCGIの名前
$logfile="go53_log.txt";     # データログファイルの名前
$outputhtml="go53_disp.html";# 地図表示HTMLファイルの名前(go53.cgiから見た相対パス付きで)
$html_to_cgi="./";           # HTMLファイルの位置からCGIファイルへのパス。(絶対パスでも可)
$mapfile="mapB.gif";         # 53次の画像ファイル名(相対パスでも絶対パスでも可)
$color1="color1.gif";        # これから進む宿場の色を指定する画像
$color2="color2.gif";        # 既に到達した宿場の色を指定する画像
$checked="";                 # 万歩計を使用する場合は"CHECKED"、距離で入力する場合は""
$keisuu=0.73;                # 一歩あたりの距離をメートル単位で

$form_call=1;                # 1でフォーム呼び出しボタンを表示:0で非表示

$max_km=100;                 # 一回当りの入力の最大値
$total_max=-1;               # 合計値の最大値
$stock_num=100;              # データ保存数
#############################################################

$map_left=20;    # 地図のページ左端からの位置
$map_top=110;    # 地図のページ上部からの位置
$map_height=259; # 地図の高さ
$map_width=745;  # 地図の幅

@p_53=(725,718,704,697,690,683,668,654,621,604,577,563,551,537,530,522,511,
     503,495,479,465,458,449,441,430,418,404,386,370,354,339,331,320,305,297,
     287,278,266,246,231,220,191,176,169,161,148,135,126,107,98,83,63,40,21,13,2);
@k_53=(0,7.8,17.7,27.5,32.4,41.2,49.1,62.8,65.8,81.5,98.1,112.9,118.8,124.7,136.5,147.7,
      151.6,160.8,164.9,174.5,181.2,189,195.7,204.5,208.4,215,222.1,231.6,237.6,255,265,
      270.8,277.4,283.2,288.5,299.5,301.3,310.1,316.8,331.8,341.8,349.4,376.9,389.6,396.8,403.1,
      408.7,416.9,423.4,433.2,443.8,457.5,469.3,483.7,495.5,500,500);
@shukuba=('日本橋','品川','川崎','神奈川','保土谷','戸塚','藤沢','平塚','大磯','小田原','箱根','三島','沼津','原','吉原','蒲原','由比','興津',
          '江尻','府中','丸子','岡部','藤枝','島田','金谷','日坂','掛川','袋井','見附','浜松','舞阪','新居','白須賀','二川','吉田','御油','赤坂',
          '藤川','岡崎','地鯉鮒','鳴海','宮','桑名','四日市','石薬師','庄野','亀山','関','坂下','土山','水口','石部','草津','大津','三条大橋','500km地点');

if($form_call==1){
    $form_call="<INPUT TYPE=\"button\" VALUE=\"入力フォーム\" onClick=\"window.open('$html_to_cgi$me','formwin','width=350,height=450');\">";
}else{
    $form_call="";
}
$logo='<A HREF="http://www3.kcn.ne.jp/~tomate/o_gate/go53.html"><SPAN STYLE="font-size:6pt;color:white;background-color:olive">
go53.cgi</SPAN></A>';

# 使用する配列や変数を作成する
@data=();
@date5=();
@test=();
$map_out="";
@page_data=();
$toutatu_position=0;

# ファイル入力サブルーチンをコールする
# testinput.txtの内容を@dataに入力する。
$errinp=&fileinput($logfile,"data");
if($errinp==1){$message="ログファイル($logfile)が開けません<BR>";}
$data_n=@data;

# 最新5日分のデータをエディット用に取り出す
&pick_5days;

# 6日前の累計値
if($data_n>5){
    @dmy=split("\t",$data[$data_n-6]);
    $ruikei6=$dmy[2];
}else{
    $ruikei6=0;
}

# 日付
    ($sec , $min , $hour, $mday, $mon, $year ,$wday) = localtime();
    $datenow =sprintf("%04d/%02d/%02d",$year + 1900, $mon + 1, $mday);

# 最新の累計値
if($data_n>0){
    @dmy=split("\t",$data[$data_n-1]);
    $x_pos=$dmy[2];
}else{
    $x_pos=0;
}

# 古いユーザーコメントの抜き出し
    $errinp=&fileinput($outputhtml,"page_data");
   if($errinp==1){$message="地図表\示HTML($outputhtml)が開けません<BR>";}

    $page_data=join("\n",@page_data);
    $pos1=index $page_data,"<!-map_position-->";
    $pos3=index $page_data,"<SPAN",$pos1;
    $pos3=index $page_data,"<SPAN",$pos3+4;
    $pos3=index $page_data,">",$pos3;
    $pos4=index $page_data,"<",$pos3;
    $usercom=substr($page_data,$pos3+1,$pos4-$pos3-1);

%form = &read_input_tagles('sjis');
$pass         =$form{'pass'};
$disp         =$form{'disp'};

if ($ENV{'REQUEST_METHOD'} eq "POST" && ($pass ne $pass_set && $pass_set ne "")){$message="パスワードが違います<BR>"}

if ($ENV{'REQUEST_METHOD'} eq "POST" && ($pass eq $pass_set)||($pass_set eq "")){
    #--------------------↓フォームデータ読み込み---------------------
    $send         =$form{'send'};

    if($x_pos>$total_max && $total_max>0){
        $message="前回の到達距離が$total_maxを超えていますので、データを一旦全て削除します。<BR>";
        $send="データを全て削除";}

    if($send eq "入力"){
        $date       =$form{'date'};
        $kyori      =$form{'kyori'}+0;

        $meter_on        =$form{'meter_on'};
        $coefficient        =$form{'coefficient'};

        if($meter_on==1){$kyori=int($kyori*$coefficient/100)/10;}else{$kyori=int($kyori*10)/10;}

        if($kyori>$max_km){$kyori=$max_km;$message="$max_km"."km以上だったので$max_kmで入力されました。<BR>"}else{$kyori=int($kyori*10)/10;}

        if($kyori>0){
            $x_pos=$x_pos+$kyori;
            $data[$data_n]="$date\t$kyori\t$x_pos";
            for($i=0;$i<4;$i++){
                $date5[$i]=$date5[$i+1];
                $kyori5[$i]=$kyori5[$i+1];
            }
            $date5[4]=$date;
            $kyori5[4]=$kyori;
            $data_n=$data_n++;
         }else{$message="100m未満は入力できません。<BR>";}
    }elsif($send eq "修正"){
        $kyori5[0]    =int(($form{'kyori_0'}+0)*10)/10;
        $kyori5[1]    =int(($form{'kyori_1'}+0)*10)/10;
        $kyori5[2]    =int(($form{'kyori_2'}+0)*10)/10;
        $kyori5[3]    =int(($form{'kyori_3'}+0)*10)/10;
        $kyori5[4]    =int(($form{'kyori_4'}+0)*10)/10;
        $date5[0]    =$form{'date_0'};
        $date5[1]    =$form{'date_1'};
        $date5[2]    =$form{'date_2'};
        $date5[3]    =$form{'date_3'};
        $date5[4]    =$form{'date_4'};
        $usercom      =$form{'usercom'};

        $x_pos=$ruikei6;
        for($i=0;$i<5;$i++){
            if($kyori5[$i]>$max_km){$kyori5[$i]=$max_km;$message="$max_km"."km以上だったので$max_kmで入力されました。<BR>";}else{$kyori5[$i]=int($kyori5[$i]*10)/10;}
            $x_pos=$x_pos+$kyori5[$i];
            $data[$is+$i]="$date5[$i]\t$kyori5[$i]\t$x_pos";
        }
    }elsif($send eq "チェックしたものを削除"){
        $del[0]       =$form{'del0'};
        $del[1]       =$form{'del1'};
        $del[2]       =$form{'del2'};
        $del[3]       =$form{'del3'};
        $del[4]       =$form{'del4'};

        # 詰めて
        $x_pos=$ruikei6;
        $ip=0;
        for($i=0;$i<5;$i++){
             if($del[$i] != 1){
                  $x_pos=$x_pos+$kyori5[$i];
                  $data[$is+$ip]="$date5[$i]\t$kyori5[$i]\t$x_pos";
                  $ip++;
             }
        }

        # 詰めた分だけ不要になったデータを消します。
        $irest=5-$ip;
        for($i=0;$i<$irest;$i++){
             pop(@data);
             $data_n--;
        }

        # 新たにエディットエリアにデータを格納し直す。

        @date5=();
        @kyori5=();
        &pick_5days;
        $x_pos=$dmy[2];
    }
    if($send eq "データを全て削除"){
        @data=("");
        $x_pos=0;
        for($i=0;$i<5;$i++){
            $date5[$i]="";
            $kyori5[$i]=0;
        }
    }
    if($data_n-1>$stock_num){
        $errinp=&fileout($logfile,"data",1,$data_n-$stock_num,$data_n);
        if($errinp==1){$message="ログファイル($logfile)が開けません<BR>";}

    }else{
        $errinp=&fileout($logfile,"data",1);
        if($errinp==1){$message="ログファイル($logfile)が開けません<BR>";}
    }

    # 地図の表示のための操作
    $oufukusuu=0;
    $x_pos_d=sprintf("%10.1f",$x_pos);

    while($x_pos_d-$kyori5[4]>= $k_53[55]){
        $x_pos_d=sprintf("%10.1f",$x_pos_d-$k_53[55]);
        $oufukusuu++;
    }

    for($i=0;$i<56;$i++){
        if($x_pos_d<$k_53[$i]){last;}
    }

    $toutatu_position=$i-1;
    $next=sprintf("%10.1f",$k_53[$toutatu_position+1]-$x_pos_d);
    $rest=sprintf("%10.1f",500-$x_pos_d);

    if($x_pos_d>=$k_53[55]){
        $seiha=1;
        $next=0-$next;
        $oufukusuu++;
    }else{
        $seiha=0;
    }
    if($seiha != 1){

        # 累積距離の表示
        $kiroku="<B>累積距離:$x_pos"."km</B> ";

        # 1回以上の場合に回数と地点を表示する
        if($oufukusuu>0){
            $kiroku=$kiroku.($oufukusuu+1)."回目の$x_pos_d"."km地点 ";
        }

        # 日本橋の場合は出発、それ以外は到達と書く
        if($toutatu_position>0){
            $kiroku=$kiroku."<B>$shukuba[$toutatu_position]宿</B>($toutatu_position番)に到達 ";
        }else{
            $kiroku=$kiroku."<B>$shukuba[$toutatu_position]宿</B>($toutatu_position番)を出発 ";
        }

        # 次の宿場までの距離
        if($next!=0){$kiroku=$kiroku."次の<B>$shukuba[$toutatu_position+1]宿</B>までの距離:$next"."km";}

        # ゴールまでの距離
        $kiroku=$kiroku."<TABLE STYLE=\"font-size:12pt;color:black\"><TR><TD WIDTH=\"100%\">ゴール(500kmポイント)までの距離:$rest"."km</TD>";

    }else{
        # ゴールに到達した場合の表示
        $kiroku="<B>累積距離は$x_pos"."km</B> ゴール(500km地点)に".($oufukusuu)."回めの到着しました。";
        if($next!=0){
            $kiroku=$kiroku."<TABLE STYLE=\"font-size:12pt;color:black\"><TR><TD WIDTH=\"100%\">余った$next"."km は次の旅に加算します!!</TD>";
        }else{
            $kiroku=$kiroku."<TABLE STYLE=\"font-size:12pt;color:black\"><TR><TD WIDTH=\"100%\"></TD>";
        }

    }
    &map_change;
    #--------------------↑フォームデータ読み込み---------------------
}
#--------------------↓ページの表示----------------------
print "Content-type: text/html\n\n";
if($disp eq "1"){
    print "$page_data";
}else{
    &test_page;
}
exit();
#===================↓ここからサブルーチン=============================
sub test_page{

print <<"HIA1";
<HTML>
<HEAD>
<TITLE>入力FORM</TITLE>
<META HTTP-EQUIV="content-type" CONTENT="text/html;charset=SHIFT_JIS" >
</HEAD>
<BODY STYLE="font-size:11pt">
<!------------------------↓作成したフォームの記述箇所------------------>
<FORM ACTION="$me" METHOD="POST">
<SPAN STYLE="color:#ef0000;font-weight:bold">$message</SPAN>
パスワード <INPUT TYPE="password" NAME="pass" VALUE="$pass" SIZE="12" MAXLENGTH="12">
<A HREF="$outputhtml" TARGET="go53">[HTML表\示]</A>
<A HREF="$me?disp=1" TARGET="go53">[CGI表\示]</A>
<HR>
新しい日付の分を入力<BR>
<INPUT TYPE="text" NAME="date" SIZE="15" MAXLENGTH="10" VALUE="$datenow">
    <INPUT TYPE="text" NAME="kyori" SIZE="10" MAXLENGTH="10" VALUE=""><BR>
    <INPUT TYPE="submit"  NAME="send" VALUE="入力"><A HREF="$me">[再読み込み]</A><BR>
(100でリミットします)<BR>
距離は0.1km=100m単位で入力できます。<BR>

    <INPUT TYPE="checkbox" NAME="meter_on"  VALUE="1"$checked>万歩計モード<BR>
    1歩あたりの距離m <INPUT TYPE="text" NAME="coefficient" VALUE="$keisuu" SIZE="10" MAXLENGTH="10"><BR>

<HR>
最新5日間のデータ(修正可能\)<BR>
<INPUT TYPE="text" NAME="date_0" SIZE="15" MAXLENGTH="10" VALUE="$date5[0]">
    <INPUT TYPE="text" NAME="kyori_0" SIZE="10" MAXLENGTH="10" VALUE="$kyori5[0]"><INPUT TYPE="checkbox" NAME="del0"  VALUE="1"><BR>
<INPUT TYPE="text" NAME="date_1" SIZE="15" MAXLENGTH="10" VALUE="$date5[1]">
    <INPUT TYPE="text" NAME="kyori_1" SIZE="10" MAXLENGTH="10" VALUE="$kyori5[1]"><INPUT TYPE="checkbox" NAME="del1"  VALUE="1"><BR>
<INPUT TYPE="text" NAME="date_2" SIZE="15" MAXLENGTH="10" VALUE="$date5[2]">
    <INPUT TYPE="text" NAME="kyori_2" SIZE="10" MAXLENGTH="10" VALUE="$kyori5[2]"><INPUT TYPE="checkbox" NAME="del2"  VALUE="1"><BR>
<INPUT TYPE="text" NAME="date_3" SIZE="15" MAXLENGTH="10" VALUE="$date5[3]">
    <INPUT TYPE="text" NAME="kyori_3" SIZE="10" MAXLENGTH="10" VALUE="$kyori5[3]"><INPUT TYPE="checkbox" NAME="del3"  VALUE="1"><BR>
<INPUT TYPE="text" NAME="date_4" SIZE="15" MAXLENGTH="10" VALUE="$date5[4]">
    <INPUT TYPE="text" NAME="kyori_4" SIZE="10" MAXLENGTH="10" VALUE="$kyori5[4]"><INPUT TYPE="checkbox" NAME="del4"  VALUE="1"><BR>
ユーザーのミニコメント(30字以内)<BR>
    <INPUT TYPE="text" NAME="usercom" VALUE="$usercom" SIZE="55" MAXLENGTH="30"><BR>

    <INPUT TYPE="submit"  NAME="send" VALUE="修正">
    <INPUT TYPE="submit"  NAME="send" VALUE="チェックしたものを削除">
    <INPUT TYPE="submit"  NAME="send" VALUE="データを全て削除"><BR>
</FORM>
<!------------------------↑作成したフォームの記述箇所------------------>
</BODY>
</HTML>
HIA1
}

#********************************************************
sub map_change{

$map_left=20;
$map_top=110;

$pos1=index $page_data,"map_area";
$pos2=rindex $page_data,"top",$pos1;

$com_top=substr($page_data,$pos2+4,5)+2;
$map_top=$com_top+80;
$pos2=rindex $page_data,"left",$pos1;
$map_left=substr($page_data,$pos2+5,5)+2;
$cre_top=$map_top+260;

$blue_width=$p_53[$toutatu_position]+1;
$red_left=$map_left+$blue_width;
$red_width=$map_width-$blue_width;

#------------------地図表示部作成-----------------------------------
$map_out= <<"HIA1";
<DIV STYLE="position:absolute;left:$map_left;top:$map_top"><IMG SRC="$color1" WIDTH="$blue_width" HEIGHT="$map_height"></DIV>
<DIV STYLE="position:absolute;left:$red_left;top:$map_top"><IMG SRC="$color2" WIDTH="$red_width"  HEIGHT="$map_height"></DIV>
<DIV STYLE="position:absolute;left:$map_left;top:$com_top;width:$map_width;font-size:12pt;background-color:white;color:black;line-height:140%;padding:5px">
  $kiroku
  <TD>$logo$form_call
</TD></TR></TABLE>
  <CENTER><SPAN STYLE="font-weight:bold;background-color:#FFDDDD">$usercom</SPAN></CENTER>
</DIV>

<DIV STYLE="position:absolute;left:$map_left;top:$map_top"><IMG SRC="$mapfile" HEIGHT="$map_height" WIDTH="$map_width"></DIV>

HIA1
#-------------------HTMLに組み込む-----------------------------------
$pos1=index $page_data,"<!-map_position-->";
$pos2=index $page_data,"<!-/map_position-->";

if($pos1>0 && $pos2>0){
    $headder=substr($page_data,0,$pos1);
    $footer=substr($page_data,$pos2,length($page_data)-$pos2);
}else{
    $pos1=index $page_data,"<\/BODY>";
    $headder=substr($page_data,0,$pos1);
    $footer="<!-/map_position-->\n</BODY>\n</HTML>";
}


$page_data=$headder."<!-map_position-->\n".$map_out.$footer;
@page_data=("$page_data");
$errinp=&fileout($outputhtml,"page_data",1);
if($errinp==1){$message="地図表\示HTML($outputfile)が開けません<BR>";}

}

sub pick_5days{
    @date5=();
    @kyori5=();
    if($data_n>=5){
        $is=$data_n-5;
        $ie=$data_n-1;
    }else{
        $is=0;
        $ie=$data_n-1;
    }
    for($i=$is;$i<=$ie;$i++){
        @dmy=split("\t",$data[$i]);
        $date5[$i-$ie+4]=$dmy[0];
        $kyori5[$i-$ie+4]=$dmy[1];
    }
}

sub fileinput{
$err=0;

$filename=$_[0];
$hensuumei=$_[1];

   if ( !open (FILE_IO, $filename) ){
            $err=1;
    }
    else{
        @$hensuumei = <FILE_IO>;
        close(FILE_IO);
    }
        $cntend=@$hensuumei-1;
    for ($i=0;$i<=$cntend;$i++){
       $$hensuumei[$i]=~s/\r//g;
       $$hensuumei[$i]=~s/\n//g;
    }
    return($err);
}
#====================================================================
# ファイル出力サブルーチン__ &fileout(出力ファイル名,変数名,書き込みモード,start,end)
#    ※書き込みモードは、0:追加書き込み、1:上書き保存

sub fileout{
    $err=0;
    $filename=$_[0];
    $hensuumei=$_[1];
    $overwrite=$_[2];
    $istart=$_[3];
    $iend=$_[4];
    $cntend=@$hensuumei-1;

    if($istart eq "" && $iend eq ""){
        $istart=0;
        $iend=$cntend;
    }

    if($istart<0 || $istart>$iend || $iend>$cntend){
        $err=1;
    }else{

        if($overwrite==1){
            $openname=">".$filename;
        }else{
            $openname=">>".$filename;
        }

        # ファイルに格納する。
        if ( !open (FILE_IO, $openname) ){
            $err=1;
        }else{
           for ($i=$istart;$i<=$iend;$i++){
              print FILE_IO $$hensuumei[$i]."\n";
           }
           close (FILE_IO);
        }
    }
    return($err);
}
##############################################################
# # # read_input : フォームからのデータを分解し # # $form{'xxxx'} で返す。
# # # # 引数 1: 'euc' or 'jis' or 'sjis' # # #
# タグ避け追加 byとまて
##############################################################
sub read_input_tagles {
    $charset = $_[0];
    $charset = 'euc' if ( $charset eq '' );
    local ($buffer, @pairs, $pair, $name, $value, %FORM);
    # Read in text
    $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
    if($ENV{'REQUEST_METHOD'} eq "POST") {
        read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
    }else{ $buffer = $ENV{'QUERY_STRING'};}
    @pairs = split(/&/, $buffer);
    foreach $pair (@pairs) {
        ($name, $value) = split(/=/, $pair);
        $value =~ tr/+/ /;
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
        &jcode'convert(*value, $charset);
        $value =~ s/&/&amp;/g;
        $value =~ s/</&lt;/g;
        $value =~ s/>/&gt;/g;
        $FORM{$name} = $value;
    }
    %FORM;
}
__END__