#!/usr/local/bin/perl #【 名  称 】予約状況カレンダー #【 説  明 】予約状況 #【 file 名 】yoyaku.lzh #【 作  者 】hige hige@deneb.freemail.ne.jp #【 作者HP 】お得のかんづめ http://www.dab.hi-ho.ne.jp/appletea/otokukan/ #【 動作環境 】Perl5 #【 library 】jcode.plが必要 #【 作成月日 】2001/02/07 #【 種  別 】フリーソフトウェア #【 著 作 権 】著作権はhigeが保有します。 #【 転載条件 】禁止 ################################################################################ # # 外部ライブラリ:パスは場合によって変更 # ################################################################################ require './jcode.pl'; ################################################################################ # # 必ず変更する設定 # ################################################################################ #HOME(予約状況から戻るときの頁) $home = "http://www.kurama-onsen.co.jp/index.html"; #管理パスワード $pwd = 'naritabanka2sai'; ################################################################################ # # 場合によって変更する設定:デザイン # ################################################################################ #カレンダーの幅(%指定する場合は type 1 を参考に設定してください #$calwidth = "100%" #type 1 #$calwidth = 400; #type 2 $calwidth = 475; # add - ver1.1 start #1日の状態の数(例えば午前と午後を別々に管理するとき->2) $periods = 1; #$periods = 2; #1日の状態の数が複数のときにそれを識別するための文字列が必要か? $showpname = 0; #$showpname = 1; #1日の状態の数が複数のときにそれを識別するための文字列 #($showpname = 0 の時は設定不要) #$periodname[0] = '午前'; #$periodname[1] = '午後'; # add - ver1.1 end #背景色 $bgcolor = "#FFFFFF"; #カレンダーの月部分 $caltitle_color = "#FEA616"; #平日の色 $col[1] = "#FFFFFF"; $col[2] = "#FFFFFF"; $col[3] = "#FFFFFF"; $col[4] = "#FFFFFF"; $col[5] = "#FFFFFF"; #土曜日の色 $col[6] = "#D8E6FF"; #日曜日の色 $col[0] = "#FFE6D9"; ################################################################################ # # 場合によって変更する設定:その他 # ################################################################################ #出力コード $output_code = "sjis"; #データファイル $datafile = "./yoyaku/yoyaku.txt"; #文字列ファイル $strfile = "./yoyaku/yoyakustr.txt"; #ロック用のディレクトリ名 $lockdir = "./yoyaku/yoyakulock"; ################################################################################ # 変更不可の設定 $self = $ENV{'SCRIPT_NAME'}; #曜日文字列 @wdaystr= ('日', '月', '火', '水', '木', '金', '土'); #日数 @days_leap = (0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); @days_normal = (0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); #著作権 $copyright = << "EOM";
\予\約\状\況\カ\レ\ン\ダ\ー\ v1.1
<
\お\得\の\か\ん\づ\め\ >
EOM ################################################################################ # # 実行開始 # ################################################################################ #実行開始 &main; exit; ################################################################################ # # メイン # ################################################################################ #メイン関数 sub main { #フォームデータのデコード &form_decode; #処理分岐 if ($FORM{'mode'} eq 'show') { &show; } elsif ($FORM{'mode'} eq 'edit') { &edit; } elsif ($FORM{'mode'} eq 'save') { &save; } elsif ($FORM{'mode'} eq 'editstr') { &editstr; } elsif ($FORM{'mode'} eq 'savestr') { &savestr; } elsif ($FORM{'mode'} eq 'mng') { &mng; # add - ver1.1 start } elsif ($FORM{'mode'} eq 'ssishow') { &ssishow; } elsif ($FORM{'mode'} eq '') { &mng; # add - ver1.1 end } else { &error("CGIに渡されたパラメータが不正です。"); } } ################################################################################ # # 汎用的な関数 # ################################################################################ #フォームデータのデコード sub form_decode { local($form); local(@pairs); local($name, $value); if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $form, $ENV{'CONTENT_LENGTH'}); } else { $form = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$form); foreach (@pairs) { ($name, $value) = split(/=/, $_); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/>/>/g; $value =~ s/ 300) { rmdir($lockdir); } } elsif ($i < 6) { sleep(1); } else { $rc = 0; last; } $i++; } return $rc; } #ロック解除 sub unlock { local($lockdir) = @_; rmdir($lockdir); } ################################################################################ # # プログラム内で共通に使えそうな関数 # ################################################################################ #対象年月を取得 sub get_target_month { local($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst); #フォームで渡された年月を分解 ($year, $month) = split(/\//, $FORM{'month'}); #適正範囲内であればそのまま採用(2000年〜2099年を想定) if (($year > 1999) && ($year < 2100) && ($month > 0) && ($month < 13)) { return ($year, $month); } #適正範囲内でない場合、現在の年月日を採用 $ENV{'TZ'} = "JST-9"; ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(time); $year = 1900 + $year; $month++; return ($year, $month); } #状態文字列を読み込む sub read_strfile { local($stat, $str, $longstr); #ファイルを開く open(IN, $strfile); while () { #デコード ($stat, $str, $longstr) = split(/<>/,$_); #該当データを設定 $STATUSSTR[$stat] = $str; $STATUSSTRL[$stat] = $longstr; } close(IN); } #古いデータを削除する sub delete_old_data { local($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst); #現在の日時を取得 $ENV{'TZ'} = "JST-9"; ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(time); $year = 1900 + $year; $month++; #yyyymmddの形に変換 local($datevalue) = $year * 10000 + $month * 100 + $mday; #ロック if (!&lock($lockdir)) { &error("ロック処理に失敗しました。"); return; } #現在のデータを読み込む(古いデータは除く) local($y, $m, $d, $stat); open(IN, $datafile); while () { #デコード ($y, $m, $d, $stat) = split(/<>/, $_); #該当データを設定 if (($y * 10000 + $m * 100 + $d) >= $datevalue) { push(@lines, $_); } } close(IN); #ファイルを更新 open(OUT, ">$datafile"); print OUT @lines; close(OUT); #ロック解除 &unlock($lockdir); } ################################################################################ # # エラー表示 # ################################################################################ #エラー sub error { local($msg) = @_; local($html); #メッセージの処理 if ($msg ne '') { $msg = "エラーメッセージ:
$msg"; } #HTML作成 $html = << "EOM"; エラー
CGIエラーが発生しました。
ブラウザの「戻る」で前の画面に戻ってください。

