#!/usr/local/bin/perl
# ************** fdiary_U.cgi V1.0(2003/7/1)*************
# 日記用のCGI本体(ユニコード用)
# Copyright (c) とまて
# 配布元URL:『fdiary.cgiのページ』http://www3.kcn.ne.jp/~tomate/o_gate/fdiary.html
# 『とまての実験室』http://www3.kcn.ne.jp/~tomate/index 内
#################################################################

# 書き込み者のパスワード設定(半角英数字10桁)
$pass_set="x";

# 日記の開始ページ番号(3桁で指定)
$start_page='000';

# ファイル名の設定
$me           ="fdiary_U.cgi"     ;# このCGI
$datafile     ="fdiary_log.html"  ;# 最新の日記を書き込むファイル
$filename_top ="fdiary_log_"      ;# ログファイルの名前
$iconselfile  ="fdiary_icons.txt" ;# アイコンの管理するファイル

$skinselfile  ="fdiary_skins.txt" ;# スキンの管理をするファイル
$chpagefile   ="fdiary_cpage.txt" ;# 改ページモードを管理するファイル

$iconwildcard="icon/*"  ;# アイコンファイルのワイルドカード
$skinwildcard="skin_*.html";# スキン定義ファイルのワイルドカード
#################################################################

# ロゴの設定:最新ページにのみ下記のロゴ&LINKが付きます。改ページしたページには残りません。
$logo='<DIV  ALIGN="right"><A HREF="http://www3.kcn.ne.jp/~tomate/o_gate/fdiary.html">'."\n".'<SPAN STYLE="font-size:6pt;color:white;background-color:olive">fdiary.cgi</SPAN></A></DIV>';

# フォームなどのスタイル指定
$p_style="\n".'<TABLE STYLE="background-color:#FFFFFF;color:black;border:4 white ridge"><TR>'."\n".'<TD STYLE="padding:7mm;font-size:11pt;line-height:100%">';
$p_stylee='</TD></TR></TABLE>';

# 変数名の設定
$hedder="";
$footer="";
$daystyle="";
$prevfile="";
$nextfile="";
@pagechan_mode=('手動','日曜日毎','月曜日毎','月毎','記事数毎');
@datain=();
@data=();
@styledata=();
@icons=();

# 最新ページの読み込み、もしくは作成
if(-e $datafile){
    # 最新ページの読み込み
    $errinp=&fileinput($datafile,"datain");
}else{
    # 初期設定画面
    &shokiset;
}
    &datafile_read;

    # 日付のセット
    ($sec , $min , $hour, $mday, $mon, $year ,$wday) = localtime();
    $today=&dateformat($datemode,$year+1900,$mon+1,$mday,$wday);
    $datenow =sprintf("<!-%04d%02d%02d%01d-->",$year + 1900, $mon + 1, $mday,$wday).$today;