$msg EOM #表示 &print_html($html); } ################################################################################ # # 予約表示 # ################################################################################ #予約表示 sub show { local($html); local($calender); #古いデータを削除 &delete_old_data; #対象年月を取得 local($year, $month) = &get_target_month(); #前後の月を取得 local($prevyear, $prevmonth) = ($year, $month-1); local($nextyear, $nextmonth) = ($year, $month+1); if ($prevmonth == 0) { $prevyear--; $prevmonth = 12; } if ($nextmonth == 13) { $nextyear++; $nextmonth = 1; } #状態文字列を取得 &read_strfile; #カレンダー表示部を取得 $calender = &get_calender($year, $month, 0); #HTML作成 $html = << "EOM"; $year年$month月\の\予\約\状\況\


カレンダ−内の記号の説明
$STATUSSTR[1] $STATUSSTRL[1] $STATUSSTR[2] $STATUSSTRL[2] $STATUSSTR[3] $STATUSSTRL[3] $STATUSSTR[0] $STATUSSTRL[0] $STATUSSTR[4] $STATUSSTRL[4]
$calender
<<\前\の\月\
\■\予\約\状\況\の\表\示\ \年\/\月\:\
\次\の\月\>>


EOM #表示 &print_html($html); } #カレンダー表示部を取得 sub get_calender { local($html) = ''; local($year, $month, $edit) = @_; local($day); local($i, $j, $k); local($days); local($firstwday); local($lastwday); #対象データを取得 &read_datafile($year, $month); #日数を取得 $days = &get_days($year, $month); #最初と最後の曜日を取得 $firstwday = &get_wday($year, $month, 1); $lastwday = &get_wday($year, $month, $days); #カレンダーの枠の形に合わせて、隙間部分の日を-1で初期化 for ($i = 0; $i < $firstwday; $i++) { $calday[$i] = -1; } for ($i = 0; $i < $days; $i++) { $calday[$firstwday + $i] = $i+1; } for ($i = 0; $i < 6 - $lastwday; $i++) { $calday[$firstwday + $days + $i] = -1; } $caldays = $firstwday + $days + (6-$lastwday); #テーブル開始 $html .= "\n"; $html .= "\n"; #曜日名 $html .= "\n"; for ($i = 0; $i < 7; $i++) { $html .= "\n"; } $html .= "\n"; #週ごとにHTML作成 for ($i = 0; $i < $caldays / 7; $i++) { #日付表示 $html .= "\n"; for ($j = 0; $j < 7; $j++) { #日付を取得 $day = $calday[$i * 7 + $j]; #正の日付なら普通に表示・負なら隙間部分として処理 if ($day > 0) { $html .= "\n"; } else { $html .= "\n"; } } $html .= "\n"; #予約状況表示 $html .= "\n"; for ($j = 0; $j < 7; $j++) { #日付を取得 $day = $calday[$i * 7 + $j]; #正の日付なら普通に表示・負なら隙間部分として処理 if ($day > 0) { # add - ver1.1 start @stats = split(/;/, $STATUS[$day]); # add - ver1.1 end #編集モード以外は表示するだけ、編集モード時はコンボボックスで表示 if (!$edit) { # del - ver1.1 start # $html .= "\n"; # del - ver1.1 end # add - ver1.1 start $html .= "\n"; # add - ver1.1 end } else { # del - ver1.1 start # #コンボボックス開始 # $html .= "\n"; # del - ver1.1 end # add - ver1.1 start $html .= "\n"; # add - ver1.1 end } } else { $html .= ""; } } $html .= "\n"; } #テーブル終了 $html .= "
$year年$month月
$wdaystr[$i]
$day 
$STATUSSTR[$STATUS[$day]]"; for ($l = 0; $l < $periods; $l++) { if ($showpname) { $html .= ""; } $html .= ""; } $html .= "
$periodname[$l]$STATUSSTR[$stats[$l]]
"; for ($l = 0; $l < $periods; $l++) { if ($l == 0) { $selname = "stat$day"; } else { $selname = "stat$day-$l"; } $html .= "$periodname[$l]
"; } $html .= "
 
\n"; return $html; } #対象データを取得 sub read_datafile { local($year, $month) = @_; local($y, $m, $d, $stat); local($i); #データを初期化 for ($i = 1; $i < 32; $i++) { $STATUS[$i] = 0; } #ファイルを開く open(IN, $datafile); while () { #デコード ($y, $m, $d, $stat) = split(/<>/,$_); #該当データを設定 if (($y == $year) && ($m == $month)) { $STATUS[$d] = $stat; } } close(IN); } # add - ver1.1 start ################################################################################ # # 予約表示(SSIバージョン) # ################################################################################ #予約表示 sub ssishow { local($html); local($calender); #古いデータを削除 &delete_old_data; #対象年月を取得 local($year, $month) = &get_target_month(); #前後の月を取得 local($prevyear, $prevmonth) = ($year, $month-1); local($nextyear, $nextmonth) = ($year, $month+1); if ($prevmonth == 0) { $prevyear--; $prevmonth = 12; } if ($nextmonth == 13) { $nextyear++; $nextmonth = 1; } #状態文字列を取得 &read_strfile; #カレンダー表示部を取得 $calender = &get_calender($year, $month, 0); #HTML作成 $html = $calender; #表示 &print_html($html); } # add - ver1.1 end ################################################################################ # # 予約編集 # ################################################################################ #予約編集 sub edit { local($html); local($calender); #パスワードチェック if ($FORM{'pwd'} ne $pwd) { &error("パスワードが違います。"); return; } #対象年月を取得 local($year, $month) = &get_target_month(); #状態文字列を取得 &read_strfile; #カレンダー表示部を取得 $calender = &get_calender($year, $month, 1); #HTML作成 $html = << "EOM"; $year年$month\月\の\予\約\状\況:\編\集\モ\ー\ド\

\戻\る\

\予\約\状\況\一\覧\:編\集\モ\ー\ド\
$STATUSSTR[1]$STATUSSTRL[1]
$STATUSSTR[2]$STATUSSTRL[2]
$STATUSSTR[3]$STATUSSTRL[3]
$STATUSSTR[0]$STATUSSTRL[0]
$STATUSSTR[4]$STATUSSTRL[4]
$calender