$next_page=2;
if ($ENV{'REQUEST_METHOD'} eq "POST"){
    %form = &read_input('sjis');
    #--------------------↓フォームデータ読み込み---------------------
    $next_page    =$form{'next_page'};
    $kpass        =$form{'kpass'};
    $kubun        =$form{'kubun'};
    $comment        =$form{'comment'};
    $edit_day        =$form{'edit_day'};
    $edit_n        =$form{'edit_n'};
    $skin        =$form{'skin'};
    $send        =$form{'send'};
    $pageNo        =$form{'pageNo'};
    $title        =$form{'title'};
    $iconmanein        =$form{'iconmanein'};
    $skinmanein      =$form{'skinmanein'};
    $pagechange      =$form{'pagechange'};
    $pagechange_no   =$form{'pagechange_no'};
    #--------------------↑フォームデータ読み込み---------------------

    if($kpass ne $pass_set){$next_page=2;}else{
        $next_page=0; #デフォルトで書き込み用フォーム表示

        if($send eq "完了"){
            if($iconmanein ne ""){
                @iconfiles=split("\n",$iconmanein);
                &fileout($iconselfile,"iconfiles",1);
            }
            if($skinmanein ne ""){
                @skinfiles=split("\n",$skinmanein);
                &fileout($skinselfile,"skinfiles",1);
            }
            @chpage=($pagechange,$pagechange_no);
            &fileout($chpagefile,"chpage",1);

        }elsif($send eq "アイコン・スキン・改ページ管理"){
            $next_page=4;

            if(-e $skinselfile){$errinp=&fileinput($skinselfile,"skinfiles_old");}
            if(-e $iconselfile){$errinp=&fileinput($iconselfile,"iconfiles_old");}

            # スキン選択ファイル検索
            @skinfiles=<${skinwildcard}>;
            $skinfiles_n=@skinfiles;
            $apos=index $skinwildcard,"*";
            $alen=length($skinwildcard)-1;
            for($i=0;$i<$skinfiles_n;$i++){$skinfiles[$i]=substr($skinfiles[$i],$apos,length($skinfiles[$i])-$alen);}

            # アイコン選択ファイル検索
            @iconfiles=<${iconwildcard}>;
            $iconfiles_n=@iconfiles;
            $apos=index $iconwildcard,"*";
            $alen=length($iconwildcard)-1;
            for($i=0;$i<$iconfiles_n;$i++){$iconfiles[$i]=substr($iconfiles[$i],$apos,length($iconfiles[$i])-$alen);}

            # スキンの古いタイトルマッチング
            @skinfiles=&matching('skinfiles_old','skinfiles');

            # アイコンの古い名前のマッチング
            @iconfiles=&matching('iconfiles_old','iconfiles');

        }elsif($send eq "スキン取り込み"){
             if($kiji0==0){
                 $dmy=$skinwildcard;
                 $dmy=~s/\*/$skin/g;
                 $stylefile=$dmy;
                 # 古いデータの保存
                 $next_page=0;
                 @kiji_old=@kiji;
                 @ds_old=@ds;
                 $pageno=&pageno_get;

                 &hedderjoin;
                 if((index $hedder,$prevfile)>=0){$prevlink_on=1;}else{$prevlink_on=0;}
                 if((index $hedder,$nextfile)>=0){$nextlink_on=1;}else{$nextlink_on=0;}
                 &heddersplit;

                 # 新しいスタイルの読み込み
                 &skinin;
                 if($messege ne ""){$next_page=3;}else{
                     $hedder=$hedder."\n$day_style\n";
                     @kiji=();
                     for($i=0;$i<$kiji_n;$i++){
                         push(@kiji,@aday);
                         $kiji[$i*($ds[0]+1)+$ds[1]]=$kiji_old[$i*($ds_old[0]+1)+$ds_old[1]];
                         $kiji[$i*($ds[0]+1)+$ds[2]]=$kiji_old[$i*($ds_old[0]+1)+$ds_old[2]];
                         $date=$kiji_old[$i*($ds_old[0]+1)+$ds_old[2]];
                         $kiji[$i*($ds[0]+1)+$ds[2]]=substr($date,0,15).&dateformat($datemode,substr($date,3,4),substr($date,7,2),substr($date,9,2),substr($date,11,1));
                         $kiji[$i*($ds[0]+1)+$ds[3]]=$kiji_old[$i*($ds_old[0]+1)+$ds_old[3]];
                     }
                     $kiji[($kiji_n-1)*($ds[0]+1)]=$kiji[($kiji_n-1)*($ds[0]+1)].'<A NAME="page_bottom">';
                 }
             }else{$send="";$next_page=3;$messege="記事が無い状態でスキンの変更はできません。仮にでも何か入力なさってから再度お試し下さい。"}


        }elsif($send eq "エディット"){
             $next_page=1;
             $comment=&crlf($kiji[$edit_n*($ds[0]+1)+$ds[3]],0);
             $title=&crlf($kiji[$edit_n*($ds[0]+1)+$ds[1]],0);
             $edit_day=substr($kiji[$edit_n*($ds[0]+1)+$ds[2]],15,length($kiji[$edit_n*($ds[0]+1)+$ds[2]]));

        }elsif($send eq "削除"){
            if($kiji_n >1){
                splice(@kiji,$edit_n*($ds[0]+1),$ds[0]+1);
                if($edit_n==$kiji_n-1 && $kiji_n >0){$kiji[($kiji_n-2)*($ds[0]+1)]=$aday[0].'<A NAME="page_bottom">';}
            }else{
                @kiji=@aday;
                unshift(@kiji,'<DIV style="VISIBILITY: hidden; POSITION: relative">');
                push(@kiji,'</DIV>');
                $kiji0=1;
            }
            $kiji_n--;

        }elsif($send eq "再書き込み"){

            if($edit_day eq substr($kiji[$edit_n*($ds[0]+1)+$ds[2]],15,length($kiji[$edit_n*($ds[0]+1)+$ds[2]]))){
                $kiji[$edit_n*($ds[0]+1)+$ds[3]]=&crlf($comment,1);
                $kiji[$edit_n*($ds[0]+1)+$ds[1]]=$title;
            }else{
                $next_page=3;
                $messege="エディットする日記データ枠が見つかりませんでした。";
            }

        }elsif($send eq "書き込み" || $send eq "改ページ&書き込み"){
            &chpagemode;
            if($comment ne ""){$next_page=0;}else{$next_page=3;$messege="コメントを入れてください";}

            if($kubun ne ""){
                @dmy=split(",",$kubun);
                $dmy=$iconwildcard;
                $dmy=~s/\*/$dmy[0]/g;
                if($dmy[0] ne $dmy[1]){$img="<IMG SRC=\"$dmy\" ALT=\"$dmy[1]\">";}else{$img="<IMG SRC=\"$dmy\">";}
            }else{$img="";}
            if($kiji[($kiji_n-1)*($ds[0]+1)+$ds[2]] eq $datenow){
                # 今日の日付に追記
                $kiji[($kiji_n-1)*($ds[0]+1)+$ds[3]]=$kiji[($kiji_n-1)*($ds[0]+1)+$ds[3]]."<BR>$img".&crlf($comment,1);
            }else{
                # 改めて今日のデータを書き込み
                if($title eq ""){
                    $next_page=3;$messege="タイトルを入れてください";
                }else{
                    # 改頁の場合の処理はここで行う!
                    if($kiji_n >0){
                        if($send eq "改ページ&書き込み"){
                            &page_change;# 手動
                        }else{
                            $lastday=$kiji[($kiji_n-1)*($ds[0]+1)+$ds[2]];# 前回の記事
                            if    ($pagechange == 1 && &week_num(substr($datenow,3,8),5) != &week_num(substr($lastday,3,8),5)){
                                 &page_change;# 日曜毎
                            }elsif($pagechange == 2 && &week_num(substr($datenow,3,8),4) != &week_num(substr($lastday,3,8),4)){
                                 &page_change;# 月曜毎
                            }elsif($pagechange == 3 && substr($lastday,3,6) ne substr($datenow,3,6)){
                                 &page_change;# 月毎
                            }elsif($pagechange == 4 && $kiji_n >= $pagechange_no){
                                 &page_change;# 記事数毎
                            }
                        }
                    }

                    # 新しい日記データ枠の追加
                    if($kiji0 == 1){@kiji=();$kiji_n=0;}
                    push(@kiji,@aday);
                    $kiji0=0;
                    $kiji[$kiji_n*($ds[0]+1)]=$kiji[$kiji_n*($ds[0]+1)].'<A NAME="page_bottom">';
                    if($kiji_n > 0){$kiji[($kiji_n-1)*($ds[0]+1)]=$aday[0];}
                    $kiji[$kiji_n*($ds[0]+1)+$ds[3]]=$img.&crlf($comment,1);
                    $kiji[$kiji_n*($ds[0]+1)+$ds[1]]=$title;
                    $kiji[$kiji_n*($ds[0]+1)+$ds[2]]=$datenow;
                    $kiji_n++;
                }
            }
        }
    }
}