$copyright
EOM #表示 &print_html($html); } ################################################################################ # # 予約保存 # ################################################################################ #予約保存 sub save { local($html); local(@lines); #パスワードチェック if ($FORM{'pwd'} ne $pwd) { &error("パスワードが違います。"); return; } #対象年月を取得 local($year, $month) = &get_target_month(); #日数を取得 local($days) = &get_days($year, $month); #日数分のデータを書き込み可能な書式に変換 local($day); local($tmpline); local($varname); for ($day = 1; $day < $days+1; $day++) { # del - ver1.1 start # $varname = "stat$day"; # $tmpline = "$year<>$month<>$day<>$FORM{$varname}<>\n"; # del - ver1.1 end # add - ver1.1 start $stats = ''; for ($l = 0; $l < $periods; $l++) { if ($l == 0) { $varname = "stat$day"; } else { $varname = "stat$day-$l"; } $stats .= "$FORM{$varname};"; } $tmpline = "$year<>$month<>$day<>$stats<>\n"; # add - ver1.1 end push(@lines, $tmpline); } #ロック if (!&lock($lockdir)) { &error("ロック処理に失敗しました。"); return; } #現在のデータを読み込む(更新対象のデータは除く) local($y, $m, $d, $stat); open(IN, $datafile); while () { #デコード ($y, $m, $d, $stat) = split(/<>/, $_); #該当データを設定 if (($y != $year) || ($m != $month)) { push(@lines, $_); } } close(IN); #ファイルを更新 open(OUT, ">$datafile"); print OUT @lines; close(OUT); #ロック解除 &unlock($lockdir); #管理画面に戻る &mng; } ################################################################################ # # 文字列の編集 # ################################################################################ #文字列の編集 sub editstr { local($html); #パスワードチェック if ($FORM{'pwd'} ne $pwd) { &error("パスワードが違います。"); return; } #状態文字列を取得 &read_strfile; #HTML作成 $html = << "EOM"; \状\態\文\字\列\の\編\集\

\戻\る\

\状\態\文\字\列\の\編\集\
\状\況\\記\号\\状\況\を\説\明\す\る\文\字\
\空\き\が\あ\る\と\き\
\空\き\が\少\な\い\と\き\
\空\き\が\な\い\と\き\
\未\設\定\
\要\問\い\合\わ\せ\


$copyright
EOM #表示 &print_html($html); } ################################################################################ # # 文字列の編集を保存 # ################################################################################ #文字列の編集を保存 sub savestr { #パスワードチェック if ($FORM{'pwd'} ne $pwd) { &error("パスワードが違います。"); return; } #新しいデータを作成 local(@lines); push(@lines, "0<>$FORM{'str0'}<>$FORM{'strl0'}<>\n"); push(@lines, "1<>$FORM{'str1'}<>$FORM{'strl1'}<>\n"); push(@lines, "2<>$FORM{'str2'}<>$FORM{'strl2'}<>\n"); push(@lines, "3<>$FORM{'str3'}<>$FORM{'strl3'}<>\n"); push(@lines, "4<>$FORM{'str4'}<>$FORM{'strl4'}<>\n"); #ロック if (!&lock($lockdir)) { &error("ロック処理に失敗しました。"); return; } #ファイルを更新 open(OUT, ">$strfile"); print OUT @lines; close(OUT); #ロック解除 &unlock($lockdir); #管理画面に戻る &mng; } ################################################################################ # # 管理画面 # ################################################################################ #管理画面 sub mng { local($html); local($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst); # add - ver1.1 start #パスワードが指定されていない場合はパスワード入力画面を表示 if ($FORM{'pwd'} eq '') { &pwd_input; return; } # add - ver1.1 end #パスワードチェック if ($FORM{'pwd'} ne $pwd) { &error("パスワードが違います。"); return; } #現在の日時を取得 $ENV{'TZ'} = "JST-9"; ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(time); $year = 1900 + $year; $month++; #HTML作成 $html = << "EOM"; \予\約\状\況\管\理\画\面\

\戻\る\

\予\約\状\況\管\理\画\面\

\■\予\約\状\況\の\編\集\

\年\/\月\:\ \

\■\予\約\状\況\文\字\の\編\集\


$copyright
EOM #表示 &print_html($html); } # add - ver1.1 start #パスワード入力画面 sub pwd_input { local($html) = ''; #HTML作成 $html = << "EOM"; \パ\ス\ワ\ー\ド\入\力\

パスワード:

EOM #表示 &print_html($html); } # add - ver1.1 end ################################################################################