#--------------------↓ページの表示----------------------
print "Content-type: text/html\n\n";
    if($next_page==0){
        if($send eq "書き込み" || $send eq "改ページ&書き込み" || $send eq "再書き込み" || $send eq "削除"|| $send eq "スキン取り込み"){
            $err1=&html_write($datafile);
            if($err1 == 1){$messege="ファイル$datafileが開けませんでした。ファイル属性等をご確認ください。";$next_page=3};
        }
        if($next_page == 0){&page0;}
    }
    elsif($next_page==1){&page1;}
    elsif($next_page==2){&page2;}
    elsif($next_page==4){&page4;}
    if($next_page==3){&page3;}
exit();

#===================↓ここからサブルーチン=============================
sub page0{

    # スキン管理
    if(-e $skinselfile){
        # スキン管理ファイル読み込み
        $errinp=&fileinput($skinselfile,"skinfiles");
    }else{
        # スキン選択ファイル検索
        @skinfiles=<${skinwildcard}>;
        $skinfiles_n=@skinfiles;
        $apos=index $skinwildcard,"*";
        $alen=length($skinwildcard)-1;
        for($i=0;$i<$skinfiles_n;$i++){$skinfiles[$i]=substr($skinfiles[$i],$apos,length($skinfiles[$i])-$alen).",";}
        &fileout($skinselfile,"skinfiles",1);
    }

    # アイコン管理
    if(-e $iconselfile){
        # アイコン管理ファイル読み込み
        $errinp=&fileinput($iconselfile,"iconfiles");
    }else{
        # アイコン選択ファイル検索
        @iconfiles=<${iconwildcard}>;
        $iconfiles_n=@iconfiles;
        $apos=index $iconwildcard,"*";
        $alen=length($iconwildcard)-1;
        for($i=0;$i<$iconfiles_n;$i++){$iconfiles[$i]=substr($iconfiles[$i],$apos,length($iconfiles[$i])-$alen).",";}
        &fileout($iconselfile,"iconfiles",1);
    }

&chpagemode;
print <<"HIA1";
$hedder
HIA1
print join("\n",@kiji);
print <<"HIA2";
$footer

$p_style
<SPAN STYLE="font-size:14pt;font-weight:bold">入力用フォーム</SPAN>
    [(<A HREF="$datafile"><FONT COLOR="blue">◎</FONT></A>)←お客様のページへ]<BR>
<!------------------------------------------>
<FORM ACTION="$me" METHOD="POST">
    <INPUT TYPE="hidden" NAME="kpass" VALUE="$kpass">
    <INPUT TYPE="hidden" NAME="pageNo" VALUE="0">
    今日 <INPUT TYPE="text" SIZE="30" NAME="edit_day" VALUE="$today"><BR><BR>
    タイトル<INPUT TYPE="text" NAME="title" SIZE="40" MAXLENGTH="50">

HIA2

# アイコンセレクター
    print " アイコンの選択\n<SELECT NAME=\"kubun\" >\n";
        print "    <OPTION  VALUE=\"\">無し\n";
    foreach $dmy (@iconfiles){
        @dmy=split(",",$dmy);
        $dmy[1]=~ s/\s//g; # メタ文字を削除
        if($dmy[1] eq ""){$dmy[1]=$dmy[0];}
        print "    <OPTION  VALUE=\"$dmy[0],$dmy[1]\">".$dmy[1]."\n";
    }
    print "</SELECT><BR>\n";


print <<"HIA3";

コメント<BR> <TEXTAREA NAME="comment" COLS="60" ROWS="10" WRAP="soft"></TEXTAREA><BR>
    <INPUT TYPE="submit"  NAME="send" VALUE="書き込み">
    <INPUT TYPE="reset"  VALUE="リセット">
    <INPUT TYPE="submit"  NAME="send" VALUE="再表\示">
    <INPUT TYPE="submit" NAME="send"  VALUE="改ページ&書き込み">
HIA3

if($pagechange==4){print "($pagechange_no記事毎)<BR><BR>";}
else{print "($pagechan_mode[$pagechange])<BR><BR>";}

if($kiji0 == 0){
    print "訂正したい日付\n<SELECT NAME=\"edit_n\" >\n";
    for($i=$kiji_n-1;$i>=0;$i--){
        print "    <OPTION  VALUE=\"$i\">$kiji[$i*($ds[0]+1)+$ds[2]]\n";
    }
    print "</SELECT>\n";
    print ' <INPUT TYPE="submit"  NAME="send" VALUE="エディット"><BR><BR>'."\n";
}

# スキンセレクター
    print "スキンセレクター\n<SELECT NAME=\"skin\" >\n";
    foreach $dmy (@skinfiles){
        @dmy=split(",",$dmy);
        $dmy[1]=~ s/\s//g; # メタ文字を削除
        if($dmy[1] eq ""){$dmy[1]=$dmy[0];}
        print "    <OPTION  VALUE=\"$dmy[0]\">".$dmy[1]."\n";
    }
    print "</SELECT>\n";

print <<"HIA4";

    <INPUT TYPE="submit" NAME="send"  VALUE="スキン取り込み"><BR><BR>
    <INPUT TYPE="submit" NAME="send"  VALUE="アイコン・スキン・改ページ管理">
</FORM>
HIA4
&pbottom;
}

sub page1{
&phed('FREE DIARY エディット','エディット用フォーム');
print <<"HIA1";
<FORM ACTION="$me" METHOD="POST">
    <INPUT TYPE="hidden" NAME="kpass" VALUE="$kpass">
    <INPUT TYPE="hidden" NAME="pageNo" VALUE="1">
    <INPUT TYPE="hidden" NAME="edit_n" VALUE="$edit_n">
    日付 <INPUT TYPE="text" NAME="edit_day" VALUE="$edit_day"><BR>
タイトル<INPUT TYPE="text" NAME="title" SIZE="50" MAXLENGTH="50" VALUE="$title"><BR>
コメント<BR> <TEXTAREA NAME="comment" COLS="60" ROWS="10" WRAP="soft">$comment</TEXTAREA><BR>
    <INPUT TYPE="submit"  NAME="send" VALUE="再書き込み"> 
    <INPUT TYPE="submit"  NAME="send" VALUE="削除">
 <INPUT TYPE="submit"  NAME="send" VALUE="変更無し"> <INPUT TYPE="reset"  VALUE="リセット"><BR>
</FORM>
HIA1
&pbottom;
}

sub page2{
&phed('FREE DIARY パスワード','パスワード入力フォーム');
print <<"HIA1";
<FORM ACTION="$me" METHOD="POST">
    <INPUT TYPE="hidden" NAME="kpass" VALUE="$kpass">
    <INPUT TYPE="hidden" NAME="pageNo" VALUE="2">
    パスワード(10文字以内) <INPUT TYPE="password" NAME="kpass"  VALUE="$kpass" SIZE="10" MAXLENGTH="10"><BR>
    <INPUT TYPE="submit"  NAME="send" VALUE="ENTER"><BR>
</FORM>
HIA1
&pbottom;
}

sub page3{
&phed('FREE DIARY エラー表示','エラー表示');
print <<"HIA1";
<BR><BR><SPAN STYLE="color:red;font-weight:bold">$messege</SPAN><BR><BR>
ブラウザのbackでお戻りください。<BR>
HIA1
&pbottom;
}

sub page4{
&chpagemode;
$iconmane=join("\n",@iconfiles);
$skinmane=join("\n",@skinfiles);

&phed('FREE DIARY 設定画面','アイコン・スキン・改ページ管理');
print <<"HIA1";
<FORM ACTION="$me" METHOD="POST">
<INPUT TYPE="hidden" NAME="kpass" VALUE="$kpass">
アイコンマネージャ<BR>
<TEXTAREA NAME="iconmanein" COLS="60" ROWS="10" WRAP="soft">
$iconmane
</TEXTAREA><BR>
スキンマネージャ<BR>
<TEXTAREA NAME="skinmanein" COLS="60" ROWS="10" WRAP="soft">
$skinmane
</TEXTAREA><BR>
改頁設定<BR>
<SELECT NAME="pagechange" >
    <OPTION  VALUE="0" $chpage_sel[0]>$pagechan_mode[0]
    <OPTION  VALUE="1" $chpage_sel[1]>$pagechan_mode[1]
    <OPTION  VALUE="2" $chpage_sel[2]>$pagechan_mode[2]
    <OPTION  VALUE="3" $chpage_sel[3]>$pagechan_mode[3]
    <OPTION  VALUE="4" $chpage_sel[4]>$pagechan_mode[4]
</SELECT>
    記事数<INPUT TYPE="text" NAME="pagechange_no" SIZE="5" MAXLENGTH="5" VALUE="$pagechange_no"> 
<BR><BR>
<INPUT TYPE="submit"  NAME="send" VALUE="完了"> 
<INPUT TYPE="submit"  NAME="send" VALUE="変更無し"> 
<INPUT TYPE="reset"  VALUE="リセット"><BR>
</FORM>
HIA1
&pbottom;
}

sub phed{
print <<"HIA1";
<HTML>
<HEAD>
<TITLE>$_[0]</TITLE>
<META HTTP-EQUIV="content-type" CONTENT="text/html;charset=UTF-8" >
</HEAD>
<BODY STYLE="line-height:150%;margin:1.5cm" BGCOLOR="#FFEEEE">
$p_style
<SPAN STYLE="font-size:14pt;font-weight:bold">$_[1]</SPAN><BR><BR>
<!---------------------------------------------->
HIA1
}

sub pbottom{
print <<"HIA1";
<!---------------------------------------------->
$logo
$p_stylee
</BODY></HTML>
HIA1
}

sub pageno_get{
    local $dmy1=index $hedder,"<!-page_NO-->";
    if($dmy1 <= 0){
        $dmy1=index $footer,"<!-page_NO-->";
    }
    $pageno=substr($hedder,$dmy1+13,3);
    $prevfile=$filename_top.sprintf("%03d",$pageno-1).".html";
    $nextfile=$filename_top.sprintf("%03d",$pageno+1).".html";
    return $pageno;
}

sub html_write{
local $newfilename=$_[0];
    $err=0;
   if ( !open (FILE_IO,">${newfilename}") ){
        $err=1;
   }else{
        select(FILE_IO);
        print $hedder;
        print join("\n",@kiji);
        print $footer;
        if($newfilename eq $datafile){print $logo;}
        print "</BODY></HTML>";
        close(FILE_IO);
        select(STDOUT);
    }
    return $err;
}

sub datafile_read{
$datain_n=@datain;

$daydata_p1=&linepos("datain","<!-day_data-->");
$daydata_p2=&linepos("datain","<!-/day_data-->",$daydata_p1);

    # hedderの分離
    $dmy=join("\n",@datain);
    @dmy=split("<!-day_data-->",$dmy);
    $hedder=$dmy[0]."<!-day_data-->";
    $rem=$dmy[1];

    # footerの分離
    @dmy=split("<!-/day_data-->",$rem);
    $footer="\n<!-/day_data-->".$dmy[1];
    $footer=~s/<\/BODY>//g;
    $footer=~s/<\/HTML>//g;
    $footer=~s/${logo}//g;

# データの分離
if($datain[$daydata_p1+2] ne '<DIV style="VISIBILITY: hidden; POSITION: relative">'){
    $kijitop=$daydata_p1+2;
    $kijibottom=$daydata_p2;
    $kiji0=0;
}else{
    $kijitop=$daydata_p1+3;
    $kijibottom=$daydata_p2-1;
    $kiji0=1;
}
$j=0;
for($i=$kijitop;$i<$kijibottom;$i++){
    $kiji[$j]=$datain[$i];
    $j++;
}

$hedder=$hedder."\n$datain[$daydata_p1+1]\n";

# スタイルデータ(@aday)を学習する
$dmy=substr($datain[$daydata_p1+1],13,length($datain[$daydata_p1+1])-13);
@dmy=split(/\)/,$dmy);
@ds=split(/\,/,$dmy[0]);
$j=0;
for($i=0;$i<$ds[0];$i++){
    $aday[$j]=$kiji[$i];
    $j++;
}
$aday[0]=~ s/<A NAME=\"page_bottom\">//g;
$aday[$ds[1]]="";
$aday[$ds[2]]="";
$aday[$ds[3]]="";
$aday[$ds[0]]="";
$dmy1=index $datain[$daydata_p1+1],'"';
$dmy2=index $datain[$daydata_p1+1],'"',$dmy1+1;

$datemode=substr($datain[$daydata_p1+1],$dmy1+1,$dmy2-$dmy1-1);

$kiji_n=@kiji/($ds[0]+1);#記事の個数
if($kiji0==1){$kiji_n=0;}
}

sub shokiset{
    # 日付のセット
    ($sec , $min , $hour, $mday, $mon, $year ,$wday) = localtime();
    $today=&dateformat("y1/m1/d1(w1)",$year+1900,$mon+1,$mday,$wday);
    $datenow =sprintf("<!-%04d%02d%02d%01d-->",$year + 1900, $mon + 1, $mday,$wday).$today;
$datain = <<"HIA1";
<HTML>
<META HTTP-EQUIV="content-type" CONTENT="text/html;charset=UTF-8" >
<HEAD>
<TITLE>FREE DIARY</TITLE>
<STYLE>
<!--
   .title{font-size:110%;color:blue}
   .date{font-size:90%;color:green;text-align:right}
   HR{color:C00000;height:5px}
-->
</STYLE>
</HEAD>
<BODY STYLE="line-height:150%;margin-left:1.5cm;margin-right:1.5cm;margin-top:1.5cm">
<B><!-page_NO-->$start_page</B> <A HREF="#page_bottom">[最新]</A><BR>

<DIV STYLE="text-align:center;font-size:170%">FREE DIARY</DIV>

<!-A HREF="prev_page"&gt;前頁へ&lt;/A-->  <!-A HREF="next_page"&gt;次頁へ&lt;/A--><BR><BR><HR>

<!-day_data-->
<!-day_style(7,1,5,3)"y1/m1/d1(w1)"-->
<SPAN CLASS="title"><A NAME="page_bottom">
初期データ
</SPAN><BR>
コメント:日記CGIの立ち上げ時、もしくは書き込みページ"$datafile"が見つからなかったため、初期データを表\示しています。<BR>問題が無ければ、skinのチェンジ→初期データの消去へお進み下さい。
<BR><DIV CLASS="date">
$datenow
</DIV><HR>

<!-/day_data-->
</BODY></HTML>
HIA1
@datain=split("\n",$datain);
$datain="";
}

sub page_change{
    $next_page=0;
    $pageno=&pageno_get;

    # 新しいファイルネームを設定する
    $newfilename=$filename_top."$pageno.html";

    &hedderjoin;
    $hedder_old=$hedder;

    # 現在のページの内容をLOGファイルに移行する-----------------------
    #次ページのLINKを設定
    for($i=0;$i<2;$i++){
        $hedder=&linkchange($hedder,'<!-A HREF="next_page"&gt;','&lt;/A-->',"<A HREF=\"$datafile\">",'</A>',2);
    }

    &heddersplit;
    $err1=&html_write($newfilename);

    # 一つ古いLOGファイルのLINKを変更----------------------------------
    if(-e $prevfile){
        $errinp=&fileinput($prevfile,"dmys");
        $dmy1=join("\n",@dmys);
        $dmy2="<A HREF=\"$datafile\">";
        $dmy3="<A HREF=\"$newfilename\">";
        $dmy1=~s/${dmy2}/${dmy3}/g;
        @dmys=($dmy1);
        &fileout($prevfile,"dmys",1);
    }

    # 表紙のページを新しく作成する-------------------------------------
    $hedder=$hedder_old;
    $dmy1=index $hedder,'<!-A HREF="prev_page"';

    if($dmy1 >= 0){
        # 前ページのLINKを設定
        for($i=0;$i<2;$i++){
            $hedder=&linkchange($hedder,'<!-A HREF="prev_page"&gt;','&lt;/A-->',"<A HREF=\"$newfilename\">",'</A>',2);
        }
    }else{
        $hedder=~s/<A HREF=\"$prevfile\">/<A HREF=\"$newfilename\">/g;
    }

    $dmy1="<!-page_NO-->".$pageno;
    $dmy2="<!-page_NO-->".sprintf("%03d",$pageno+1);
    $hedder=~s/${dmy1}/${dmy2}/g;

    &heddersplit;
    @kiji=();
    @kiji=@aday;
    unshift(@kiji,'<DIV style="VISIBILITY: hidden; POSITION: relative">');
    push(@kiji,"</DIV>");
    $kiji0=1;
    $err1=&html_write($datafile);
    if($err1 == 1){$messege="ファイル$datafileが開けませんでした。ファイル属性等をご確認ください。";$next_page=3};
}

sub skin_icon_set{
    #-------------------------------------------------------------
    # スキン管理
    if(-e $skinselfile){
        # スキン管理ファイル読み込み
        $errinp=&fileinput($skinselfile,"skinfiles");

    }else{
        # スキン選択ファイル検索
        $wildcard="skin*.html";# スキンファイルのワイルドカード
        @skinfiles=<${wildcard}>;

        # スキン実数チェック
        $skinfiles_n=@skinfiles;
        for($i=0;$i<$skinfiles_n;$i++){
            $skinfiles[$i]=$skinfiles[$i].",";
        }
        &fileout($skinselfile,"skinfiles",1);
    }

    # アイコン管理
    if(-e $iconselfile){
        # アイコン管理ファイル読み込み
        $errinp=&fileinput($iconselfile,"iconfiles");

    }else{
        # アイコン選択ファイル検索
        $wildcard="./icon/*";# アイコンファイルのワイルドカード
        @iconfiles=<${wildcard}>;

        # アイコン実数チェック
        $iconfiles_n=@iconfiles;
        for($i=0;$i<$iconfiles_n;$i++){
            $iconfiles[$i]=substr($iconfiles[$i],7,length($iconfiles[$i])-7).",";
        }
        &fileout($iconselfile,"iconfiles",1);
    }
}

sub chpagemode{
     $errinp=&fileinput($chpagefile,"chpage");
     $pagechange=$chpage[0];
     $chpage_sel[$pagechange]="SELECTED";
     $pagechange_no=$chpage[1];
}
sub matching{
# 2行2列のデータベースのマッチングの様なサブルーチン
# $_[0]に(key_word,その情報)という形のデータの配列名、$_[1]に新しいデータ名を読み込んでいる。
    local $old_dataname=$_[0];
    local $new_keyname=$_[1];
    local @key=();
    local @info=();
    local $info;
    local @dmy=();

    # データ(csv)をカンマで分離する
    local $data_o_n=@$old_dataname;
    for($i=0;$i<$data_o_n;$i++){
        @dmy=split(",",$$old_dataname[$i]);
        $key[$i]=$dmy[0];
        $info[$i]=$dmy[1];
    }
    # 新しいkey_wordに古いkeyと一致するものがあれば、情報を付け加える
    local $data_n_n=@$new_keyname;
    for($i=0;$i<$data_n_n;$i++){
        $info="";
        for($j=0;$j<$data_o_n;$j++){
            if($$new_keyname[$i] eq $key[$j]){$info=$info[$j];last;}
        }
        $$new_keyname[$i]=$$new_keyname[$i].",".$info;
    }
    return @$new_keyname;
}
#-------------------------------------------------------------
sub skinin{
    # スキンファイルの入力
    $errinp=&fileinput($stylefile,"styledata");
    if($errinp==1){$messege=$messege."スキン定義ファイル$stylefileが開けません。<BR>"
    }else{

    $styledata_n=@styledata;
    $styledata=join("\n",@styledata);

    # スキン定義ファイルの外観チェック
    $dmy1=index $styledata,'<!-day_data-->';
    $dmy2=index $styledata,'<!-/day_data-->',$dmy1;
    $dmy3=index $styledata,'$page_NO';
    $dmy4=index $styledata,'<A HREF="prev_page">';
    $dmy5=index $styledata,'<A HREF="next_page">';

    if($dmy1<0){$messege=$messege."スキン定義ファイル$stylefileに&lt;!-day_data--&gt;が有りません。<BR>"}
    if($dmy2<0){$messege=$messege."スキン定義ファイル$stylefileに&lt;!-/day_data--&gt;が有りません。<BR>"}
    if($dmy3<0){$messege=$messege."スキン定義ファイル$stylefileに\$page_NOが有りません。<BR>"}
    if($dmy4<0){$messege=$messege."スキン定義ファイル$stylefileに&lt;A HREF=\"prev_page\"&gt;が有りません。<BR>"}
    if($dmy5<0){$messege=$messege."スキン定義ファイル$stylefileに&lt;A HREF=\"next_page\"&gt;が有りません。<BR>"}

    if($messege eq ""){
    # hedderの分離
    @dmy=split("<!-day_data-->",$styledata);
    $hedder=$dmy[0]."<!-day_data-->";
    $rem=$dmy[1];

    # footerの分離
    @dmy=split("<!-/day_data-->",$rem);
    $footer="\n<!-/day_data-->".$dmy[1];
    $footer=~s/<\/BODY>//g;
    $footer=~s/<\/HTML>//g;
    $adaystyle=$dmy[0];
    $adaystyle=~s/\n//g;
    # 複数連続した半角スペースを1つに減らす
    $sp2="  ";$sp=" ";
    while((index $adaystyle,$sp2)>=0){$adaystyle=~s/${sp2}/${sp}/g;}

    &hedderjoin;

    # ページ番号位置のマークをつける(ページ番号は頁内に2箇所まで)
    $hedder=~s/\$page_NO/<!-page_NO-->$pageno/g;


    # 前頁リンクと次頁リンクはヘッダもしくはフッタどちらかに2つずつ置ける。

    # 前頁へのリンクの書式を変更する
    if($prevlink_on==0){
        for($i=0;$i<2;$i++){
            $hedder=&linkchange($hedder,'<A HREF="prev_page">','</A>','<!-A HREF="prev_page"&gt;','&lt;/A-->',1);
        }
    }else{
        $hedder=~s/prev_page/${prevfile}/g;
    }

    # 次頁へのリンクの書式を変更する
    if($nextlink_on==0){
        for($i=0;$i<2;$i++){
            $hedder=&linkchange($hedder,'<A HREF="next_page">','</A>','<!-A HREF="next_page"&gt;','&lt;/A-->',1);
        }
    }else{
        $hedder=~s/next_page/${nextfile}/g;
    }
    &heddersplit;

    # adayの作成

    #  $title,$date"...",$commentの前後で行を分離する

    $dmy1=index $styledata,'$title';
    $dmy2=index $styledata,'$date"';
    $dmy3=index $styledata,'"',$dmy2;
    $dmy4=index $styledata,'$comment';

    if($dmy1<0){$messege=$messege."スキン定義ファイル$stylefileに\$titleが有りません。<BR>";}
    if($dmy2<0){$messege=$messege."スキン定義ファイル$stylefileに\$date\"が有りません。<BR>";}
    if($dmy3<0){$messege=$messege."スキン定義ファイル$stylefileで\$date\"のダブルコーテーションが閉じていません。<BR>";}
    if($dmy4<0){$messege=$messege."スキン定義ファイル$stylefileに\$commentが有りません。<BR>";}

    $dmy1=index $adaystyle,"\$date\"";
    $dmy2=index $adaystyle,'"',$dmy1+7;
    $datemode=substr($adaystyle,$dmy1+6,$dmy2-$dmy1-6);
    if((index $datemode,"\$comment")>=0||(index $datemode,"\$title")>=0||$dmy2<0){$messege=$messege."スキン定義ファイル$stylefileで\$date\"のダブルコーテーションが閉じていません。<BR>";}
    $adaystyle=substr($adaystyle,0,$dmy1)."<>".substr($adaystyle,$dmy1,$dmy2-$dmy1+1)."<>".substr($adaystyle,$dmy2+1,length($adaystyle)-$dmy2-1);

    $adaystyle=~s/\$title/<>\$title<>/g;
    $adaystyle=~s/\$comment/<>\$comment<>/g;
    @aday=split(/<>/,$adaystyle);

    # @dsを作成する
    $ds[0]=@aday;
    $ds[1]=&linepos("aday",'$title');
    $ds[3]=&linepos("aday",'$comment');
    for($i=0;$i<$ds[0];$i++){
        if(substr($aday[$i],0,5) eq '$date'){$ds[2]=$i;}
    }
    $aday[$ds[1]]="";
    $aday[$ds[2]]="";
    $aday[$ds[3]]="";
    $aday[$ds[0]]="";

    # 一日分データの位置と日付の表示スタイルを書式に書き出す。
    $day_style="<!-day_style($ds[0],$ds[1],$ds[2],$ds[3])\"$datemode\"-->";
    }
    }
}
sub linkchange{
# LINKのチェンジ用サブルーチン。$_[0]を$_[1]と$_[2]で挟まれた部分を$_[3]と$_[4]で挟んだものに置き換える。間の部分は、タグの括弧の置き換えを行う。
# 置き換えの方法は、$_[5]が0で不変、1で<>から&lt;&gt;、2で&lt;&gt;から<>へ
    local $dmy=$_[0];
    local $pos1=index $dmy,$_[1];
    if($pos1>=0){
        local $pos2=index $dmy,$_[2],$pos1;
        local $dmy0=substr($dmy,0,$pos1);
        local $dmy2=substr($dmy,$pos1+length($_[1]),$pos2-$pos1-length($_[1]));
        local $dmy4=substr($dmy,$pos2+length($_[2]),length($dmy)-$pos2-length($_[2]));
        if($_[5]==1){
            $dmy2=~s/>/&gt;/g;
            $dmy2=~s/</&lt;/g;
        }elsif($_[5]==2){
            $dmy2=~s/&gt;/>/g;
            $dmy2=~s/&lt;/</g;
        }
        $dmy=$dmy0.$_[3].$dmy2.$_[4].$dmy4;
    }
    return $dmy;
}
sub hedderjoin{
    $hedder=$hedder."hedderfooterjoint".$footer;
}
sub heddersplit{
    local @dmy=split("hedderfooterjoint",$hedder);
    $hedder=$dmy[0];
    $footer=$dmy[1];
}
sub linepos{
    $hensuumei=$_[0];
    $findwords=$_[1];
    $start_position=$_[2];
    $end_position=$_[3];
    $subout=-1;

    if($start_position eq ""){$start_position=0;}
    if($end_position eq ""){$end_position=@$hensuumei;}

    if($findwords ne ""){
        for($i=$start_position;$i<$end_position;$i++){
            if($$hensuumei[$i] eq $findwords){$subout=$i;last;}
        }
    }
    return $subout;
}
sub dateformat{
# 日付表示をモードの書式によって切り替えるためのサブルーチンです。
#
# コード表
# y1:"2003",y2:"03",y3:"2003",y4:"03",y5:"二〇〇三"
# m1:"04",m2:"4",m3:"04",m4:"4",m5:"April",m6:"Apr",m7:"四"
# d1:"06",d2:"6",d3:"06",d4:"6",d5:"六"
# w1:"日",w2:"Sunday",w3:"Sun"
#
# 例)y1/m1/d1(w1)→2003/04/06(日) | w2 d1 m5,y1→Sunday 06 April,2003 | y5年 m7月 d5日(w1曜日)→二〇〇三年 四月 六日(日曜日)|等

    @big=("0","1","2","3","4","5","6","7","8","9");
    @kanji=("〇","一","二","三","四","五","六","七","八","九");
    @April=("","January","February","March","April","May","June","July","August","September","November","October","December");
    @Apr=("","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Nov","Oct","Dec");
    @nichi=("日","月","火","水","木","金","土");
    @Sunday=("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");
    @Sun=("Sun","Mon","Tue","Wed","Thu","Fri","Sat");

    local $datehyouji=$_[0];# コードによる日付表示の指示
    local $year=$_[1];
    local $month=$_[2];
    local $day=$_[3];
    local $week=$_[4];
    local $pos;
    local $mode;
    local $hyouji;
    local $i;

    $pos=index $datehyouji,"y";
    if($pos>=0){
        $mode=substr($datehyouji,$pos+1,1);
        if($mode==2){$hyouji=substr($year,2,2);}
        elsif($mode==3){$hyouji=&baikaku_num($year);}
        elsif($mode==4){$hyouji=&baikaku_num(substr($year,2,2));}
        elsif($mode==5){$hyouji=&kanji_num($year);}
        else{$hyouji=$year;}
        $datehyouji=substr($datehyouji,0,$pos).$hyouji.substr($datehyouji,$pos+2,length($datehyouji)-$pos-2);
    }

    $pos=index $datehyouji,"m";
    if($pos>=0){
        $month=sprintf("%02d",$month);

        $mode=substr($datehyouji,$pos+1,1);
        if($mode==2){
            if(substr($month,0,1) eq "0"){$hyouji=substr($month,1,1);}else{$hyouji=$month;}
        }
        elsif($mode==3){$hyouji=&baikaku_num($month);}
        elsif($mode==4){
            if(substr($month,0,1) eq "0"){$month=substr($month,1,1);}
            $hyouji=&baikaku_num($month);
        }
        elsif($mode==5){$hyouji=$April[$month];}
        elsif($mode==6){$hyouji=$Apr[$month];}
        elsif($mode==7){
            if(substr($month,0,1) eq "0"){$month=substr($month,1,1);}
            $hyouji=&kanji_num($month);
        }

        else{$hyouji=$month;}
        $datehyouji=substr($datehyouji,0,$pos).$hyouji.substr($datehyouji,$pos+2,length($datehyouji)-$pos-2);
    }

    $pos=index $datehyouji,"d";
    if($pos>=0){
        $day=sprintf("%02d",$day);
        $mode=substr($datehyouji,$pos+1,1);
        if($mode==2){
            if(substr($day,0,1) eq "0"){$hyouji=substr($day,1,1);}else{$hyouji=$day;}
        }
        elsif($mode==3){$hyouji=&baikaku_num($day);}
        elsif($mode==4){
            if(substr($day,0,1) eq "0"){$day=substr($day,1,1);}
            $hyouji=&baikaku_num($day);
        }
        elsif($mode==5){
            if(substr($day,0,1) eq "0"){$day=substr($day,1,1);}
            $hyouji=&kanji_num($day);
        }
        else{$hyouji=$day;}
        $datehyouji=substr($datehyouji,0,$pos).$hyouji.substr($datehyouji,$pos+2,length($datehyouji)-$pos-2);
    }

    $pos=index $datehyouji,"w";
    if($pos>=0){
        $mode=substr($datehyouji,$pos+1,1);
        if($mode==2){$hyouji=$Sunday[$week];}
        elsif($mode==3){$hyouji=$Sun[$week];}
        else{$hyouji=$nichi[$week];}
        $datehyouji=substr($datehyouji,0,$pos).$hyouji.substr($datehyouji,$pos+2,length($datehyouji)-$pos-2);
    }
    return $datehyouji;
}
sub baikaku_num{
    local $num=$_[0];
    local $len=length($num);
    local $output="";
    local $i;
    for($i=0;$i<$len;$i++){$output=$output.$big[substr($num,$i,1)]}
    return $output;
}
sub kanji_num{
    local $num=$_[0];
    local $len=length($num);
    local $output="";
    local $i;
    for($i=0;$i<$len;$i++){$output=$output.$kanji[substr($num,$i,1)]}
    return $output;
}
sub week_num{
# 週番号を計算するプログラム
# $_[0]:yyyymmdd,$_[1]:4で月曜日切り替え、5で日曜日切り替え

use Time::Local;
return int((    (    timelocal(0, 0, 0, substr($_[0],6,2), substr($_[0],4,2)-1, substr($_[0],0,4))    -54000)/86400+$_[1]    )/7);
}

sub crlf{
    $dmy = $_[0] ;

    # 改行制御(1:書き込み側 \r\n等→<BR>、2:エディット側<BR>→\n)
    if($_[1] == 1){
        $dmy =~ s/\r\n/\n/g; # Windows系(CR,LF)->LF
        $dmy =~ s/\r/\n/g;   # Mac 系(CR)->LF
        $dmy =~ s/\n/<BR>/g; # LF -> <BR>
    }else{
        $dmy =~ s/<BR>/\n/g; # <BR> -> LF
    }
    return $dmy;
}
#*****************************************************************
#=================================================================
# ファイル入力サブルーチン__ &fileinput(入力ファイル名,変数名)
#   ※サブルーチンを呼ぶ前に、@変数名=();など、配列をあらかじめ作っておく必要があります。

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' # # #
##############################################################
sub read_input {
    $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);
        $FORM{$name} = $value;
    }
    %FORM;
}
__END__