#!/usr/bin/perl

#Web Scheduler Ver 1.05 (2008/04/21)
#
#Copyright(C) 2002-2008 Knight, All rights reserved.
#Mail ... support@web-liberty.net
#Home ... http://www.web-liberty.net/

#――――― 初期処理 ――――――――――――――――――――――――

package main;

use strict;
use lib qw(./lib);

use webliberty::Basis;
use webliberty::Parser;
use webliberty::String;
use webliberty::File;
use webliberty::Date;
use webliberty::Host;
use webliberty::Cookie;
use webliberty::Lock;
use webliberty::Skin;
use webliberty::Sendmail;

require './init.cgi';

#――――― メイン処理 ―――――――――――――――――――――――

my $init = &init::get_init;

my $basis_ins  = new webliberty::Basis;
my $parser_ins = new webliberty::Parser(jcode => $init->{jcode_mode});

my $agent;
if ($ENV{'HTTP_USER_AGENT'} =~ /(DoCoMo|SoftBank|Vodafone|J-PHONE|KDDI-|UP\.Browser|DDIPOCKET|WILLCOM)/i) {
	require Jcode;

	$agent = 'mobile';
}

if (!&check_host) {
	&error('アクセスが禁止されています。');
}

if ($parser_ins->get_query('mode') eq 'admin') {
	if (&check_password) {
		if ($parser_ins->get_query('work') eq 'logout') {
			&admin_logout;
		} elsif ($parser_ins->get_query('work') eq 'new') {
			if ($parser_ins->get_query('exec_regist')) {
				&admin_regist;
				&admin_edit;
			} else {
				&admin_form;
			}
		} elsif ($parser_ins->get_query('work') eq 'edit') {
			if ($parser_ins->get_query('exec_regist')) {
				&admin_regist;
			} elsif ($parser_ins->get_query('exec_del')) {
				&admin_del;
			}
			if ($parser_ins->get_query('exec_form')) {
				&admin_form;
			} elsif ($parser_ins->get_query('exec_confirm')) {
				&admin_confirm;
			} else {
				&admin_edit;
			}
		} elsif ($parser_ins->get_query('work') eq 'comment') {
			if ($parser_ins->get_query('exec_regist')) {
				&comment_check;
				&comment_edit;
			} elsif ($parser_ins->get_query('exec_del')) {
				&comment_del;
			}
			if ($parser_ins->get_query('exec_form')) {
				&comment_form;
			} elsif ($parser_ins->get_query('exec_confirm')) {
				&admin_confirm;
			} else {
				&admin_comment;
			}
		} else {
			&admin_edit;
		}
	} else {
		&admin_login;
	}
} elsif ($parser_ins->get_query('mode') eq 'edit') {
	if ($parser_ins->get_query('work') eq 'edit') {
		&comment_check;
		&comment_edit;
	} elsif ($parser_ins->get_query('work') eq 'del') {
		&comment_del;
	}
	if ($parser_ins->get_query('work') eq 'form') {
		&comment_form;
	} else {
		&comment_login;
	}
} elsif ($parser_ins->get_query('mode') eq 'contact') {
	if ($parser_ins->get_query('work') eq 'preview') {
		&contact_check;
		&contact_preview;
	} elsif ($parser_ins->get_query('work') eq 'send') {
		&contact_check;
		&contact_complete;
	} else {
		&contact_form;
	}
} elsif ($parser_ins->get_query('mode') eq 'comment') {
	&comment_check;
	&comment_regist;
	&comment_complete;
} elsif ($parser_ins->get_query('mode') eq 'search') {
	&search;
} elsif ($parser_ins->get_query('mode') eq 'view') {
	&view;
} elsif ($parser_ins->get_query('mode') eq 'list') {
	&list;
} else {
	&calendar;
}

exit;

#――――― サブルーチン ――――――――――――――――――――――

### アクセスホストチェック
sub check_host {
	if (!$init->{host_mode}) {
		return 1;
	}

	my $host_ins = new webliberty::Host;

	foreach (@{$init->{permit_host}}) {
		if ($_ and $host_ins->get_host =~ /$_/i) {
			return 1;
		}
	}

	return;
}

### パスワード認証
sub check_password {
	my $cookie_ins = new webliberty::Cookie($init->{cookie_admin}, $init->{des_key});

	my(%query, $admin_pwd);

	if ($parser_ins->get_query) {
		%query = %{$parser_ins->get_query};
	}

	if (exists $query{'admin_pwd'}) {
		$admin_pwd = $parser_ins->get_query('admin_pwd');
	} else {
		$admin_pwd = $cookie_ins->get_cookie('admin_pwd');
	}

	my $flag;

	if ($admin_pwd eq $init->{admin_pwd}) {
		if ($agent ne 'mobile' and $parser_ins->get_query('admin_pwd')) {
			if ($parser_ins->get_query('hold')) {
				$cookie_ins->set_holddays(3650);
			}
			$cookie_ins->set_cookie(
				admin_pwd => $admin_pwd
			);
		}

		$flag = 1;
	}

	return $flag;
}

### ログアウト
sub admin_logout {
	my $cookie_ins = new webliberty::Cookie($init->{cookie_admin}, $init->{des_key});
	$cookie_ins->set_cookie(
		admin_pwd => ''
	);

	&admin_login;

	return;
}

### 予定登録
sub admin_regist {
	if ($agent ne 'mobile' and $ENV{'REQUEST_METHOD'} ne 'POST') {
		&error('不正なアクセスです。');
	}

	my($field, $name, $subj, $text);
	if ($agent eq 'mobile') {
		$field = Jcode->new($parser_ins->get_query('field'), 'sjis')->utf8;
		$name  = Jcode->new($parser_ins->get_query('name'), 'sjis')->utf8;
		$subj  = Jcode->new($parser_ins->get_query('subj'), 'sjis')->utf8;
		$text  = Jcode->new($parser_ins->get_query('text'), 'sjis')->utf8;
	} else {
		$field = $parser_ins->get_query('field');
		$name  = $parser_ins->get_query('name');
		$subj  = $parser_ins->get_query('subj');
		$text  = $parser_ins->get_query('text');
	}

	my $edit_ins  = new webliberty::String($parser_ins->get_query('edit'));
	my $stat_ins  = new webliberty::String($parser_ins->get_query('stat'));
	my $comt_ins  = new webliberty::String($parser_ins->get_query('comt'));
	my $mail_ins  = new webliberty::String($parser_ins->get_query('mail'));
	my $field_ins = new webliberty::String($field);
	my $name_ins  = new webliberty::String($name);
	my $subj_ins  = new webliberty::String($subj);
	my $text_ins  = new webliberty::String($text);

	my $year_ins    = new webliberty::String($parser_ins->get_query('year'));
	my $month_ins   = new webliberty::String($parser_ins->get_query('month'));
	my $day_ins     = new webliberty::String($parser_ins->get_query('day'));
	my $hour1_ins   = new webliberty::String($parser_ins->get_query('hour1'));
	my $minute1_ins = new webliberty::String($parser_ins->get_query('minute1'));
	my $hour2_ins   = new webliberty::String($parser_ins->get_query('hour2'));
	my $minute2_ins = new webliberty::String($parser_ins->get_query('minute2'));

	$edit_ins->create_number;
	$stat_ins->create_number;
	$comt_ins->create_number;
	$mail_ins->create_number;
	$field_ins->create_line;
	$name_ins->create_line;
	$subj_ins->create_line;
	$text_ins->create_text;

	if (!$subj_ins->get_string) {
		&error('題名が入力されていません。');
	}

	if ($year_ins->get_string !~ /^\d\d\d\d$/) {
		&error('日付の年が正しく指定されていません。');
	}
	if ($month_ins->get_string !~ /^\d\d$/) {
		&error('日付の月が正しく指定されていません。');
	}
	if ($day_ins->get_string !~ /^\d\d$/) {
		&error('日付の日が正しく指定されていません。');
	}
	if ($hour1_ins->get_string) {
		if ($hour1_ins->get_string !~ /^\d\d$/) {
			&error('開始時間が正しく指定されていません。');
		}
		if ($minute1_ins->get_string !~ /^\d\d$/) {
			$minute1_ins->set_string('00');
		}
	}
	if ($hour2_ins->get_string) {
		if ($hour2_ins->get_string !~ /^\d\d$/) {
			&error('終了時間が正しく指定されていません。');
		}
		if ($minute2_ins->get_string !~ /^\d\d$/) {
			$minute2_ins->set_string('00');
		}
	}
	if ($hour1_ins->get_string and $hour2_ins->get_string) {
		if ($hour1_ins->get_string . $minute1_ins->get_string > $hour2_ins->get_string . $minute2_ins->get_string) {
			&error('開始時間が終了時間より後に設定されています。');
		}
	}

	my $lock_ins = new webliberty::Lock($init->{lock_file});
	if (!$lock_ins->file_lock) {
		&error('ファイルがロックされています。時間をおいてもう一度投稿してください。');
	}

	my(%file, $files, $org_files, $flag);

	if ($parser_ins->get_query('work') eq 'edit') {
		my $new_date = $year_ins->get_string . $month_ins->get_string . $day_ins->get_string;
		my $new_time = $hour1_ins->get_string . $minute1_ins->get_string . '-' . $hour2_ins->get_string . $minute2_ins->get_string;

		#インデックス用データ作成
		my(@new_index, $edit_date);

		open(FH, $init->{logs_index}) or &error("Read Error : $init->{logs_index}");
		while (<FH>) {
			chomp;
			my($date, $time, $no, $stat) = split(/\t/);

			if ($edit_ins->get_string == $no) {
				$edit_date = $date;

				push(@new_index, "$new_date\t$new_time\t$no\t" . $stat_ins->get_string . "\n");
			} else {
				push(@new_index, "$_\n");
			}
		}
		close(FH);

		#編集データ検索
		my $edit_file;
		if ($edit_date =~ /^(\d\d\d\d\d\d)\d\d$/) {
			$edit_file = "$init->{logs_dir}$1\.$init->{logs_ext}";
		}

		my($new_data, $org_files, $flag);

		open(FH, $edit_file) or &error("Read Error : $edit_file");
		while (<FH>) {
			chomp;
			my($no, $stat, $comt, $mail, $field, $name, $date, $time, $subj, $text, $file) = split(/\t/);

			if ($edit_ins->get_string == $no) {
				$org_files = $file;
				$flag      = 1;
			} else {
				$new_data .= "$_\n";
			}
		}
		close(FH);

		if (!$flag) {
			&error('指定された予定は存在しません。');
		}

		#アップロードファイル保存
		my @org_files = split(/<>/, $org_files);

		foreach (1 .. 3) {
			if ($parser_ins->get_query('delfile' . $_)) {
				unlink($init->{upfile_dir} . $org_files[$_ - 1]);
			} elsif ($parser_ins->get_query('file' . $_)) {
				my $file_ins = new webliberty::File($parser_ins->get_filename('file' . $_));
				$file{$_} = $edit_ins->get_string . "\-$_\." . $file_ins->get_ext;

				open(FH, ">$init->{upfile_dir}$file{$_}") or &error("Write Error : $init->{upfile_dir}$file{$_}");
				binmode(FH);
				print FH $parser_ins->get_filedata('file' . $_);
				close(FH);
			} else {
				$file{$_} = $org_files[$_ - 1];
			}
		}

		foreach (1 .. 3) {
			if ($files) {
				$files .= '<>';
			}
			$files .= "$file{$_}";
		}

		#編集データ登録
		open(FH, ">$edit_file") or &error("Write Error : $edit_file");
		print FH $new_data;
		close(FH);

		#予定編集
		my $new_line = $edit_ins->get_string . "\t" . $stat_ins->get_string . "\t" . $comt_ins->get_string . "\t" . $mail_ins->get_string . "\t" . $field_ins->get_string . "\t" . $name_ins->get_string . "\t$new_date\t$new_time\t" . $subj_ins->get_string . "\t" . $text_ins->get_string . "\t$files";
		$edit_file = $init->{logs_dir} . $year_ins->get_string . $month_ins->get_string . '.' . $init->{logs_ext};

		if (!-e $edit_file) {
			open(FH, ">$edit_file") or &error("Write Error : $edit_file");
			close(FH);

			chmod(0666, "$edit_file") or &error("Chmod Error : $edit_file");
		}

		my $new_key;
		if ($new_time =~ /^(\d\d\d\d)-/) {
			$new_key = $new_date . $1;
		} else {
			$new_key = $new_date . '0000';
		}

		my($new_data, $flag);

		open(FH, $edit_file) or &error("Read Error : $edit_file");
		while (<FH>) {
			chomp;
			my($no, $stat, $comt, $mail, $field, $name, $date, $time, $subj, $text, $file) = split(/\t/);

			my $date_key;
			if ($time =~ /^(\d\d\d\d)-/) {
				$date_key = $date . $1;
			} else {
				$date_key = $date . '0000';
			}

			if (!$flag and (($new_date == $date and $new_time == $time and $edit_ins->get_string < $no) or $new_key > $date_key)) {
				$new_data .= "$new_line\n";
				$flag      = 1;
			}
			$new_data .= "$_\n";
		}
		if (!$flag) {
			$new_data .= "$new_line\n";
		}

		#予定登録
		open(FH, ">$edit_file") or &error("Write Error : $edit_file");
		print FH $new_data;
		close(FH);

		#インデックス登録
		open(FH, ">$init->{logs_index}") or &error("Write Error : $init->{logs_index}");
		print FH sort { $b cmp $a } @new_index;
		close(FH);
	} else {
		my $log_file = $init->{logs_dir} . $year_ins->get_string . $month_ins->get_string . '.' . $init->{logs_ext};
		my $now_date = $year_ins->get_string . $month_ins->get_string . $day_ins->get_string;
		my $now_time = $hour1_ins->get_string . $minute1_ins->get_string . '-' . $hour2_ins->get_string . $minute2_ins->get_string;
		my @logs;

		#予定記録ファイルオープン
		if (-e $log_file) {
			open(FH, $log_file) or &error("Read Error : $log_file");
			@logs = <FH>;
			close(FH);
		} else {
			open(FH, ">$log_file") or &error("Write Error : $log_file");
			close(FH);

			chmod(0666, "$log_file") or &error("Chmod Error : $log_file");
		}

		#記録済みデータ読み込み
		open(FH, $init->{logs_index}) or &error("Read Error : $init->{logs_index}");
		my @index = <FH>;
		close(FH);

		#記事番号取得
		my @numbers = map { (split(/\t/))[2] } @index;
		@index = @index[sort { $numbers[$b] <=> $numbers[$a] } (0 .. $#numbers)];

		my $new_no = (split(/\t/, $index[0]))[2] + 1;

		#アップロードファイル保存
		foreach (1 .. 3) {
			if ($parser_ins->get_query('copyfile' . $_)) {
				my $file_ins = new webliberty::File($init->{upfile_dir} . $parser_ins->get_query('copyfile' . $_));
				$file{$_} = "$new_no\-$_\." . $file_ins->get_ext;
				$file_ins->copy("$init->{upfile_dir}$file{$_}");
			} elsif ($parser_ins->get_query('file' . $_)) {
				my $file_ins = new webliberty::File($parser_ins->get_filename('file' . $_));
				$file{$_} = "$new_no\-$_\." . $file_ins->get_ext;

				open(FH, ">$init->{upfile_dir}$file{$_}") or &error("Write Error : $init->{upfile_dir}$file{$_}");
				binmode(FH);
				print FH $parser_ins->get_filedata('file' . $_);
				close(FH);
			}
		}

		foreach (1 .. 3) {
			if ($files) {
				$files .= '<>';
			}
			$files .= "$file{$_}";
		}

		#記録用データ作成
		my $new_line = "$new_no\t" . $stat_ins->get_string . "\t" . $comt_ins->get_string . "\t" . $mail_ins->get_string . "\t" . $field_ins->get_string . "\t" . $name_ins->get_string . "\t$now_date\t$now_time\t" . $subj_ins->get_string . "\t" . $text_ins->get_string . "\t$files";

		my $now_key;
		if ($now_time =~ /^(\d\d\d\d)-/) {
			$now_key = $now_date . $1;
		} else {
			$now_key = $now_date . '0000';
		}

		my($new_data, $flag);

		open(FH, $log_file) or &error("Read Error : $log_file");
		while (<FH>) {
			chomp;
			my($no, $stat, $comt, $mail, $field, $name, $date, $time, $subj, $text, $file) = split(/\t/);

			my $date_key;
			if ($time =~ /^(\d\d\d\d)-/) {
				$date_key = $date . $1;
			} else {
				$date_key = $date . '0000';
			}

			if (!$flag and $now_key > $date_key) {
				$new_data .= "$new_line\n";
				$flag      = 1;
			}
			$new_data .= "$_\n";
		}
		if (!$flag) {
			$new_data .= "$new_line\n";
		}
		close(FH);

		#予定登録
		open(FH, ">$log_file") or &error("Write Error : $log_file");
		print FH $new_data;
		close(FH);

		#インデックス用データ作成
		my $index = "$now_date\t$now_time\t$new_no\t" . $stat_ins->get_string;

		my($new_index, $flag);

		open(FH, $init->{logs_index}) or &error("Read Error : $init->{logs_index}");
		while (<FH>) {
			chomp;
			my($date, $time, $no, $stat) = split(/\t/);

			my $date_key;
			if ($time =~ /^(\d\d\d\d)-/) {
				$date_key = $date . $1;
			} else {
				$date_key = $date . '0000';
			}

			if (!$flag and $now_key > $date_key) {
				$new_index .= "$index\n";
				$flag       = 1;
			}
			$new_index .= "$_\n";
		}
		if (!$flag) {
			$new_index .= "$index\n";
		}
		close(FH);

		#インデックス登録
		open(FH, ">$init->{logs_index}") or &error("Write Error : $init->{logs_index}");
		print FH $new_index;
		close(FH);
	}

	$lock_ins->file_unlock;

	return;
}

### 予定削除
sub admin_del {
	if ($agent ne 'mobile' and $ENV{'REQUEST_METHOD'} ne 'POST') {
		&error('不正なアクセスです。');
	}
	if (!$parser_ins->get_query('del')) {
		&error('削除したい予定を選択してください。');
	}

	my $lock_ins = new webliberty::Lock($init->{lock_file});
	if (!$lock_ins->file_lock) {
		&error('ファイルがロックされています。時間をおいてもう一度投稿してください。');
	}

	#削除データ検索
	my($new_index, %del_file);

	open(FH, $init->{logs_index}) or &error("Read Error : $init->{logs_index}");
	while (<FH>) {
		chomp;
		my($date, $time, $no, $stat) = split(/\t/);

		if ($parser_ins->get_query('del') =~ /(^|\n)$no(\n|$)/) {
			if ($date =~ /^(\d\d\d\d\d\d)\d\d$/) {
				$del_file{"$init->{logs_dir}$1\.$init->{logs_ext}"} = 1;
			}
		} else {
			$new_index .= "$_\n";
		}
	}
	close(FH);

	#予定削除
	my $flag;

	foreach my $entry (keys %del_file) {
		my $new_data;

		open(FH, $entry) or &error("Read Error : $entry");
		while (<FH>) {
			chomp;
			my($no, $stat, $comt, $mail, $field, $name, $date, $time, $subj, $text, $file) = split(/\t/);

			if ($parser_ins->get_query('del') =~ /(^|\n)$no(\n|$)/) {
				if ($file) {
					foreach my $del_file (split(/<>/, $file)) {
						if ($del_file) {
							unlink("$init->{upfile_dir}$del_file");
						}
					}
				}

				$flag = 1;
			} else {
				$new_data .= "$_\n";
			}
		}
		close(FH);

		open(FH, ">$entry") or &error("Write Error : $entry");
		print FH $new_data;
		close(FH);
	}

	if (!$flag) {
		&error('指定された予定は存在しません。');
	}

	#インデックス登録
	open(FH, ">$init->{logs_index}") or &error("Write Error : $init->{logs_index}");
	print FH $new_index;
	close(FH);

	#コメント削除
	my $index_data;
	open(FH, $init->{comment_index}) or &error("Read Error : $init->{comment_index}");
	while (<FH>) {
		chomp;
		my($no, $pno, $stat, $date, $name, $subj, $host) = split(/\t/);

		if ($parser_ins->get_query('del') =~ /(^|\n)$pno(\n|$)/) {
			if (-e "$init->{comment_dir}$pno\.$init->{logs_ext}") {
				unlink("$init->{comment_dir}$pno\.$init->{logs_ext}");
			}
		} else {
			$index_data .= "$_\n";
		}
	}
	close(FH);

	#コメントインデックス登録
	open(FH, ">$init->{comment_index}") or &error("Write Error : $init->{comment_index}");
	print FH $index_data;
	close(FH);

	$lock_ins->file_unlock;

	return;
}

### 登録予定一覧
sub admin_edit {
	my $message;
	if ($parser_ins->get_query('work') eq 'new') {
		$message = '予定を新規に登録しました。';
	} elsif ($parser_ins->get_query('exec_regist')) {
		$message = '予定を編集しました。';
	} elsif ($parser_ins->get_query('exec_del')) {
		$message = '予定を削除しました。';
	} else {
		$message = '予定を選択し、<em>編集ボタン</em>か<em>削除ボタン</em>を押してください。';
	}

	my $page_ins = new webliberty::String($parser_ins->get_query('page'));
	$page_ins->create_number;

	my $start = $page_ins->get_string * $init->{page_size};
	my $end   = $start + $init->{page_size};

	my $skin_ins = new webliberty::Skin;
	if ($agent eq 'mobile') {
		$skin_ins->parse_skin($init->{skin_mobile_header});
		$skin_ins->parse_skin($init->{skin_mobile_admin_work});
		$skin_ins->parse_skin($init->{skin_mobile_admin_edit});
		$skin_ins->parse_skin($init->{skin_mobile_footer});
	} else {
		$skin_ins->parse_skin($init->{skin_header});
		$skin_ins->parse_skin($init->{skin_admin_work});
		$skin_ins->parse_skin($init->{skin_admin_edit});
		$skin_ins->parse_skin($init->{skin_footer});
	}

	my $method;
	if ($ENV{'HTTP_USER_AGENT'} =~ /(J-PHONE|KDDI-|UP\.Browser)/i) {
		$method = 'get';
	} else {
		$method = 'post';
	}
	$skin_ins->replace_skin(
		INFO_METHOD  => $method,
		INFO_MESSAGE => $message,
		INFO_TITLE   => $init->{title},
		INFO_BACK    => $init->{back_url},
		INFO_FILE    => $init->{script_file},
		INFO_PWD     => $parser_ins->get_query('admin_pwd')
	);

	my $html;

	$html .= $skin_ins->get_data('header');
	$html .= &admin_work($skin_ins);

	my($index_size, $index_date, $index_no);

	open(FH, $init->{logs_index}) or &error("Read Error : $init->{logs_index}");
	while (<FH>) {
		chomp;
		my($date, $time, $no, $stat) = split(/\t/);

		if ($index_size == $page_ins->get_string * $init->{page_size}) {
			$index_date = $date;
			$index_no   = $no;
		}

		$index_size++;
	}
	close(FH);

	my $start_file;
	if ($index_date =~ /^(\d\d\d\d\d\d)\d\d$/) {
		$start_file = "$init->{logs_dir}$1\.$init->{logs_ext}";
	}

	opendir(DIR, $init->{logs_dir}) or &error("Read Error : $init->{logs_dir}");
	my @dir = sort { $b <=> $a } readdir(DIR);
	closedir(DIR);

	my($field_start, $field_end);
	if (!$init->{use_field}) {
		$field_start = '<!--';
		$field_end   = '-->';
	}
	my($name_start, $name_end);
	if (!$init->{use_name}) {
		$name_start = '<!--';
		$name_end   = '-->';
	}

	$html .= $skin_ins->get_replace_data(
		'edit_head',
		EDIT_FIELD_START => $field_start,
		EDIT_FIELD_END   => $field_end,
		EDIT_NAME_START  => $name_start,
		EDIT_NAME_END    => $name_end
	);

	my($dir_flag, $file_flag, $i);

	foreach my $entry (@dir) {
		if ($entry !~ /^\d\d\d\d\d\d\.$init->{logs_ext}$/) {
			next;
		}
		if ($start_file eq "$init->{logs_dir}$entry") {
			$dir_flag = 1;
		}
		if ($dir_flag) {
			open(FH, "$init->{logs_dir}$entry") or &error("Read Error : $init->{logs_dir}$entry");
			while (<FH>) {
				chomp;
				my($no, $stat, $comt, $mail, $field, $name, $date, $time, $subj, $text, $file) = split(/\t/);

				if ($no == $index_no) {
					$file_flag = 1;
				}
				if ($file_flag) {
					$i++;
					if ($i > $init->{page_size}) {
						$file_flag = 0;
						last;
					}

					$html .= $skin_ins->get_replace_data(
						'edit',
						&get_article($no, $stat, $comt, $mail, $field, $name, $date, $time, $subj, $text, $file),
						EDIT_FIELD_START => $field_start,
						EDIT_FIELD_END   => $field_end,
						EDIT_NAME_START  => $name_start,
						EDIT_NAME_END    => $name_end
					);
				}
			}
			close(FH);
		}
	}

	$html .= $skin_ins->get_replace_data(
		'edit_foot',
		EDIT_FIELD_START => $field_start,
		EDIT_FIELD_END   => $field_end,
		EDIT_NAME_START  => $name_start,
		EDIT_NAME_END    => $name_end
	);

	my $page_list;
	foreach (0 .. int(($index_size - 1) / $init->{page_size})) {
		my($prev_start, $prev_end);

		if ($_ == $page_ins->get_string) {
			$page_list .= "<option value=\"$_\" selected=\"selected\">ページ" . ($_ + 1) . "</option>";
		} else {
			$page_list .= "<option value=\"$_\">ページ" . ($_ + 1) . "</option>";
		}
	}
	$html .= $skin_ins->get_replace_data(
		'page',
		PAGE_LIST => $page_list
	);

	$html .= $skin_ins->get_data('footer');

	if ($agent eq 'mobile') {
		my($data, $length) = &get_mobile_data($html);

		print "Content-Type: text/html; charset=Shift_JIS\n";
		if ($ENV{'HTTP_USER_AGENT'} =~ /KDDI-|UP\.Browser/i) {
			print "Pragma: no-cache\n";
			print "Cache-Control: no-cache\n\n";
		} else {
			print "Content-Length: $length\n\n";
		}
		print $data;
	} else {
		print $basis_ins->header;
		print $html;
	}

	return;
}

### コメント一覧
sub admin_comment {
	my $message;
	if ($parser_ins->get_query('exec_del')) {
		$message = 'コメントを削除しました。';
	} else {
		$message = 'コメントを選択し、<em>編集ボタン</em>か<em>削除ボタン</em>を押してください。';
	}

	my $skin_ins = new webliberty::Skin;
	if ($agent eq 'mobile') {
		$skin_ins->parse_skin($init->{skin_mobile_header});
		$skin_ins->parse_skin($init->{skin_mobile_admin_work});
		$skin_ins->parse_skin($init->{skin_mobile_admin_comment});
		$skin_ins->parse_skin($init->{skin_mobile_footer});
	} else {
		$skin_ins->parse_skin($init->{skin_header});
		$skin_ins->parse_skin($init->{skin_admin_work});
		$skin_ins->parse_skin($init->{skin_admin_comment});
		$skin_ins->parse_skin($init->{skin_footer});
	}

	my $method;
	if ($ENV{'HTTP_USER_AGENT'} =~ /(J-PHONE|KDDI-|UP\.Browser)/i) {
		$method = 'get';
	} else {
		$method = 'post';
	}
	$skin_ins->replace_skin(
		INFO_METHOD  => $method,
		INFO_MESSAGE => $message,
		INFO_TITLE   => $init->{title},
		INFO_BACK    => $init->{back_url},
		INFO_FILE    => $init->{script_file},
		INFO_PWD     => $parser_ins->get_query('admin_pwd')
	);

	my $html;

	$html .= $skin_ins->get_data('header');
	$html .= &admin_work($skin_ins);
	$html .= $skin_ins->get_data('edit_head');

	my($index_size, $i);

	my $comt_start = $init->{page_size} * $parser_ins->get_query('page');
	my $comt_end   = $comt_start + $init->{page_size};

	open(FH, $init->{comment_index}) or &error("Read Error : $init->{comment_index}");
	while (<FH>) {
		$index_size++;
	}
	seek(FH, 0, 0);
	while (<FH>) {
		chomp;
		my($no, $pno, $stat, $date, $name, $subj, $host) = split(/\t/);

		$i++;
		if ($i <= $comt_start) {
			next;
		} elsif ($i > $comt_end) {
			last;
		}

		$html .= $skin_ins->get_replace_data(
			'edit',
			&get_comment($no, $pno, $stat, $date, $name, '', '', $subj, '', '', $host)
		);
	}
	close(FH);

	$html .= $skin_ins->get_data('edit_foot');

	my $page_list;
	foreach (0 .. int(($index_size - 1) / $init->{page_size})) {
		if ($_ == $parser_ins->get_query('page')) {
			$page_list .= "<option value=\"$_\" selected=\"selected\">ページ" . ($_ + 1) . "</option>";
		} else {
			$page_list .= "<option value=\"$_\">ページ" . ($_ + 1) . "</option>";
		}
	}
	$html .= $skin_ins->get_replace_data(
		'page',
		PAGE_LIST => $page_list
	);

	$html .= $skin_ins->get_data('navi');
	$html .= $skin_ins->get_data('footer');

	if ($agent eq 'mobile') {
		my($data, $length) = &get_mobile_data($html);

		print "Content-Type: text/html; charset=Shift_JIS\n";
		if ($ENV{'HTTP_USER_AGENT'} =~ /KDDI-|UP\.Browser/i) {
			print "Pragma: no-cache\n";
			print "Cache-Control: no-cache\n\n";
		} else {
			print "Content-Length: $length\n\n";
		}
		print $data;
	} else {
		print $basis_ins->header;
		print $html;
	}

	return;
}

### 処理内容確認表示
sub admin_confirm {
	my($info_heading, $info_message);
	if ($parser_ins->get_query('work') eq 'edit') {
		$info_heading = '予定削除';
		$info_message = '予定';
	} elsif ($parser_ins->get_query('work') eq 'comment') {
		$info_heading = 'コメント削除';
		$info_message = 'コメント';
	}

	if (!$parser_ins->get_query('del')) {
		&error("作業対象を選択してください。");
	}

	my $del_list;
	my $confirm_data = "<input type=\"hidden\" name=\"exec_del\" value=\"on\" />";
	foreach (split(/\n/, $parser_ins->get_query('del'))) {
		if ($del_list) {
			$del_list .= '、';
		}
		$del_list     .= "No.$_";
		$confirm_data .= "<input type=\"hidden\" name=\"del\" value=\"$_\" />";
	}

	my $message = "$del_listの$info_messageを削除します。よろしければ、<em>実行ボタン</em>を押してください。";

	my $skin_ins = new webliberty::Skin;
	if ($agent eq 'mobile') {
		$skin_ins->parse_skin($init->{skin_mobile_header});
		$skin_ins->parse_skin($init->{skin_mobile_admin_work});
		$skin_ins->parse_skin($init->{skin_mobile_admin_confirm});
		$skin_ins->parse_skin($init->{skin_mobile_footer});
	} else {
		$skin_ins->parse_skin($init->{skin_header});
		$skin_ins->parse_skin($init->{skin_admin_work});
		$skin_ins->parse_skin($init->{skin_admin_confirm});
		$skin_ins->parse_skin($init->{skin_footer});
	}

	my $method;
	if ($ENV{'HTTP_USER_AGENT'} =~ /(J-PHONE|KDDI-|UP\.Browser)/i) {
		$method = 'get';
	} else {
		$method = 'post';
	}
	$skin_ins->replace_skin(
		INFO_METHOD  => $method,
		INFO_MESSAGE => $message,
		INFO_TITLE   => $init->{title},
		INFO_BACK    => $init->{back_url},
		INFO_FILE    => $init->{script_file},
		INFO_PWD     => $parser_ins->get_query('admin_pwd')
	);

	my $html;

	$html .= $skin_ins->get_data('header');
	$html .= &admin_work($skin_ins);

	$html .= $skin_ins->get_replace_data(
		'contents',
		CONFIRM_HEADING => $info_heading,
		CONFIRM_WORK    => $parser_ins->get_query('work'),
		CONFIRM_DATA    => $confirm_data
	);

	$html .= $skin_ins->get_data('footer');

	if ($agent eq 'mobile') {
		my($data, $length) = &get_mobile_data($html);

		print "Content-Type: text/html; charset=Shift_JIS\n";
		if ($ENV{'HTTP_USER_AGENT'} =~ /KDDI-|UP\.Browser/i) {
			print "Pragma: no-cache\n";
			print "Cache-Control: no-cache\n\n";
		} else {
			print "Content-Length: $length\n\n";
		}
		print $data;
	} else {
		print $basis_ins->header;
		print $html;
	}

	return;
}

### 登録フォーム表示
sub admin_form {
	my($form_new_start, $form_new_end, $form_edit_start, $form_edit_end, $form_copy_start, $form_copy_end);
	my($form_work, $form_stat, $form_comt, $form_mail, $form_date, $form_time, $form_year, $form_month, $form_day, $form_hour1, $form_minute1, $form_hour2, $form_minute2, $form_field, $form_name, $form_subj, $form_text);
	my($form_file1, $form_file2, $form_file3);

	if ($parser_ins->get_query('edit')) {
		$form_work = 'edit';

		$form_new_start  = '<!--';
		$form_new_end    = '-->';
		$form_copy_start = '<!--';
		$form_copy_end   = '-->';

		my $edit_date;
		open(FH, $init->{logs_index}) or &error("Read Error : $init->{logs_index}");
		while (<FH>) {
			chomp;
			my($date, $time, $no, $stat) = split(/\t/);

			if ($parser_ins->get_query('edit') == $no) {
				$edit_date = $date;

				last;
			}
		}
		close(FH);

		my $edit_file;
		if ($edit_date =~ /^(\d\d\d\d)(\d\d)(\d\d)$/) {
			$edit_file = "$init->{logs_dir}$1$2\.$init->{logs_ext}";
		}

		open(FH, $edit_file) or &error("Read Error : $edit_file");
		while (<FH>) {
			chomp;
			my($no, $stat, $comt, $mail, $field, $name, $date, $time, $subj, $text, $file) = split(/\t/);

			if ($parser_ins->get_query('edit') == $no) {
				if ($date =~ /^(\d\d\d\d)(\d\d)(\d\d)$/) {
					$form_year   = $1;
					$form_month  = $2;
					$form_day    = $3;
				}
				if ($time =~ /^(\d\d)(\d\d)-/) {
					$form_hour1   = $1;
					$form_minute1 = $2;
				}
				if ($time =~ /-(\d\d)(\d\d)$/) {
					$form_hour2   = $1;
					$form_minute2 = $2;
				}

				my $stat_ins  = new webliberty::String($stat);
				my $comt_ins  = new webliberty::String($comt);
				my $mail_ins  = new webliberty::String($mail);
				my $field_ins = new webliberty::String($field);
				my $name_ins  = new webliberty::String($name);
				my $subj_ins  = new webliberty::String($subj);
				my $text_ins  = new webliberty::String($text);

				$stat_ins->create_number;
				$comt_ins->create_number;
				$mail_ins->create_number;
				$field_ins->create_line;
				$name_ins->create_line;
				$subj_ins->create_line;
				$text_ins->create_text;

				$form_stat  = $stat_ins->create_plain;
				$form_comt  = $comt_ins->create_plain;
				$form_mail  = $mail_ins->create_plain;
				$form_field = $field_ins->create_plain;
				$form_name  = $name_ins->create_plain;
				$form_subj  = $subj_ins->create_plain;
				$form_text  = $text_ins->create_plain;

				($form_file1, $form_file2, $form_file3) = split(/<>/, $file);
				if ($form_file1) {
					$form_file1 = "<input type=\"checkbox\" name=\"delfile1\" id=\"delfile1_checkbox\" value=\"on\"> <label for=\"delfile1_checkbox\">$form_file1を削除</label>";
				}
				if ($form_file2) {
					$form_file2 = "<input type=\"checkbox\" name=\"delfile2\" id=\"delfile2_checkbox\" value=\"on\"> <label for=\"delfile2_checkbox\">$form_file2を削除</label>";
				}
				if ($form_file3) {
					$form_file3 = "<input type=\"checkbox\" name=\"delfile3\" id=\"delfile3_checkbox\" value=\"on\"> <label for=\"delfile3_checkbox\">$form_file3を削除</label>";
				}

				last;
			}
		}
		close(FH);
	} else {
		$form_work = 'new';

		if ($parser_ins->get_query('copy')) {
			$form_new_start  = '<!--';
			$form_new_end    = '-->';
			$form_edit_start = '<!--';
			$form_edit_end   = '-->';

			my $copy_date;
			open(FH, $init->{logs_index}) or &error("Read Error : $init->{logs_index}");
			while (<FH>) {
				chomp;
				my($date, $time, $no, $stat) = split(/\t/);

				if ($parser_ins->get_query('copy') == $no) {
					$copy_date = $date;

					last;
				}
			}
			close(FH);

			my $copy_file;
			if ($copy_date =~ /^(\d\d\d\d)(\d\d)(\d\d)$/) {
				$copy_file = "$init->{logs_dir}$1$2\.$init->{logs_ext}";
			}

			open(FH, $copy_file) or &error("Read Error : $copy_file");
			while (<FH>) {
				chomp;
				my($no, $stat, $comt, $mail, $field, $name, $date, $time, $subj, $text, $file) = split(/\t/);

				if ($parser_ins->get_query('copy') == $no) {
					if ($date =~ /^(\d\d\d\d)(\d\d)(\d\d)$/) {
						$form_year   = $1;
						$form_month  = $2;
						$form_day    = $3;
					}
					if ($time =~ /^(\d\d)(\d\d)-/) {
						$form_hour1   = $1;
						$form_minute1 = $2;
					}
					if ($time =~ /-(\d\d)(\d\d)$/) {
						$form_hour2   = $1;
						$form_minute2 = $2;
					}

					my $stat_ins  = new webliberty::String($stat);
					my $comt_ins  = new webliberty::String($comt);
					my $mail_ins  = new webliberty::String($mail);
					my $field_ins = new webliberty::String($field);
					my $name_ins  = new webliberty::String($name);
					my $subj_ins  = new webliberty::String($subj);
					my $text_ins  = new webliberty::String($text);

					$stat_ins->create_number;
					$comt_ins->create_number;
					$mail_ins->create_number;
					$field_ins->create_line;
					$name_ins->create_line;
					$subj_ins->create_line;
					$text_ins->create_text;

					$form_stat  = $stat_ins->create_plain;
					$form_comt  = $comt_ins->create_plain;
					$form_mail  = $mail_ins->create_plain;
					$form_field = $field_ins->create_plain;
					$form_name  = $name_ins->create_plain;
					$form_subj  = $subj_ins->create_plain;
					$form_text  = $text_ins->create_plain;

					($form_file1, $form_file2, $form_file3) = split(/<>/, $file);
					if ($form_file1) {
						$form_file1 = "<input type=\"checkbox\" name=\"copyfile1\" id=\"copyfile1_checkbox\" value=\"$form_file1\" checked=\"checked\"> <label for=\"copyfile1_checkbox\">$form_file1を複製</label>";
					}
					if ($form_file2) {
						$form_file2 = "<input type=\"checkbox\" name=\"copyfile2\" id=\"copyfile2_checkbox\" value=\"$form_file2\" checked=\"checked\"> <label for=\"copyfile2_checkbox\">$form_file2を複製</label>";
					}
					if ($form_file3) {
						$form_file3 = "<input type=\"checkbox\" name=\"copyfile3\" id=\"copyfile3_checkbox\" value=\"$form_file3\" checked=\"checked\"> <label for=\"copyfile3_checkbox\">$form_file3を複製</label>";
					}

					last;
				}
			}
			close(FH);
		} else {
			$form_edit_start = '<!--';
			$form_edit_end   = '-->';
			$form_copy_start = '<!--';
			$form_copy_end   = '-->';

			$form_stat = $init->{default_stat};
			$form_comt = $init->{default_comt};
			$form_mail = $init->{default_mail};

			my($sec, $min, $hour, $day, $mon, $year) = localtime(time);

			$form_year  = $year + 1900;
			$form_month = $mon + 1;
			$form_day   = $day;
		}
	}

	if ($form_stat) {
		$form_stat = ' checked="checked"';
	} else {
		$form_stat = '';
	}
	if ($form_comt) {
		$form_comt = ' checked="checked"';
	} else {
		$form_comt = '';
	}
	if ($form_mail) {
		$form_mail = ' checked="checked"';
	} else {
		$form_mail = '';
	}

	my($form_mail_start, $form_mail_end);
	if (!$init->{mail_mode}) {
		$form_mail_start = '<!--';
		$form_mail_end   = '-->';
	}

	$form_date .= '<select name="year" xml:lang="ja" lang="ja">';
	foreach ($form_year - 5 .. $form_year + 5) {
		if ($form_year == $_) {
			$form_date .= "<option value=\"$_\" selected=\"selected\">$_年</option>";
		} else {
			$form_date .= "<option value=\"$_\">$_年</option>";
		}
	}
	$form_date .= '</select>';

	$form_date .= '<select name="month" xml:lang="ja" lang="ja">';
	foreach (1 .. 12) {
		my $month = sprintf("%02d", $_);
		if ($month == $form_month) {
			$form_date .= "<option value=\"$month\" selected=\"selected\">$_月</option>";
		} else {
			$form_date .= "<option value=\"$month\">$_月</option>";
		}
	}
	$form_date .= '</select>';

	$form_date .= '<select name="day" xml:lang="ja" lang="ja">';
	foreach (1 .. 31) {
		my $day = sprintf("%02d", $_);
		if ($day == $form_day) {
			$form_date .= "<option value=\"$day\" selected=\"selected\">$_日</option>";
		} else {
			$form_date .= "<option value=\"$day\">$_日</option>";
		}
	}
	$form_date .= '</select>';

	$form_time .= '<select name="hour1" xml:lang="ja" lang="ja">';
	$form_time .= '<option value="">時</option>';
	foreach (0 .. 23) {
		my $hour = sprintf("%02d", $_);
		if ($form_hour1 and $hour == $form_hour1) {
			$form_time .= "<option value=\"$hour\" selected=\"selected\">$_時</option>";
		} else {
			$form_time .= "<option value=\"$hour\">$_時</option>";
		}
	}
	$form_time .= '</select>';

	$form_time .= '<select name="minute1" xml:lang="ja" lang="ja">';
	$form_time .= '<option value="">分</option>';
	foreach (0 .. 59) {
		my $minute = sprintf("%02d", $_);
		if ($form_minute1 and $minute == $form_minute1) {
			$form_time .= "<option value=\"$minute\" selected=\"selected\">$_分</option>";
		} else {
			$form_time .= "<option value=\"$minute\">$_分</option>";
		}
	}
	$form_time .= '</select>';

	$form_time .= ' ～ <select name="hour2" xml:lang="ja" lang="ja">';
	$form_time .= '<option value="">時</option>';
	foreach (0 .. 23) {
		my $hour = sprintf("%02d", $_);
		if ($form_hour2 and $hour == $form_hour2) {
			$form_time .= "<option value=\"$hour\" selected=\"selected\">$_時</option>";
		} else {
			$form_time .= "<option value=\"$hour\">$_時</option>";
		}
	}
	$form_time .= '</select>';

	$form_time .= '<select name="minute2" xml:lang="ja" lang="ja">';
	$form_time .= '<option value="">分</option>';
	foreach (0 .. 59) {
		my $minute = sprintf("%02d", $_);
		if ($form_minute2 and $minute == $form_minute2) {
			$form_time .= "<option value=\"$minute\" selected=\"selected\">$_分</option>";
		} else {
			$form_time .= "<option value=\"$minute\">$_分</option>";
		}
	}
	$form_time .= '</select>';

	my($form_field_start, $form_field_end);
	if ($init->{use_field}) {
		my $field_list;
		foreach (@{$init->{field_list}}) {
			if (!$_) {
				next;
			}

			if ($_ eq $form_field) {
				$field_list .= "<option value=\"$_\" selected=\"selected\">$_</option>";
			} else {
				$field_list .= "<option value=\"$_\">$_</option>";
			}
		}
		$form_field = "<select name=\"field\"><option value=\"\">選択してください</option>$field_list</select>";
	} else {
		$form_field_start = '<!--';
		$form_field_end   = '-->';
	}

	my($form_name_start, $form_name_end);
	if ($init->{use_name}) {
		my $name_list;
		foreach (@{$init->{name_list}}) {
			if (!$_) {
				next;
			}

			if ($_ eq $form_name) {
				$name_list .= "<option value=\"$_\" selected=\"selected\">$_</option>";
			} else {
				$name_list .= "<option value=\"$_\">$_</option>";
			}
		}
		$form_name = "<select name=\"name\"><option value=\"\">選択してください</option>$name_list</select>";
	} else {
		$form_name_start = '<!--';
		$form_name_end   = '-->';
	}

	my $skin_ins = new webliberty::Skin;
	if ($agent eq 'mobile') {
		$skin_ins->parse_skin($init->{skin_mobile_header});
		$skin_ins->parse_skin($init->{skin_mobile_admin_work});
		$skin_ins->parse_skin($init->{skin_mobile_admin_form});
		$skin_ins->parse_skin($init->{skin_mobile_footer});
	} else {
		$skin_ins->parse_skin($init->{skin_header});
		$skin_ins->parse_skin($init->{skin_admin_work});
		$skin_ins->parse_skin($init->{skin_admin_form});
		$skin_ins->parse_skin($init->{skin_footer});
	}

	my $method;
	if ($ENV{'HTTP_USER_AGENT'} =~ /(J-PHONE|KDDI-|UP\.Browser)/i) {
		$method = 'get';
	} else {
		$method = 'post';
	}
	$skin_ins->replace_skin(
		INFO_METHOD => $method,
		INFO_TITLE  => $init->{title},
		INFO_BACK   => $init->{back_url},
		INFO_FILE   => $init->{script_file},
		INFO_PWD    => $parser_ins->get_query('admin_pwd')
	);

	my $html;

	$html .= $skin_ins->get_data('header');
	$html .= &admin_work($skin_ins);

	$html .= $skin_ins->get_replace_data(
		'form',
		FORM_WORK        => $form_work,
		FORM_NO          => $parser_ins->get_query('edit') || $parser_ins->get_query('copy'),
		FORM_STAT        => $form_stat,
		FORM_COMT        => $form_comt,
		FORM_MAIL        => $form_mail,
		FORM_MAIL_START  => $form_mail_start,
		FORM_MAIL_END    => $form_mail_end,
		FORM_DATE        => $form_date,
		FORM_TIME        => $form_time,
		FORM_FIELD       => $form_field,
		FORM_FIELD_START => $form_field_start,
		FORM_FIELD_END   => $form_field_end,
		FORM_NAME        => $form_name,
		FORM_NAME_START  => $form_name_start,
		FORM_NAME_END    => $form_name_end,
		FORM_SUBJ        => $form_subj,
		FORM_TEXT        => $form_text,
		FORM_FILE1       => $form_file1,
		FORM_FILE2       => $form_file2,
		FORM_FILE3       => $form_file3,
		FORM_NEW_START   => $form_new_start,
		FORM_NEW_END     => $form_new_end,
		FORM_EDIT_START  => $form_edit_start,
		FORM_EDIT_END    => $form_edit_end,
		FORM_COPY_START  => $form_copy_start,
		FORM_COPY_END    => $form_copy_end
	);

	$html .= $skin_ins->get_data('footer');

	if ($agent eq 'mobile') {
		my($data, $length) = &get_mobile_data($html);

		print "Content-Type: text/html; charset=Shift_JIS\n";
		if ($ENV{'HTTP_USER_AGENT'} =~ /KDDI-|UP\.Browser/i) {
			print "Pragma: no-cache\n";
			print "Cache-Control: no-cache\n\n";
		} else {
			print "Content-Length: $length\n\n";
		}
		print $data;
	} else {
		print $basis_ins->header;
		print $html;
	}

	return;
}

### 処理選択フォーム出力
sub admin_work {
	my($skin_ins) = @_;

	my $skin_data = $skin_ins->get_data('work_head');

	my $work_data;
	$work_data .= "new\t予定登録\n";
	$work_data .= "edit\t予定管理\n";
	$work_data .= "comment\tコメント管理\n";
	$work_data .= "logout\tログアウト\n";

	foreach (split(/\n/, $work_data)) {
		my($work_id, $work_name) = split(/\t/);

		if ($parser_ins->get_query('work') eq $work_id) {
			$skin_data .= $skin_ins->get_replace_data(
				'work_selected',
				WORK_ID   => $work_id,
				WORK_NAME => $work_name
			);
		} else {
			$skin_data .= $skin_ins->get_replace_data(
				'work',
				WORK_ID   => $work_id,
				WORK_NAME => $work_name
			);
		}
	}

	$skin_data .= $skin_ins->get_data('work_foot');

	return $skin_data;
}

### ログイン画面表示
sub admin_login {
	my $message;
	if ($parser_ins->get_query('admin_pwd')) {
		$message = 'パスワードが違います。';
	} else {
		$message = '管理者パスワードを入力してください。';
	}

	my $skin_ins = new webliberty::Skin;
	if ($agent eq 'mobile') {
		$skin_ins->parse_skin($init->{skin_mobile_header});
		$skin_ins->parse_skin($init->{skin_mobile_admin});
		$skin_ins->parse_skin($init->{skin_mobile_footer});
	} else {
		$skin_ins->parse_skin($init->{skin_header});
		$skin_ins->parse_skin($init->{skin_admin});
		$skin_ins->parse_skin($init->{skin_footer});
	}

	my $method;
	if ($ENV{'HTTP_USER_AGENT'} =~ /(J-PHONE|KDDI-|UP\.Browser)/i) {
		$method = 'get';
	} else {
		$method = 'post';
	}
	$skin_ins->replace_skin(
		INFO_METHOD  => $method,
		INFO_TITLE   => $init->{title},
		INFO_BACK    => $init->{back_url},
		INFO_FILE    => $init->{script_file},
		INFO_MESSAGE => $message
	);

	my $html;

	$html .= $skin_ins->get_data('header');
	$html .= $skin_ins->get_data('login_head');

	my $work_data;
	$work_data  = "new\t予定登録\n";
	$work_data .= "edit\t予定管理\n";
	$work_data .= "comment\tコメント管理\n";

	foreach (split(/\n/, $work_data)) {
		my($work_id, $work_name) = split(/\t/);

		$html .= $skin_ins->get_replace_data(
			'login',
			WORK_ID   => $work_id,
			WORK_NAME => $work_name
		);
	}

	$html .= $skin_ins->get_data('login_foot');
	$html .= $skin_ins->get_data('footer');

	if ($agent eq 'mobile') {
		my($data, $length) = &get_mobile_data($html);

		print "Content-Type: text/html; charset=Shift_JIS\n";
		if ($ENV{'HTTP_USER_AGENT'} =~ /KDDI-|UP\.Browser/i) {
			print "Pragma: no-cache\n";
			print "Cache-Control: no-cache\n\n";
		} else {
			print "Content-Length: $length\n\n";
		}
		print $data;
	} else {
		print $basis_ins->header;
		print $html;
	}

	return;
}

### コメント編集
sub comment_edit {
	if ($agent ne 'mobile' and $ENV{'REQUEST_METHOD'} ne 'POST') {
		&error('不正なアクセスです。');
	}

	my($name, $mail, $url, $subj, $text, $pwd);
	if ($agent eq 'mobile') {
		$name = Jcode->new($parser_ins->get_query('name'), 'sjis')->utf8;
		$mail = Jcode->new($parser_ins->get_query('mail'), 'sjis')->utf8;
		$url  = Jcode->new($parser_ins->get_query('url'), 'sjis')->utf8;
		$subj = Jcode->new($parser_ins->get_query('subj'), 'sjis')->utf8;
		$text = Jcode->new($parser_ins->get_query('text'), 'sjis')->utf8;
		$pwd  = Jcode->new($parser_ins->get_query('pwd'), 'sjis')->utf8;
	} else {
		$name = $parser_ins->get_query('name');
		$mail = $parser_ins->get_query('mail');
		$url  = $parser_ins->get_query('url');
		$subj = $parser_ins->get_query('subj');
		$text = $parser_ins->get_query('text');
		$pwd  = $parser_ins->get_query('pwd');
	}

	my $name_ins = new webliberty::String($name);
	my $mail_ins = new webliberty::String($mail);
	my $url_ins  = new webliberty::String($url);
	my $subj_ins = new webliberty::String($subj);
	my $text_ins = new webliberty::String($text);
	my $pwd_ins  = new webliberty::String($pwd);

	$name_ins->create_line;
	$mail_ins->create_line;
	$url_ins->create_line;
	$subj_ins->create_line;
	$text_ins->create_text;
	$pwd_ins->create_line;

	if ($url_ins->get_string eq 'http://') {
		$url_ins->set_string('');
	}
	if ($pwd_ins->get_string) {
		$pwd_ins->create_password;
	}

	my $lock_ins = new webliberty::Lock($init->{lock_file});
	if (!$lock_ins->file_lock) {
		&error('ファイルがロックされています。時間をおいてもう一度投稿してください。');
	}

	my $host_ins = new webliberty::Host;

	my($new_data, $flag);

	open(FH, $init->{comment_dir} . $parser_ins->get_query('pno') . '.'. $init->{logs_ext}) or &error("Read Error : $init->{comment_dir}" . $parser_ins->get_query('pno') . '.' . $init->{logs_ext});
	while (<FH>) {
		chomp;
		my($no, $pno, $stat, $date, $name, $mail, $url, $subj, $text, $pwd, $host) = split(/\t/);

		if ($parser_ins->get_query('no') == $no) {
			if ($parser_ins->get_query('mode') eq 'admin') {
				$new_data .= "$no\t$pno\t$stat\t$date\t" . $name_ins->get_string . "\t" . $mail_ins->get_string . "\t" . $url_ins->get_string . "\t" . $subj_ins->get_string . "\t" . $text_ins->get_string . "\t$pwd\t$host\n";
			} else {
				my $key_ins = new webliberty::String($parser_ins->get_query('key'));
				if (!$pwd or !$key_ins->check_password($pwd)) {
					$lock_ins->file_unlock;
					&error("削除キーが違います。");
				}

				if ($parser_ins->get_query('whisper')) {
					$stat = 0;
				} else {
					$stat = 1;
				}

				$new_data .= "$no\t$pno\t$stat\t$date\t" . $name_ins->get_string . "\t" . $mail_ins->get_string . "\t" . $url_ins->get_string . "\t" . $subj_ins->get_string . "\t" . $text_ins->get_string . "\t" . $pwd_ins->get_string . "\t" . $host_ins->get_host . "\n";
			}

			$flag = 1;
		} else {
			$new_data .= "$_\n";
		}
	}
	close(FH);

	if (!$flag) {
		&error('指定されたコメントは存在しません。');
	}

	my($index_data, $flag);

	open(FH, $init->{comment_index}) or &error("Read Error : $init->{comment_index}");
	while (<FH>) {
		chomp;
		my($no, $pno, $stat, $date, $name, $subj, $host) = split(/\t/);

		if ($parser_ins->get_query('no') == $no) {
			if ($parser_ins->get_query('mode') eq 'admin') {
				$index_data .= "$no\t$pno\t$stat\t$date\t" . $name_ins->get_string . "\t" . $subj_ins->get_string . "\t$host\n";
			} else {
				if ($parser_ins->get_query('whisper')) {
					$stat = 0;
				} else {
					$stat = 1;
				}

				$index_data .= "$no\t$pno\t$stat\t$date\t" . $name_ins->get_string . "\t" . $subj_ins->get_string . "\t" . $host_ins->get_host . "\n";
			}

			$flag = 1;
		} else {
			$index_data .= "$_\n";
		}
	}
	close(FH);

	if (!$flag) {
		&error('指定されたインデックスは存在しません。');
	}

	open(FH, ">$init->{comment_dir}" . $parser_ins->get_query('pno') . '.' . $init->{logs_ext}) or &error("Write Error : $init->{comment_dir}" . $parser_ins->get_query('pno') . '.' . $init->{logs_ext});
	print FH $new_data;
	close(FH);

	open(FH, ">$init->{comment_index}") or &error("Write Error : $init->{comment_index}");
	print FH $index_data;
	close(FH);

	$lock_ins->file_unlock;

	return;
}

### コメント削除
sub comment_del {
	if ($agent ne 'mobile' and $ENV{'REQUEST_METHOD'} ne 'POST') {
		&error('不正なアクセスです。');
	}
	if (!$parser_ins->get_query('no') and !$parser_ins->get_query('del')) {
		&error('削除したいコメントを選択してください。');
	}

	my $lock_ins = new webliberty::Lock($init->{lock_file});
	if (!$lock_ins->file_lock) {
		&error('ファイルがロックされています。時間をおいてもう一度投稿してください。');
	}

	my($new_index, %del_file);

	open(FH, $init->{comment_index}) or &error("Read Error : $init->{comment_index}");
	while (<FH>) {
		chomp;
		my($no, $pno, $stat, $date, $name, $subj, $host) = split(/\t/);

		if ($parser_ins->get_query('mode') eq 'admin') {
			if ($parser_ins->get_query('del') =~ /(^|\n)$no(\n|$)/) {
				$del_file{"$init->{comment_dir}$pno\.$init->{logs_ext}"} = 1;
			} else {
				$new_index .= "$_\n";
			}
		} else {
			if ($parser_ins->get_query('no') =~ /(^|\n)$no(\n|$)/) {
				$del_file{"$init->{comment_dir}$pno\.$init->{logs_ext}"} = 1;
			} else {
				$new_index .= "$_\n";
			}
		}
	}
	close(FH);

	my $flag;

	foreach my $entry (keys %del_file) {
		my $new_data;

		open(FH, $entry) or &error("Read Error : $entry");
		while (<FH>) {
			chomp;
			my($no, $pno, $stat, $date, $name, $mail, $url, $subj, $text, $pwd, $host) = split(/\t/);

			if ($parser_ins->get_query('mode') eq 'admin') {
				if ($parser_ins->get_query('del') =~ /(^|\n)$no(\n|$)/) {
					$flag = 1;
				} else {
					$new_data .= "$_\n";
				}
			} else {
				if ($parser_ins->get_query('no') =~ /(^|\n)$no(\n|$)/) {
					my $pwd_ins = new webliberty::String($parser_ins->get_query('pwd'));
					if (!$pwd or !$pwd_ins->check_password($pwd)) {
						$lock_ins->file_unlock;
						&error('削除キーが違います。');
					}

					$flag = 1;
				} else {
					$new_data .= "$_\n";
				}
			}
		}
		close(FH);

		open(FH, ">$entry") or &error("Write Error : $entry");
		print FH $new_data;
		close(FH);
	}

	if (!$flag) {
		&error('指定されたコメントは存在しません。');
	}

	open(FH, ">$init->{comment_index}") or &error("Write Error : $init->{comment_index}");
	print FH $new_index;
	close(FH);

	$lock_ins->file_unlock;

	return;
}

### コメント編集フォーム
sub comment_form {
	my $edit_pno;
	open(FH, $init->{comment_index}) or &error("Read Error : $init->{comment_index}");
	while (<FH>) {
		chomp;
		my($no, $pno, $stat, $date, $name, $subj, $host) = split(/\t/);

		if ($parser_ins->get_query('no') == $no or $parser_ins->get_query('edit') == $no) {
			$edit_pno = $pno;

			last;
		}
	}
	close(FH);

	my($form_pno, $form_stat, $form_name, $form_mail, $form_url, $form_subj, $form_text, $flag);

	open(FH, "$init->{comment_dir}$edit_pno\.$init->{logs_ext}") or &error("Read Error : $init->{comment_dir}$edit_pno\.$init->{logs_ext}");
	while (<FH>) {
		chomp;
		my($no, $pno, $stat, $date, $name, $mail, $url, $subj, $text, $pwd, $host) = split(/\t/);

		if ($parser_ins->get_query('no') == $no or $parser_ins->get_query('edit') == $no) {
			if ($parser_ins->get_query('mode') ne 'admin') {
				my $pwd_ins = new webliberty::String($parser_ins->get_query('pwd'));
				if (!$pwd or !$pwd_ins->check_password($pwd)) {
					&error('削除キーが違います。');
				}
			}

			my $pno_ins  = new webliberty::String($pno);
			my $stat_ins = new webliberty::String($stat);
			my $name_ins = new webliberty::String($name);
			my $mail_ins = new webliberty::String($mail);
			my $url_ins  = new webliberty::String($url);
			my $subj_ins = new webliberty::String($subj);
			my $text_ins = new webliberty::String($text);

			$pno_ins->create_number;
			$stat_ins->create_number;
			$name_ins->create_line;
			$mail_ins->create_line;
			$url_ins->create_line;
			$subj_ins->create_line;
			$text_ins->create_text;

			$form_pno  = $pno_ins->create_plain;
			$form_name = $name_ins->create_plain;
			$form_mail = $mail_ins->create_plain;
			$form_url  = $url_ins->create_plain;
			$form_subj = $subj_ins->create_plain;
			$form_text = $text_ins->create_plain;

			$flag = 1;

			last;
		}
	}
	close(FH);

	if (!$flag) {
		&error('該当するコメントはありません。');
	}

	my $form_work;
	if ($parser_ins->get_query('mode') eq 'admin') {
		$form_work = 'comment';
	} else {
		$form_work = 'edit';
	}

	my($form_comment_start, $form_comment_end, $form_edit_start, $form_edit_end);
	if ($parser_ins->get_query('mode') eq 'view') {
		$form_edit_start = '<!--';
                $form_edit_end   = '-->';
	} else {
		$form_comment_start = '<!--';
                $form_comment_end   = '-->';
	}

	my $form_stat;
	if ($form_stat) {
		$form_stat = '<option value="">全体に公開</option><option value="1" selected="selected">管理者のみに公開</option>';
	} else {
		$form_stat = '<option value="" selected="selected">全体に公開</option><option value="1">管理者のみに公開</option>';
	}
	$form_stat = "<select name=\"whisper\" xml:lang=\"ja\" lang=\"ja\">$form_stat</select>";

	my($form_stat_start, $form_stat_end, $form_pwd_start, $form_pwd_end);
	if ($parser_ins->get_query('mode') eq 'admin') {
		$form_stat_start = '<!--';
		$form_stat_end   = '-->';
		$form_pwd_start  = '<!--';
		$form_pwd_end    = '-->';
	}

	my $skin_ins = new webliberty::Skin;
	if ($parser_ins->get_query('mode') eq 'admin') {
		if ($agent eq 'mobile') {
			$skin_ins->parse_skin($init->{skin_mobile_header});
			$skin_ins->parse_skin($init->{skin_mobile_view}, available => 'form');
			$skin_ins->parse_skin($init->{skin_mobile_footer});
		} else {
			$skin_ins->parse_skin($init->{skin_header});
			$skin_ins->parse_skin($init->{skin_view}, available => 'form');
			$skin_ins->parse_skin($init->{skin_footer});
		}
	} else {
		if ($agent eq 'mobile') {
			$skin_ins->parse_skin($init->{skin_mobile_header});
			$skin_ins->parse_skin($init->{skin_mobile_view});
			$skin_ins->parse_skin($init->{skin_mobile_footer});
		} else {
			$skin_ins->parse_skin($init->{skin_header});
			$skin_ins->parse_skin($init->{skin_view});
			$skin_ins->parse_skin($init->{skin_footer});
		}
	}

	my $method;
	if ($ENV{'HTTP_USER_AGENT'} =~ /(J-PHONE|KDDI-|UP\.Browser)/i) {
		$method = 'get';
	} else {
		$method = 'post';
	}
	$skin_ins->replace_skin(
		INFO_METHOD => $method,
		INFO_TITLE  => $init->{title},
		INFO_BACK   => $init->{back_url},
		INFO_FILE   => $init->{script_file},
		INFO_PWD    => $parser_ins->get_query('admin_pwd')
	);

	my $html;

	$html .= $skin_ins->get_data('header');
	if ($parser_ins->get_query('mode') eq 'admin') {
		$html .= &admin_work($skin_ins);
	}
	$html .= $skin_ins->get_replace_data(
		'form',
		FORM_MODE          => $parser_ins->get_query('mode'),
		FORM_WORK          => $form_work,
		FORM_NO            => $parser_ins->get_query('no') || $parser_ins->get_query('edit'),
		FORM_PNO           => $form_pno,
		FORM_STAT          => $form_stat,
		FORM_STAT_START    => $form_stat_start,
		FORM_STAT_END      => $form_stat_end,
		FORM_NAME          => $form_name,
		FORM_MAIL          => $form_mail,
		FORM_URL           => $form_url || 'http://',
		FORM_SUBJ          => $form_subj,
		FORM_TEXT          => $form_text,
		FORM_PWD           => $parser_ins->get_query('pwd'),
		FORM_PWD_START     => $form_pwd_start,
		FORM_PWD_END       => $form_pwd_end,
		FORM_SAVE_START    => '<!--',
		FORM_SAVE_END      => '-->',
		FORM_EDIT_START    => '',
		FORM_EDIT_END      => '',
		FORM_COMMENT_START => '<!--',
		FORM_COMMENT_END   => '-->'
	);

	$html .= $skin_ins->get_data('footer');

	if ($agent eq 'mobile') {
		my($data, $length) = &get_mobile_data($html);

		print "Content-Type: text/html; charset=Shift_JIS\n";
		if ($ENV{'HTTP_USER_AGENT'} =~ /KDDI-|UP\.Browser/i) {
			print "Pragma: no-cache\n";
			print "Cache-Control: no-cache\n\n";
		} else {
			print "Content-Length: $length\n\n";
		}
		print $data;
	} else {
		print $basis_ins->header;
		print $html;
	}

	return;
}

### ユーザーログイン画面表示
sub comment_login {
	my $message;
	if ($parser_ins->get_query('work') eq 'edit') {
		$message = 'コメントを編集しました。';
	} elsif ($parser_ins->get_query('work') eq 'del') {
		$message = 'コメントを削除しました。';
	} else {
		$message = '投稿時に設定した削除キーを入力してください。';
	}

	my $skin_ins = new webliberty::Skin;
	if ($agent eq 'mobile') {
		$skin_ins->parse_skin($init->{skin_mobile_header});
		$skin_ins->parse_skin($init->{skin_mobile_edit});
		$skin_ins->parse_skin($init->{skin_mobile_footer});
	} else {
		$skin_ins->parse_skin($init->{skin_header});
		$skin_ins->parse_skin($init->{skin_edit});
		$skin_ins->parse_skin($init->{skin_footer});
	}

	my $method;
	if ($ENV{'HTTP_USER_AGENT'} =~ /(J-PHONE|KDDI-|UP\.Browser)/i) {
		$method = 'get';
	} else {
		$method = 'post';
	}
	$skin_ins->replace_skin(
		INFO_METHOD  => $method,
		INFO_TITLE   => $init->{title},
		INFO_BACK    => $init->{back_url},
		INFO_FILE    => $init->{script_file},
		INFO_MESSAGE => $message
	);

	my $html;

	$html .= $skin_ins->get_data('header');
	$html .= $skin_ins->get_replace_data(
		'contents',
		FORM_NO   => $parser_ins->get_query('no'),
		FORM_LIST => '<option value="form">コメント編集</option><option value="del">コメント削除</option>'
	);
	$html .= $skin_ins->get_data('footer');

	if ($agent eq 'mobile') {
		my($data, $length) = &get_mobile_data($html);

		print "Content-Type: text/html; charset=Shift_JIS\n";
		if ($ENV{'HTTP_USER_AGENT'} =~ /KDDI-|UP\.Browser/i) {
			print "Pragma: no-cache\n";
			print "Cache-Control: no-cache\n\n";
		} else {
			print "Content-Length: $length\n\n";
		}
		print $data;
	} else {
		print $basis_ins->header;
		print $html;
	}

	return;
}

### 問い合わせ入力内容チェック
sub contact_check {
	if (!$init->{mail_mode}) {
		&error('不正なアクセスです。');
	}

	my $no_ins      = new webliberty::String($parser_ins->get_query('no'));
	my $subj_ins    = new webliberty::String($parser_ins->get_query('subj'));
	my $name_ins    = new webliberty::String($parser_ins->get_query('name'));
	my $mail_ins    = new webliberty::String($parser_ins->get_query('mail'));
	my $message_ins = new webliberty::String($parser_ins->get_query('message'));

	$no_ins->create_number;
	$subj_ins->create_line;
	$name_ins->create_line;
	$mail_ins->create_line;
	$message_ins->create_text;

	if (!$no_ins->get_string) {
		&error('不正なアクセスです。');
	}
	if (!$subj_ins->get_string) {
		&error('件名が入力されていません。');
	}
	if (!$name_ins->get_string) {
		&error('名前が入力されていません。');
	}
	if (!$mail_ins->get_string) {
		&error('メールアドレスが入力されていません。');
	}
	if (!$message_ins->get_string) {
		&error('メッセージが入力されていません。');
	}

	if ($mail_ins->get_string and ($mail_ins->get_string =~ /[^\w\.\@\d\+\-\_]/ or $mail_ins->get_string !~ /(.+)\@(.+)\.(.+)/)) {
		&error('メールアドレスの入力内容が正しくありません。');
	}

	return;
}

### 問い合わせメール送信
sub contact_complete {
	if (!$init->{mail_mode}) {
		&error('不正なアクセスです。');
	}
	if ($agent ne 'mobile' and $ENV{'REQUEST_METHOD'} ne 'POST') {
		&error('不正なアクセスです。');
	}

	my($subj, $name, $mail, $message);
	if ($agent eq 'mobile') {
		$subj    = Jcode->new($parser_ins->get_query('subj'), 'sjis')->utf8;
		$name    = Jcode->new($parser_ins->get_query('name'), 'sjis')->utf8;
		$mail    = Jcode->new($parser_ins->get_query('mail'), 'sjis')->utf8;
		$message = Jcode->new($parser_ins->get_query('message'), 'sjis')->utf8;
	} else {
		$subj    = $parser_ins->get_query('subj');
		$name    = $parser_ins->get_query('name');
		$mail    = $parser_ins->get_query('mail');
		$message = $parser_ins->get_query('message');
	}

	my $no_ins       = new webliberty::String($parser_ins->get_query('no'));
	my $subj_ins     = new webliberty::String($subj);
	my $name_ins     = new webliberty::String($name);
	my $mail_ins     = new webliberty::String($mail);
	my $message_ins  = new webliberty::String($message);
	my $sendcopy_ins = new webliberty::String($parser_ins->get_query('sendcopy'));

	if ($sendcopy_ins->get_string) {
		push(@{$init->{mailto_address}}, $mail_ins->create_line);
	}

	my $host_ins = new webliberty::Host;

	#メール送信
	my $sendmail_ins = new webliberty::Sendmail($init->{sendmail_path});
	foreach (@{$init->{mailto_address}}) {
		if (!$_) {
			next;
		}

		my($send_from, $message);
		if ($_ eq $mail_ins->create_line) {
			$message = "No." . $no_ins->create_number . "の予定から、以下のお問い合わせが送信されました。\n\n" . $message_ins->create_text;
			$send_from = $init->{mail_from};
		} else {
			$message = "No." . $no_ins->create_number . "の予定から、以下のお問い合わせが送信されました。\n\n" . $message_ins->create_text . "\n\nHost : " . $host_ins->get_host;
			$send_from = $mail_ins->get_string;
		}

		my $flag = $sendmail_ins->sendmail(
			send_to   => $_,
			send_from => $send_from,
			subject   => $subj_ins->create_line,
			name      => $name_ins->create_line,
			message   => $message
		);
		if (!$flag) {
			&error('メールの送信に失敗しました。');
		}
	}

	#送信完了画面
	my $skin_ins = new webliberty::Skin;
	if ($agent eq 'mobile') {
		$skin_ins->parse_skin($init->{skin_mobile_header});
		$skin_ins->parse_skin($init->{skin_mobile_contact_complete});
		$skin_ins->parse_skin($init->{skin_mobile_footer});
	} else {
		$skin_ins->parse_skin($init->{skin_header});
		$skin_ins->parse_skin($init->{skin_contact_complete});
		$skin_ins->parse_skin($init->{skin_footer});
	}

	my $method;
	if ($ENV{'HTTP_USER_AGENT'} =~ /(J-PHONE|KDDI-|UP\.Browser)/i) {
		$method = 'get';
	} else {
		$method = 'post';
	}
	$skin_ins->replace_skin(
		INFO_METHOD => $method,
		INFO_TITLE  => $init->{title},
		INFO_BACK   => $init->{back_url},
		INFO_FILE   => $init->{script_file},
		INFO_NO     => $parser_ins->get_query('no')
	);

	my $html;

	$html .= $skin_ins->get_data('header');
	$html .= $skin_ins->get_data('contents');
	$html .= $skin_ins->get_data('footer');

	if ($agent eq 'mobile') {
		my($data, $length) = &get_mobile_data($html);

		print "Content-Type: text/html; charset=Shift_JIS\n";
		if ($ENV{'HTTP_USER_AGENT'} =~ /KDDI-|UP\.Browser/i) {
			print "Pragma: no-cache\n";
			print "Cache-Control: no-cache\n\n";
		} else {
			print "Content-Length: $length\n\n";
		}
		print $data;
	} else {
		print $basis_ins->header;
		print $html;
	}

	return;
}

### コメント内容チェック
sub comment_check {
	my $name_ins = new webliberty::String($parser_ins->get_query('name'));
	my $subj_ins = new webliberty::String($parser_ins->get_query('subj'));
	my $text_ins = new webliberty::String($parser_ins->get_query('text'));

	$name_ins->create_line;
	$subj_ins->create_line;
	$text_ins->create_text;

	if (!$name_ins->get_string) {
		&error('名前が入力されていません。');
	}
	if (!$subj_ins->get_string) {
		&error('題名が入力されていません。');
	}
	if (!$text_ins->get_string) {
		&error('詳細内容が入力されていません。');
	}

	return;
}

### コメント投稿
sub comment_regist {
	if ($agent ne 'mobile' and $ENV{'REQUEST_METHOD'} ne 'POST') {
		&error('不正なアクセスです。');
	}

	my($name, $mail, $url, $subj, $text, $pwd);
	if ($agent eq 'mobile') {
		$name = Jcode->new($parser_ins->get_query('name'), 'sjis')->utf8;
		$mail = Jcode->new($parser_ins->get_query('mail'), 'sjis')->utf8;
		$url  = Jcode->new($parser_ins->get_query('url'), 'sjis')->utf8;
		$subj = Jcode->new($parser_ins->get_query('subj'), 'sjis')->utf8;
		$text = Jcode->new($parser_ins->get_query('text'), 'sjis')->utf8;
		$pwd  = Jcode->new($parser_ins->get_query('pwd'), 'sjis')->utf8;
	} else {
		$name = $parser_ins->get_query('name');
		$mail = $parser_ins->get_query('mail');
		$url  = $parser_ins->get_query('url');
		$subj = $parser_ins->get_query('subj');
		$text = $parser_ins->get_query('text');
		$pwd  = $parser_ins->get_query('pwd');
	}

	my $pno_ins  = new webliberty::String($parser_ins->get_query('pno'));
	my $name_ins = new webliberty::String($name);
	my $mail_ins = new webliberty::String($mail);
	my $url_ins  = new webliberty::String($url);
	my $subj_ins = new webliberty::String($subj);
	my $text_ins = new webliberty::String($text);
	my $pwd_ins  = new webliberty::String($pwd);

	$pno_ins->create_number;
	$name_ins->create_line;
	$mail_ins->create_line;
	$url_ins->create_line;
	$subj_ins->create_line;
	$text_ins->create_text;
	$pwd_ins->create_line;

	if ($url_ins->get_string eq 'http://') {
		$url_ins->set_string('');
	}

	if ($parser_ins->get_query('save')) {
		my $cookie_ins = new webliberty::Cookie($init->{cookie_id}, $init->{des_key});
		$cookie_ins->set_holddays($init->{cookie_holddays});
		$cookie_ins->set_cookie(
			name => $name_ins->get_string,
			mail => $mail_ins->get_string,
			url  => $url_ins->get_string,
			pwd  => $pwd_ins->get_string
		);
	} else {
		my $cookie_ins = new webliberty::Cookie($init->{cookie_id}, $init->{des_key});
		$cookie_ins->set_cookie;
	}

	my $lock_ins = new webliberty::Lock($init->{lock_file});
	if (!$lock_ins->file_lock) {
		&error('ファイルがロックされています。時間をおいてもう一度投稿してください。');
	}

	open(FH, $init->{comment_index}) or &error("Read Error : $init->{comment_index}");
	my @index = sort { $b <=> $a } <FH>;
	close(FH);

	my $new_no       = (split(/\t/, $index[0]))[0] + 1;
	my $comment_file = $init->{comment_dir} . $pno_ins->get_string . "\.$init->{logs_ext}";

	if (!-e $comment_file) {
		open(FH, ">$comment_file") or &error("Write Error : $comment_file");
		close(FH);

		chmod(0666, "$comment_file") or &error("Chmod Error : $comment_file");
	}

	if ($pwd_ins->get_string) {
		$pwd_ins->create_password;
	}
	my $host_ins = new webliberty::Host;

	my $comt_stat;
	if ($parser_ins->get_query('whisper')) {
		$comt_stat = 0;
	} else {
		$comt_stat = 1;
	}

	open(FH, ">>$comment_file") or &error("Write Error : $comment_file");
	print FH "$new_no\t" . $pno_ins->get_string . "\t$comt_stat\t" . time . "\t" . $name_ins->get_string . "\t" . $mail_ins->get_string . "\t" . $url_ins->get_string . "\t" . $subj_ins->get_string . "\t" . $text_ins->get_string . "\t" . $pwd_ins->get_string . "\t" . $host_ins->get_host . "\n";
	close(FH);

	unshift(@index, "$new_no\t" . $pno_ins->get_string . "\t$comt_stat\t" . time . "\t" . $name_ins->get_string . "\t" . $subj_ins->get_string . "\t" . $host_ins->get_host . "\n");

	open(FH, ">$init->{comment_index}") or &error("Write Error : $init->{comment_index}");
	print FH @index;
	close(FH);

	$lock_ins->file_unlock;

	return;
}

### 処理完了
sub comment_complete {
	if ($agent ne 'mobile' and $ENV{'REQUEST_METHOD'} ne 'POST') {
		&error('不正なアクセスです。');
	}

	my $skin_ins = new webliberty::Skin;
	if ($agent eq 'mobile') {
		$skin_ins->parse_skin($init->{skin_mobile_header});
		$skin_ins->parse_skin($init->{skin_mobile_complete});
		$skin_ins->parse_skin($init->{skin_mobile_footer});
	} else {
		$skin_ins->parse_skin($init->{skin_header});
		$skin_ins->parse_skin($init->{skin_complete});
		$skin_ins->parse_skin($init->{skin_footer});
	}

	my $method;
	if ($ENV{'HTTP_USER_AGENT'} =~ /(J-PHONE|KDDI-|UP\.Browser)/i) {
		$method = 'get';
	} else {
		$method = 'post';
	}
	$skin_ins->replace_skin(
		INFO_METHOD => $method,
		INFO_TITLE  => $init->{title},
		INFO_BACK   => $init->{back_url},
		INFO_FILE   => $init->{script_file},
		INFO_NO     => $parser_ins->get_query('pno')
	);

	my $html;

	$html .= $skin_ins->get_data('header');
	$html .= $skin_ins->get_data('contents');
	$html .= $skin_ins->get_data('footer');

	if ($agent eq 'mobile') {
		my($data, $length) = &get_mobile_data($html);

		print "Content-Type: text/html; charset=Shift_JIS\n";
		if ($ENV{'HTTP_USER_AGENT'} =~ /KDDI-|UP\.Browser/i) {
			print "Pragma: no-cache\n";
			print "Cache-Control: no-cache\n\n";
		} else {
			print "Content-Length: $length\n\n";
		}
		print $data;
	} else {
		print $basis_ins->header;
		print $html;
	}

	return;
}

### 予定検索
sub search {
	my $word;
	if ($agent eq 'mobile') {
		$word = Jcode->new($parser_ins->get_query('word'), 'sjis')->utf8;
	} else {
		$word = $parser_ins->get_query('word');
	}

	my $skin_ins = new webliberty::Skin;
	if ($agent eq 'mobile') {
		$skin_ins->parse_skin($init->{skin_mobile_header});
		$skin_ins->parse_skin($init->{skin_mobile_search});
		$skin_ins->parse_skin($init->{skin_mobile_footer});
	} else {
		$skin_ins->parse_skin($init->{skin_header});
		$skin_ins->parse_skin($init->{skin_search});
		$skin_ins->parse_skin($init->{skin_footer});
	}

	my $method;
	if ($ENV{'HTTP_USER_AGENT'} =~ /(J-PHONE|KDDI-|UP\.Browser)/i) {
		$method = 'get';
	} else {
		$method = 'post';
	}
	$skin_ins->replace_skin(
		INFO_METHOD => $method,
		INFO_TITLE  => $init->{title},
		INFO_BACK   => $init->{back_url},
		INFO_FILE   => $init->{script_file}
	);

	my $html;

	$html .= $skin_ins->get_data('header');

	my($cond_and, $cond_or);
	if ($parser_ins->get_query('cond') eq 'or') {
		$cond_and = '';
		$cond_or  = ' selected="selected"';
	} else {
		$cond_and = ' selected="selected"';
		$cond_or  = '';
	}

	$html .= $skin_ins->get_replace_data(
		'contents',
		FORM_WORD     => $word,
		FORM_COND_AND => $cond_and,
		FORM_COND_OR  => $cond_or
	);

	if ($word) {
		my $words = $word;
		$words =~ s/　/ /g;
		my @words = split(/\s+/, $words);

		opendir(DIR, $init->{logs_dir}) or &error("Read Error : $init->{logs_dir}");
		my @dir = sort { $b <=> $a } readdir(DIR);
		closedir(DIR);

		my $flag = 1;

		$html .= $skin_ins->get_data('article_head');

		foreach my $entry (@dir) {
			if ($entry !~ /^\d\d\d\d\d\d\.$init->{logs_ext}$/) {
				next;
			}
			if ($flag) {
				open(FH, "$init->{logs_dir}$entry") or &error("Read Error : $init->{logs_dir}$entry");
				while (<FH>) {
					chomp;
					my($no, $stat, $comt, $mail, $field, $name, $date, $time, $subj, $text, $file) = split(/\t/);

					if (!$stat) {
						next;
					}

					my $show_flag;

					foreach my $word (@words) {
						$word = lc($word);
						my $string = lc("$no\t$field\t$name\t$date\t$time\t$subj\t$text");

						if (index($string, $word) >= 0) {
							$show_flag = 1;
							if ($parser_ins->get_query('cond') eq 'or') {
								last;
							}
						} else {
							if ($parser_ins->get_query('cond') eq 'and') {
								$show_flag = 0;

								last;
							}
						}
					}

					if ($show_flag) {
						$html .= $skin_ins->get_replace_data(
							'article',
							&get_article($no, $stat, $comt, $mail, $field, $name, $date, $time, $subj, $text, $file)
						);
					}
				}
				close(FH);
			}
		}

		$html .= $skin_ins->get_data('article_foot');
	}

	$html .= $skin_ins->get_data('footer');

	if ($agent eq 'mobile') {
		my($data, $length) = &get_mobile_data($html);

		print "Content-Type: text/html; charset=Shift_JIS\n";
		if ($ENV{'HTTP_USER_AGENT'} =~ /KDDI-|UP\.Browser/i) {
			print "Pragma: no-cache\n";
			print "Cache-Control: no-cache\n\n";
		} else {
			print "Content-Length: $length\n\n";
		}
		print $data;
	} else {
		print $basis_ins->header;
		print $html;
	}

	return;
}

### 問い合わせプレビュー
sub contact_preview {
	if (!$init->{mail_mode}) {
		&error('不正なアクセスです。');
	}
	if ($agent ne 'mobile' and $ENV{'REQUEST_METHOD'} ne 'POST') {
		&error('不正なアクセスです。');
	}

	my($subj, $name, $mail, $message);
	if ($agent eq 'mobile') {
		$subj    = Jcode->new($parser_ins->get_query('subj'), 'sjis')->utf8;
		$name    = Jcode->new($parser_ins->get_query('name'), 'sjis')->utf8;
		$mail    = Jcode->new($parser_ins->get_query('mail'), 'sjis')->utf8;
		$message = Jcode->new($parser_ins->get_query('message'), 'sjis')->utf8;
	} else {
		$subj    = $parser_ins->get_query('subj');
		$name    = $parser_ins->get_query('name');
		$mail    = $parser_ins->get_query('mail');
		$message = $parser_ins->get_query('message');
	}

	my $no_ins       = new webliberty::String($parser_ins->get_query('no'));
	my $subj_ins     = new webliberty::String($subj);
	my $name_ins     = new webliberty::String($name);
	my $mail_ins     = new webliberty::String($mail);
	my $message_ins  = new webliberty::String($message);
	my $sendcopy_ins = new webliberty::String($parser_ins->get_query('sendcopy'));

	my $sendcopy_info;
	if ($sendcopy_ins->get_string) {
		$sendcopy_info = '送信する';
	} else {
		$sendcopy_info = '送信しない';
	}

	my $skin_ins = new webliberty::Skin;
	if ($agent eq 'mobile') {
		$skin_ins->parse_skin($init->{skin_mobile_header});
		$skin_ins->parse_skin($init->{skin_mobile_contact_preview});
		$skin_ins->parse_skin($init->{skin_mobile_footer});
	} else {
		$skin_ins->parse_skin($init->{skin_header});
		$skin_ins->parse_skin($init->{skin_contact_preview});
		$skin_ins->parse_skin($init->{skin_footer});
	}

	my $method;
	if ($ENV{'HTTP_USER_AGENT'} =~ /(J-PHONE|KDDI-|UP\.Browser)/i) {
		$method = 'get';
	} else {
		$method = 'post';
	}
	$skin_ins->replace_skin(
		INFO_METHOD => $method,
		INFO_TITLE  => $init->{title},
		INFO_BACK   => $init->{back_url},
		INFO_FILE   => $init->{script_file}
	);
	my $html;

	$html .= $skin_ins->get_data('header');
	$html .= $skin_ins->get_replace_data(
		'contents',
		VIEW_NO       => $no_ins->get_string,
		VIEW_SUBJ     => $subj_ins->create_line,
		VIEW_NAME     => $name_ins->create_line,
		VIEW_MAIL     => $mail_ins->create_line,
		VIEW_MESSAGE  => $message_ins->create_text,
		VIEW_SENDCOPY => $sendcopy_info,
		FORM_NO       => $no_ins->create_plain,
		FORM_SUBJ     => $subj_ins->create_plain,
		FORM_NAME     => $name_ins->create_plain,
		FORM_MAIL     => $mail_ins->create_plain,
		FORM_MESSAGE  => $message_ins->create_plain,
		FORM_SENDCOPY => $sendcopy_ins->create_plain
	);
	$html .= $skin_ins->get_data('footer');

	if ($agent eq 'mobile') {
		my($data, $length) = &get_mobile_data($html);

		print "Content-Type: text/html; charset=Shift_JIS\n";
		if ($ENV{'HTTP_USER_AGENT'} =~ /KDDI-|UP\.Browser/i) {
			print "Pragma: no-cache\n";
			print "Cache-Control: no-cache\n\n";
		} else {
			print "Content-Length: $length\n\n";
		}
		print $data;
	} else {
		print $basis_ins->header;
		print $html;
	}

	return;
}

### 問い合わせフォーム表示
sub contact_form {
	if (!$init->{mail_mode}) {
		&error('不正なアクセスです。');
	}

	my $edit_date;
	open(FH, $init->{logs_index}) or &error("Read Error : $init->{logs_index}");
	while (<FH>) {
		chomp;
		my($date, $time, $no, $stat) = split(/\t/);

		if ($parser_ins->get_query('no') == $no) {
			$edit_date = $date;

			last;
		}
	}
	close(FH);

	my $edit_file;
	if ($edit_date =~ /^(\d\d\d\d\d\d)\d\d$/) {
		$edit_file = "$init->{logs_dir}$1\.$init->{logs_ext}";
	}

	my($form_no, $form_subj, $flag);

	open(FH, $edit_file) or &error("Read Error : $edit_file");
	while (<FH>) {
		chomp;
		my($no, $stat, $comt, $mail, $field, $name, $date, $time, $subj, $text, $file) = split(/\t/);

		if ($stat and $parser_ins->get_query('no') == $no) {
			$form_no   = $no;
			$form_subj = $subj;
			$flag      = 1;

			last;
		}
	}
	close(FH);

	if (!$flag) {
		&error('該当する記事はありません。');
	}

	my $skin_ins = new webliberty::Skin;
	if ($agent eq 'mobile') {
		$skin_ins->parse_skin($init->{skin_mobile_header});
		$skin_ins->parse_skin($init->{skin_mobile_contact});
		$skin_ins->parse_skin($init->{skin_mobile_footer});
	} else {
		$skin_ins->parse_skin($init->{skin_header});
		$skin_ins->parse_skin($init->{skin_contact});
		$skin_ins->parse_skin($init->{skin_footer});
	}

	my $method;
	if ($ENV{'HTTP_USER_AGENT'} =~ /(J-PHONE|KDDI-|UP\.Browser)/i) {
		$method = 'get';
	} else {
		$method = 'post';
	}
	$skin_ins->replace_skin(
		INFO_METHOD => $method,
		INFO_TITLE  => $init->{title},
		INFO_BACK   => $init->{back_url},
		INFO_FILE   => $init->{script_file}
	);

	my $html;

	$html .= $skin_ins->get_data('header');
	$html .= $skin_ins->get_replace_data(
		'form',
		FORM_NO   => $form_no,
		FORM_SUBJ => $form_subj
	);
	$html .= $skin_ins->get_data('footer');

	if ($agent eq 'mobile') {
		my($data, $length) = &get_mobile_data($html);

		print "Content-Type: text/html; charset=Shift_JIS\n";
		if ($ENV{'HTTP_USER_AGENT'} =~ /KDDI-|UP\.Browser/i) {
			print "Pragma: no-cache\n";
			print "Cache-Control: no-cache\n\n";
		} else {
			print "Content-Length: $length\n\n";
		}
		print $data;
	} else {
		print $basis_ins->header;
		print $html;
	}

	return;
}

### 詳細表示
sub view {
	my $skin_ins = new webliberty::Skin;
	if ($agent eq 'mobile') {
		$skin_ins->parse_skin($init->{skin_mobile_header});
		$skin_ins->parse_skin($init->{skin_mobile_view});
		$skin_ins->parse_skin($init->{skin_mobile_footer});
	} else {
		$skin_ins->parse_skin($init->{skin_header});
		$skin_ins->parse_skin($init->{skin_view});
		$skin_ins->parse_skin($init->{skin_footer});
	}

	my $method;
	if ($ENV{'HTTP_USER_AGENT'} =~ /(J-PHONE|KDDI-|UP\.Browser)/i) {
		$method = 'get';
	} else {
		$method = 'post';
	}
	$skin_ins->replace_skin(
		INFO_METHOD => $method,
		INFO_TITLE  => $init->{title},
		INFO_BACK   => $init->{back_url},
		INFO_FILE   => $init->{script_file}
	);

	my $html;

	$html .= $skin_ins->get_data('header');

	my $edit_date;
	open(FH, $init->{logs_index}) or &error("Read Error : $init->{logs_index}");
	while (<FH>) {
		chomp;
		my($date, $time, $no, $stat) = split(/\t/);

		if ($parser_ins->get_query('no') == $no) {
			$edit_date = $date;

			last;
		}
	}
	close(FH);

	my $edit_file;
	if ($edit_date =~ /^(\d\d\d\d\d\d)\d\d$/) {
		$edit_file = "$init->{logs_dir}$1\.$init->{logs_ext}";
	}

	my($form_comt, $form_subj, $flag);

	open(FH, $edit_file) or &error("Read Error : $edit_file");
	while (<FH>) {
		chomp;
		my($no, $stat, $comt, $mail, $field, $name, $date, $time, $subj, $text, $file) = split(/\t/);

		if ($stat and $parser_ins->get_query('no') == $no) {
			if ($parser_ins->get_query('work') ne 'comment' and $parser_ins->get_query('work') ne 'form') {
				$html .= $skin_ins->get_replace_data(
					'view',
					&get_article($no, $stat, $comt, $mail, $field, $name, $date, $time, $subj, $text, $file)
				);
			}

			$form_comt = $comt;
			$form_subj = 'Re: ' . $subj;
			$flag = 1;

			last;
		}
	}
	close(FH);

	if (!$flag) {
		$html .= $skin_ins->get_replace_data(
			'view',
			&get_article('', 1, 0, '', '', '', 'Nothing', '該当する予定はありません。', '')
		);
	}

	if ($form_comt) {
		my $i;

		my $comment_file = $init->{comment_dir} . $parser_ins->get_query('no') . '.' . $init->{logs_ext};
		if (-s $comment_file) {
			if ($agent ne 'mobile' or $parser_ins->get_query('work') eq 'comment') {
				$html .= $skin_ins->get_data('comment_head');
			}

			open(FH, $comment_file) or &error("Read Error : $comment_file");
			while (<FH>) {
				chomp;
				my($no, $pno, $stat, $date, $name, $mail, $url, $subj, $text, $pwd, $host) = split(/\t/);

				if ($agent ne 'mobile' or $parser_ins->get_query('work') eq 'comment') {
					$html .= $skin_ins->get_replace_data(
						'comment',
						&get_comment($no, $pno, $stat, $date, $name, $mail, $url, $subj, $text, $pwd, $host)
					);
				}

				$i++;
			}
			close(FH);

			if ($agent ne 'mobile' or $parser_ins->get_query('work') eq 'comment') {
				$html .= $skin_ins->get_data('comment_foot');
			}
		} else {
			if ($parser_ins->get_query('work') eq 'comment') {
				&error('コメントはまだ投稿されていません。');
			}
		}

		if ($agent eq 'mobile' and !$parser_ins->get_query('work')) {
			$html .= $skin_ins->get_replace_data(
				'noform',
				NOFORM_NO      => $parser_ins->get_query('no'),
				NOFORM_COMMENT => $i || 0
			);
		} elsif ($agent ne 'mobile' or $parser_ins->get_query('work') eq 'form') {
			my $cookie_ins = new webliberty::Cookie($init->{cookie_id}, $init->{des_key});

			my($form_comment_start, $form_comment_end, $form_edit_start, $form_edit_end);
			if ($parser_ins->get_query('mode') eq 'view') {
				$form_edit_start = '<!--';
		                $form_edit_end   = '-->';
			} else {
				$form_comment_start = '<!--';
		                $form_comment_end   = '-->';
			}

			my $form_stat;
			if (0) {
				$form_stat = '<option value="">全体に公開</option><option value="1" selected="selected">管理者のみに公開</option>';
			} else {
				$form_stat = '<option value="" selected="selected">全体に公開</option><option value="1">管理者のみに公開</option>';
			}
			$form_stat = "<select name=\"whisper\" xml:lang=\"ja\" lang=\"ja\">$form_stat</select>";

			$html .= $skin_ins->get_replace_data(
				'form',
				FORM_MODE          => 'comment',
				FORM_WORK          => '',
				FORM_NO            => $parser_ins->get_query('no'),
				FORM_PNO           => $parser_ins->get_query('no'),
				FORM_STAT          => $form_stat,
				FORM_NAME          => $cookie_ins->get_cookie('name'),
				FORM_MAIL          => $cookie_ins->get_cookie('mail'),
				FORM_URL           => $cookie_ins->get_cookie('url') || 'http://',
				FORM_SUBJ          => $form_subj,
				FORM_TEXT          => '',
				FORM_PWD           => $cookie_ins->get_cookie('pwd'),
				FORM_EDIT_START    => $form_edit_start,
				FORM_EDIT_END      => $form_edit_end,
				FORM_COMMENT_START => $form_comment_start,
				FORM_COMMENT_END   => $form_comment_end
			);
		}
	}

	$html .= $skin_ins->get_data('footer');

	if ($agent eq 'mobile') {
		my($data, $length) = &get_mobile_data($html);

		print "Content-Type: text/html; charset=Shift_JIS\n";
		if ($ENV{'HTTP_USER_AGENT'} =~ /KDDI-|UP\.Browser/i) {
			print "Pragma: no-cache\n";
			print "Cache-Control: no-cache\n\n";
		} else {
			print "Content-Length: $length\n\n";
		}
		print $data;
	} else {
		print $basis_ins->header;
		print $html;
	}

	return;
}

### 一覧表示
sub list {
	my $show_date;
	if ($parser_ins->get_query('date') =~ /^\d\d\d\d$/) {
		$show_date = $parser_ins->get_query('date');
	} else {
		my($sec, $min, $hour, $day, $mon, $year) = localtime(time);
		$show_date = $year + 1900;
	}

	my @dir;
	opendir(DIR, $init->{logs_dir}) or &error("Read Error : $init->{logs_dir}");
	if ($init->{sort_mode}) {
		@dir = sort { $b <=> $a } readdir(DIR);
	} else {
		@dir = sort { $a <=> $b } readdir(DIR);
	}
	closedir(DIR);

	my %years;
	foreach my $entry (@dir) {
		if ($entry =~ /^(\d\d\d\d)\d\d\.$init->{logs_ext}$/) {
			$years{$1} = 1;
		}
	}

	my $date_list;
	foreach (sort keys %years) {
		if ($show_date == $_) {
			$date_list .= "<option value=\"$_\" selected=\"selected\">$_年</option>";
		} else {
			$date_list .= "<option value=\"$_\">$_年</option>";
		}
	}

	my $skin_ins = new webliberty::Skin;
	if ($agent eq 'mobile') {
		$skin_ins->parse_skin($init->{skin_mobile_header});
		$skin_ins->parse_skin($init->{skin_mobile_list});
		$skin_ins->parse_skin($init->{skin_mobile_footer});
	} else {
		$skin_ins->parse_skin($init->{skin_header});
		$skin_ins->parse_skin($init->{skin_list});
		$skin_ins->parse_skin($init->{skin_footer});
	}

	my $method;
	if ($ENV{'HTTP_USER_AGENT'} =~ /(J-PHONE|KDDI-|UP\.Browser)/i) {
		$method = 'get';
	} else {
		$method = 'post';
	}
	$skin_ins->replace_skin(
		INFO_METHOD => $method,
		INFO_TITLE  => $init->{title},
		INFO_BACK   => $init->{back_url},
		INFO_FILE   => $init->{script_file},
		INFO_LIST   => $date_list,
		INFO_YEAR   => $show_date
	);

	my $html;

	$html .= $skin_ins->get_data('header');
	$html .= $skin_ins->get_data('article_head');

	my $sort;
	if (!$init->{sort_mode}) {
		$sort = 'reverse';
	}

	foreach my $entry (@dir) {
		if ($entry !~ /^(\d\d\d\d)\d\d\.$init->{logs_ext}$/) {
			next;
		}
		if ($1 != $show_date) {
			next;
		}

		open(FH, "$init->{logs_dir}$entry") or &error("Read Error : $init->{logs_dir}$entry");
		foreach (eval "$sort <FH>") {
			chomp;
			my($no, $stat, $comt, $mail, $field, $name, $date, $time, $subj, $text, $file) = split(/\t/);

			if (!$stat) {
				next;
			}

			$html .= $skin_ins->get_replace_data(
				'article',
				&get_article($no, $stat, $comt, $mail, $field, $name, $date, $time, $subj, $text, $file)
			);
		}
		close(FH);
	}

	$html .= $skin_ins->get_data('article_foot');
	$html .= $skin_ins->get_data('footer');

	if ($agent eq 'mobile') {
		my($data, $length) = &get_mobile_data($html);

		print "Content-Type: text/html; charset=Shift_JIS\n";
		if ($ENV{'HTTP_USER_AGENT'} =~ /KDDI-|UP\.Browser/i) {
			print "Pragma: no-cache\n";
			print "Cache-Control: no-cache\n\n";
		} else {
			print "Content-Length: $length\n\n";
		}
		print $data;
	} else {
		print $basis_ins->header;
		print $html;
	}

	return;
}

### カレンダー表示
sub calendar {
	my($this_year, $this_month);
	if ($parser_ins->get_query('date') =~ /^(\d\d\d\d)(\d\d)$/) {
		$this_year  = $1;
		$this_month = $2;
	} else {
		my($sec, $min, $hour, $day, $mon, $year) = localtime(time);
		$this_year  = $year + 1900;
		$this_month = sprintf("%02d", $mon + 1);
	}

	my $prev_month = $this_month - 1;
	my $prev_year  = $this_year;
	if ($prev_month < 1) {
		$prev_month = 12;
		$prev_year--;
	}

	my $next_month = $this_month + 1;
	my $next_year  = $this_year;
	if ($next_month > 12) {
		$next_month = 1;
		$next_year++;
	}

	#祝日定義（2006年～2015年）
	my %holidays = (
		'2006' => {'0101' => '元日', '0102' => '振替休日', '0109' => '成人の日', '0211' => '建国記念の日', '0321' => '春分の日', '0429' => '昭和の日', '0503' => '憲法記念日', '0504' => 'みどりの日', '0505' => 'こどもの日', '0717' => '海の日', '0918' => '敬老の日', '0923' => '秋分の日', '1009' => '体育の日', '1103' => '文化の日', '1123' => '勤労感謝の日', '1223' => '天皇誕生日'},
		'2007' => {'0101' => '元日', '0108' => '成人の日', '0211' => '建国記念の日', '0212' => '振替休日', '0321' => '春分の日', '0429' => '昭和の日', '0430' => '振替休日', '0503' => '憲法記念日', '0504' => 'みどりの日', '0505' => 'こどもの日', '0716' => '海の日', '0917' => '敬老の日', '0923' => '秋分の日', '0924' => '振替休日', '1008' => '体育の日', '1103' => '文化の日', '1123' => '勤労感謝の日', '1223' => '天皇誕生日', '1224' => '振替休日'},
		'2008' => {'0101' => '元日', '0114' => '成人の日', '0211' => '建国記念の日', '0320' => '春分の日', '0429' => '昭和の日', '0503' => '憲法記念日', '0504' => 'みどりの日', '0505' => 'こどもの日', '0506' => '振替休日', '0721' => '海の日', '0915' => '敬老の日', '0923' => '秋分の日', '1013' => '体育の日', '1103' => '文化の日', '1123' => '勤労感謝の日', '1124' => '振替休日', '1223' => '天皇誕生日'},
		'2009' => {'0101' => '元日', '0112' => '成人の日', '0211' => '建国記念の日', '0320' => '春分の日', '0429' => '昭和の日', '0503' => '憲法記念日', '0504' => 'みどりの日', '0505' => 'こどもの日', '0506' => '振替休日', '0720' => '海の日', '0921' => '敬老の日', '0922' => '国民の休日', '0923' => '秋分の日', '1012' => '体育の日', '1103' => '文化の日', '1123' => '勤労感謝の日', '1223' => '天皇誕生日'},
		'2010' => {'0101' => '元日', '0111' => '成人の日', '0211' => '建国記念の日', '0321' => '春分の日', '0322' => '振替休日', '0429' => '昭和の日', '0503' => '憲法記念日', '0504' => 'みどりの日', '0505' => 'こどもの日', '0719' => '海の日', '0920' => '敬老の日', '0923' => '秋分の日', '1011' => '体育の日', '1103' => '文化の日', '1123' => '勤労感謝の日', '1223' => '天皇誕生日'},
		'2011' => {'0101' => '元日', '0110' => '成人の日', '0211' => '建国記念の日', '0321' => '春分の日', '0429' => '昭和の日', '0503' => '憲法記念日', '0504' => 'みどりの日', '0505' => 'こどもの日', '0718' => '海の日', '0919' => '敬老の日', '0923' => '秋分の日', '1010' => '体育の日', '1103' => '文化の日', '1123' => '勤労感謝の日', '1223' => '天皇誕生日'},
		'2012' => {'0101' => '元日', '0102' => '振替休日', '0109' => '成人の日', '0211' => '建国記念の日', '0320' => '春分の日', '0429' => '昭和の日', '0430' => '振替休日', '0503' => '憲法記念日', '0504' => 'みどりの日', '0505' => 'こどもの日', '0716' => '海の日', '0917' => '敬老の日', '0922' => '秋分の日', '1008' => '体育の日', '1103' => '文化の日', '1123' => '勤労感謝の日', '1223' => '天皇誕生日', '1224' => '振替休日'},
		'2013' => {'0101' => '元日', '0114' => '成人の日', '0211' => '建国記念の日', '0320' => '春分の日', '0429' => '昭和の日', '0503' => '憲法記念日', '0504' => 'みどりの日', '0505' => 'こどもの日', '0506' => '振替休日', '0715' => '海の日', '0916' => '敬老の日', '0923' => '秋分の日', '1014' => '体育の日', '1103' => '文化の日', '1104' => '振替休日', '1123' => '勤労感謝の日', '1223' => '天皇誕生日'},
		'2014' => {'0101' => '元日', '0113' => '成人の日', '0211' => '建国記念の日', '0321' => '春分の日', '0429' => '昭和の日', '0503' => '憲法記念日', '0504' => 'みどりの日', '0505' => 'こどもの日', '0506' => '振替休日', '0721' => '海の日', '0915' => '敬老の日', '0923' => '秋分の日', '1013' => '体育の日', '1103' => '文化の日', '1123' => '勤労感謝の日', '1124' => '振替休日', '1223' => '天皇誕生日'},
		'2015' => {'0101' => '元日', '0112' => '成人の日', '0211' => '建国記念の日', '0321' => '春分の日', '0429' => '昭和の日', '0503' => '憲法記念日', '0504' => 'みどりの日', '0505' => 'こどもの日', '0506' => '振替休日', '0720' => '海の日', '0921' => '敬老の日', '0922' => '国民の休日', '0923' => '秋分の日', '1012' => '体育の日', '1103' => '文化の日', '1123' => '勤労感謝の日', '1223' => '天皇誕生日'}
	);

	my $day_ins  = new webliberty::Date;
	my $week_key = $day_ins->get_week(sprintf("%04d-%02d-01", $this_year, $this_month));
	my $last_day = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)[$this_month - 1] + ($this_month == 2 and (($this_year % 4 == 0 and $this_year % 100 != 0) or $this_year % 400 == 0));

	my $skin_ins = new webliberty::Skin;
	if ($agent eq 'mobile') {
		$skin_ins->parse_skin($init->{skin_mobile_header});
		$skin_ins->parse_skin($init->{skin_mobile_calendar});
		$skin_ins->parse_skin($init->{skin_mobile_footer});
	} else {
		$skin_ins->parse_skin($init->{skin_header});
		$skin_ins->parse_skin($init->{skin_calendar});
		$skin_ins->parse_skin($init->{skin_footer});
	}

	my $method;
	if ($ENV{'HTTP_USER_AGENT'} =~ /(J-PHONE|KDDI-|UP\.Browser)/i) {
		$method = 'get';
	} else {
		$method = 'post';
	}
	$skin_ins->replace_skin(
		INFO_METHOD         => $method,
		INFO_TITLE          => $init->{title},
		INFO_BACK           => $init->{back_url},
		INFO_FILE           => $init->{script_file},
		CALENDAR_THIS_YEAR  => int($this_year),
		CALENDAR_THIS_MONTH => ${$init->{months}}[int($this_month) - 1],
		CALENDAR_PREV_YEAR  => sprintf("%04d", $prev_year),
		CALENDAR_PREV_MONTH => sprintf("%02d", $prev_month),
		CALENDAR_NEXT_YEAR  => sprintf("%04d", $next_year),
		CALENDAR_NEXT_MONTH => sprintf("%02d", $next_month)
	);

	my $html;

	$html .= $skin_ins->get_data('header');

	my %logs;
	if (open(FH, "$init->{logs_dir}$this_year$this_month.$init->{logs_ext}")) {
		while (<FH>) {
			chomp;
			my($no, $stat, $comt, $mail, $field, $name, $date, $time, $subj, $text, $file) = split(/\t/);

			if ($stat and $date =~ /^\d\d\d\d\d\d(\d\d)$/) {
				$logs{$1} = "$_\n" . $logs{$1};
			}
		}
		close(FH);
	}

	$html .= $skin_ins->get_data('calendar_head');

	my($show_flag, $stat, $day, $week_number);

	foreach (1 .. 42) {
		if (($_ - 1) % 7 == $week_key) {
			$show_flag = 1;
		}
		if ($day == $last_day) {
			$show_flag = 0;
		}
		if (($_ - 1 - $week_key) % 7 == 0 and $show_flag) {
			$week_number++;
		}

		if ($_ % 7 == 1) {
			$html .= $skin_ins->get_data('calendar_weekhead');
		}

		if ($show_flag) {
			$day++;

			my $date = sprintf("%04d%02d%02d", $this_year, $this_month, $day);
			my $holiday;
			my $plan;

			if ($_ % 7 == 1) {
				$stat = 'sunday';
			} elsif ($_ % 7 == 0) {
				$stat = 'satday';
			} else {
				$stat = 'day';
			}

			if ($holidays{sprintf("%04d", $this_year)}{sprintf("%02d%02d", $this_month, $day)}) {
				$stat    = 'sunday';
				$holiday = $holidays{sprintf("%04d", $this_year)}{sprintf("%02d%02d", $this_month, $day)}
			}

			foreach my $days (keys %{$init->{days_plan}}) {
				if ((sprintf("%02d", $this_month) . sprintf("%02d", $day)) eq $days) {
					$plan = ${$init->{days_plan}}{$days};

					last;
				}
			}

			my %plan;
			if ($_ % 7 == 1) {
				%plan = %{$init->{sun_plan}};
			} elsif ($_ % 7 == 2) {
				%plan = %{$init->{mon_plan}};
			} elsif ($_ % 7 == 3) {
				%plan = %{$init->{tue_plan}};
			} elsif ($_ % 7 == 4) {
				%plan = %{$init->{wed_plan}};
			} elsif ($_ % 7 == 5) {
				%plan = %{$init->{thu_plan}};
			} elsif ($_ % 7 == 6) {
				%plan = %{$init->{fri_plan}};
			} elsif ($_ % 7 == 0) {
				%plan = %{$init->{sat_plan}};
			}
			foreach my $days (keys %plan) {
				my($month, $week) = split(/,/, $days);

				if ((!$month or sprintf("%02d", $this_month) eq $month) and (!$week or $week_number eq $week) and $plan{$days}) {
					if ($plan) {
						$plan .= '・';
					}
					$plan .= $plan{$days};

					last;
				}
			}

			my $skin;
			if ($stat eq 'sunday') {
				$skin = 'calendar_sunday';
			} elsif ($stat eq 'satday') {
				$skin = 'calendar_satday';
			} else {
				$skin = 'calendar_day';
			}

			my($holiday_start, $holiday_end);
			if (!$holiday) {
				$holiday_start = '<!--';
				$holiday_end   = '-->';
			}

			my($plan_start, $plan_end);
			if (!$plan) {
				$plan_start = '<!--';
				$plan_end   = '-->';
			}

			my($delimiter_start, $delimiter_end);
			if (!$holiday or !$plan) {
				$delimiter_start = '<!--';
				$delimiter_end   = '-->';
			}

			$html .= $skin_ins->get_replace_data(
				$skin . '_head',
				CALENDAR_YEAR            => int($this_year),
				CALENDAR_MONTH           => int($this_month),
				CALENDAR_DAY             => $day,
				CALENDAR_HOLIDAY         => $holiday,
				CALENDAR_HOLIDAY_START   => $holiday_start,
				CALENDAR_HOLIDAY_END     => $holiday_end,
				CALENDAR_PLAN            => $plan,
				CALENDAR_PLAN_START      => $plan_start,
				CALENDAR_PLAN_END        => $plan_end,
				CALENDAR_DELIMITER_START => $delimiter_start,
				CALENDAR_DELIMITER_END   => $delimiter_end,
				CALENDAR_WEEK            => ${$init->{weeks}}[($_ + 6) % 7],
				CALENDAR_CODE            => $date
			);

			if (exists($logs{sprintf("%02d", $day)})) {
				$html .= $skin_ins->get_data('list_head');

				foreach my $log (split(/\n/, $logs{sprintf("%02d", $day)})) {
					chomp;
					my($no, $stat, $comt, $mail, $field, $name, $date, $time, $subj, $text, $file) = split(/\t/, $log);

					$html .= $skin_ins->get_replace_data(
						'list',
						&get_article($no, $stat, $comt, $mail, $field, $name, $date, $time, $subj, $text, $file)
					);
				}

				$html .= $skin_ins->get_data('list_foot');
			}

			$html .= $skin_ins->get_replace_data(
				$skin . '_foot',
				CALENDAR_YEAR            => int($this_year),
				CALENDAR_MONTH           => int($this_month),
				CALENDAR_DAY             => $day,
				CALENDAR_HOLIDAY         => $holiday,
				CALENDAR_HOLIDAY_START   => $holiday_start,
				CALENDAR_HOLIDAY_END     => $holiday_end,
				CALENDAR_PLAN            => $plan,
				CALENDAR_PLAN_START      => $plan_start,
				CALENDAR_PLAN_END        => $plan_end,
				CALENDAR_DELIMITER_START => $delimiter_start,
				CALENDAR_DELIMITER_END   => $delimiter_end,
				CALENDAR_WEEK            => ${$init->{weeks}}[($_ + 6) % 7],
				CALENDAR_CODE            => $date
			);
		} else {
			$html .= $skin_ins->get_data('calendar_void');
		}

		if ($_ % 7 == 0) {
			$html .= $skin_ins->get_data('calendar_weekfoot');
		}
	}

	$html .= $skin_ins->get_data('calendar_foot');

	$html .= $skin_ins->get_data('footer');

	if ($agent eq 'mobile') {
		my($data, $length) = &get_mobile_data($html);

		print "Content-Type: text/html; charset=Shift_JIS\n";
		if ($ENV{'HTTP_USER_AGENT'} =~ /KDDI-|UP\.Browser/i) {
			print "Pragma: no-cache\n";
			print "Cache-Control: no-cache\n\n";
		} else {
			print "Content-Length: $length\n\n";
		}
		print $data;
	} else {
		print $basis_ins->header;
		print $html;
	}

	return;
}

### 予定表示
sub get_article {
	my($no, $stat, $comt, $mail, $field, $name, $date, $time, $subj, $text, $file) = @_;

	my $no_ins    = new webliberty::String($no);
	my $stat_ins  = new webliberty::String($stat);
	my $comt_ins  = new webliberty::String($comt);
	my $mail_ins  = new webliberty::String($mail);
	my $date_ins  = new webliberty::String($date);
	my $time_ins  = new webliberty::String($time);
	my $field_ins = new webliberty::String($field);
	my $name_ins  = new webliberty::String($name);
	my $subj_ins  = new webliberty::String($subj);
	my $text_ins  = new webliberty::String($text);
	my $file_ins  = new webliberty::String($file);

	$no_ins->create_number;
	$stat_ins->create_number;
	$comt_ins->create_number;
	$mail_ins->create_number;
	$date_ins->create_line;
	$time_ins->create_line;
	$field_ins->create_line;
	$name_ins->create_line;
	$subj_ins->create_line;
	$text_ins->create_text;

	if ($stat_ins->get_string) {
		$stat_ins->set_string('公開');
	} else {
		$stat_ins->set_string('下書き');
	}

	my($article_mail_start, $article_mail_end);
	if (!$init->{mail_mode} or !$mail_ins->get_string) {
		$article_mail_start = '<!--';
		$article_mail_end   = '-->';
	}

	my($article_year, $article_month, $article_day, $article_week);
	if ($date_ins->get_string =~ /^(\d\d\d\d)(\d\d)(\d\d)$/) {
		my $day_ins = new webliberty::Date;
		my $week = $day_ins->get_week("$1-$2-$3");

		$article_year  = $1 + 0;
		$article_month = $2 + 0;
		$article_day   = $3 + 0;
		$article_week  = ${$init->{weeks}}[$week];
	}

	my($article_hour1, $article_minute1, $article_time1_start, $article_time1_end);
	if ($time_ins->get_string =~ /^(\d\d)(\d\d)-/) {
		$article_hour1   = $1;
		$article_minute1 = $2;
	} else {
		$article_time1_start = '<!--';
		$article_time1_end   = '-->';
	}

	my($article_hour2, $article_minute2, $article_time2_start, $article_time2_end);
	if ($time_ins->get_string =~ /-(\d\d)(\d\d)$/) {
		$article_hour2   = $1;
		$article_minute2 = $2;
	} else {
		$article_time2_start = '<!--';
		$article_time2_end   = '-->';
	}

	my($article_time_start, $article_time_end);
	if ($time_ins->get_string !~ /^(\d\d)(\d\d)-/ and $time_ins->get_string !~ /-(\d\d)(\d\d)$/) {
		$article_time_start = '<!--';
		$article_time_end   = '-->';
	}

	my($article_field_start, $article_field_end, $article_color, $article_icon);
	if ($field_ins->get_string) {
		$article_color = ${$init->{field_color}}{$field_ins->get_string};
		$article_icon  = ${$init->{field_icon}}{$field_ins->get_string};
	} else {
		$article_field_start = '<!--';
		$article_field_end   = '-->';
	}

	my($article_color_start, $article_color_end, $article_icon_start, $article_icon_end);
	if (!$article_color) {
		$article_color_start = '<!--';
		$article_color_end   = '-->';
	}
	if (!$article_icon) {
		$article_icon_start = '<!--';
		$article_icon_end   = '-->';
	}

	my($article_name_start, $article_name_end);
	if (!$name_ins->get_string) {
		$article_name_start = '<!--';
		$article_name_end   = '-->';
	}

	$text_ins->permit_html;

	if ($subj_ins->get_string) {
		if (!$parser_ins->get_query('mode')) {
			$subj_ins->trim_string($init->{max_subj_length}, '...');
		}
	} else {
		$subj_ins->set_string('No Title');
	}

	if ($init->{autolink_mode}) {
		$text_ins->create_link($init->{autolink_attribute});
	}
	my($article_text_start, $article_text_end);
	if (!$text_ins->get_string) {
		$article_text_start = '<!--';
		$article_text_end   = '-->';
	}

	my($article_files, $article_file_start, $article_file_end);
	my($article_file1, $article_file2, $article_file3) = split(/<>/, $file_ins->get_string);

	my $target = " $init->{file_attribute}";

	if ($article_file1 or $article_file2 or $article_file3) {
		my $i;

		foreach ($article_file1, $article_file2, $article_file3) {
			my $file_ins = new webliberty::File("$init->{upfile_dir}$_");
			my($width, $height) = $file_ins->get_size;

			my $flag;
			if ($width > $init->{img_maxwidth}) {
				$height = int($height / ($width / $init->{img_maxwidth}));
				$width  = $init->{img_maxwidth};

				$flag = 1;
			}

			my $file;
			if ($_) {
				if ($agent eq 'mobile' and $width > 0 and $height > 0) {
					$file = "<a href=\"$init->{upfile_dirlink}$_\">画像 $_</a><br />";
				} elsif ($flag and $width > 0 and $height > 0) {
					$file = "<a href=\"$init->{upfile_dirlink}$_\"$target><img src=\"$init->{upfile_dirlink}$_\" alt=\"画像 $_\" width=\"$width\" height=\"$height\" /></a>";
				} elsif ($width > 0 and $height > 0) {
					$file = "<img src=\"$init->{upfile_dirlink}$_\" alt=\"画像 $_\" width=\"$width\" height=\"$height\" />";
				} else {
					$file = "<a href=\"$init->{upfile_dirlink}$_\"$target>画像 $_</a><br />";
				}
			}

			$i++;

			if ($text_ins->get_string =~ /\$FILE${i}_l/) {
				$file =~ s/ \/>/ style="float:left" \/>/;

				$text_ins->replace_string('\$FILE' . $i . '_l', $file);
			} elsif ($text_ins->get_string =~ /\$FILE${i}_r/) {
				$file =~ s/ \/>/ style="float:right" \/>/;

				$text_ins->replace_string('\$FILE' . $i . '_r', $file);
			} elsif ($text_ins->get_string =~ /\$FILE${i}_c/) {
				$file = "<span style=\"text-align:center;display:block;\">$file</span>";

				$text_ins->replace_string('\$FILE' . $i . '_c', $file);
			} elsif ($text_ins->get_string =~ /\$FILE${i}_path/) {
				$file = "$init->{upfile_dirlink}$_";

				$text_ins->replace_string('\$FILE' . $i . '_path', $file);
			} elsif ($text_ins->get_string =~ /\$FILE${i}_full/) {
				if ($agent ne 'mobile' and $flag and $width > 0 and $height > 0) {
					my($width, $height) = $file_ins->get_size;

					$file = "<img src=\"$init->{upfile_dirlink}$_\" alt=\"画像 $_\" width=\"$width\" height=\"$height\" />";
				}

				$text_ins->replace_string('\$FILE' . $i . '_full', $file);
			} elsif ($text_ins->get_string =~ /\$FILE$i/) {
				$text_ins->replace_string('\$FILE' . $i, $file);
			} else {
				$article_files .= $file;
			}
		}

		if ($article_file1) {
			$article_file1 = "<a href=\"$init->{upfile_dirlink}$article_file1\"$target>$article_file1</a>";
		}
		if ($article_file2) {
			$article_file2 = "<a href=\"$init->{upfile_dirlink}$article_file2\"$target>$article_file2</a>";
		}
		if ($article_file3) {
			$article_file3 = "<a href=\"$init->{upfile_dirlink}$article_file3\"$target>$article_file3</a>";
		}
	}
	if (!$article_files) {
		$article_file_start = '<!--';
		$article_file_end   = '-->';
	}

	my($article_link_start, $article_link_end);
	if ($comt_ins->get_string or $mail_ins->get_string or $text_ins->get_string or $file_ins->get_string) {
		if ($text_ins->get_string =~ /^<a href=\"(.+)\"([^>]*)>\1<\/a>$/) {
			$article_link_start = "<a href=\"$1\"$2>";
			$article_link_end   = "</a>";
		} else {
			$article_link_start = "<a href=\"$init->{script_file}?mode=view&amp;no=" . $no_ins->get_string . "\">";
			$article_link_end   = "</a>";
		}
	}

	my($article_admin_start, $article_admin_end);
	if ($parser_ins->get_query('mode') ne 'admin' and !&check_password) {
		$article_admin_start = '<!--';
		$article_admin_end   = '-->';
	}

	return(
		ARTICLE_NO          => $no_ins->get_string,
		ARTICLE_STAT        => $stat_ins->get_string,
		ARTICLE_MAIL_START  => $article_mail_start,
		ARTICLE_MAIL_END    => $article_mail_end,
		ARTICLE_FIELD       => $field_ins->get_string,
		ARTICLE_FIELD_START => $article_field_start,
		ARTICLE_FIELD_END   => $article_field_end,
		ARTICLE_COLOR       => $article_color,
		ARTICLE_COLOR_START => $article_color_start,
		ARTICLE_COLOR_END   => $article_color_end,
		ARTICLE_ICON        => $article_icon,
		ARTICLE_ICON_START  => $article_icon_start,
		ARTICLE_ICON_END    => $article_icon_end,
		ARTICLE_NAME        => $name_ins->get_string,
		ARTICLE_NAME_START  => $article_name_start,
		ARTICLE_NAME_END    => $article_name_end,
		ARTICLE_YEAR        => $article_year,
		ARTICLE_MONTH       => $article_month,
		ARTICLE_DAY         => $article_day,
		ARTICLE_HOUR1       => $article_hour1,
		ARTICLE_MINUTE1     => $article_minute1,
		ARTICLE_TIME1_START => $article_time1_start,
		ARTICLE_TIME1_END   => $article_time1_end,
		ARTICLE_HOUR2       => $article_hour2,
		ARTICLE_MINUTE2     => $article_minute2,
		ARTICLE_TIME2_START => $article_time2_start,
		ARTICLE_TIME2_END   => $article_time2_end,
		ARTICLE_TIME_START  => $article_time_start,
		ARTICLE_TIME_END    => $article_time_end,
		ARTICLE_WEEK        => $article_week,
		ARTICLE_SUBJ        => $subj_ins->get_string,
		ARTICLE_TEXT        => $text_ins->get_string,
		ARTICLE_TEXT_START  => $article_text_start,
		ARTICLE_TEXT_END    => $article_text_end,
		ARTICLE_FILE1       => $article_file1,
		ARTICLE_FILE2       => $article_file2,
		ARTICLE_FILE3       => $article_file3,
		ARTICLE_FILES       => $article_files,
		ARTICLE_FILE_START  => $article_file_start,
		ARTICLE_FILE_END    => $article_file_end,
		ARTICLE_LINK_START  => $article_link_start,
		ARTICLE_LINK_END    => $article_link_end,
		ARTICLE_ADMIN_START => $article_admin_start,
		ARTICLE_ADMIN_END   => $article_admin_end
	);
}

### コメント表示
sub get_comment {
	my($no, $pno, $stat, $date, $name, $mail, $url, $subj, $text, $pwd, $host) = @_;

	my $no_ins   = new webliberty::String($no);
	my $pno_ins  = new webliberty::String($pno);
	my $stat_ins = new webliberty::String($stat);
	my $date_ins = new webliberty::String($date);
	my $name_ins = new webliberty::String($name);
	my $mail_ins = new webliberty::String($mail);
	my $url_ins  = new webliberty::String($url);
	my $subj_ins = new webliberty::String($subj);
	my $text_ins = new webliberty::String($text);
	my $pwd_ins  = new webliberty::String($pwd);
	my $host_ins = new webliberty::String($host);

	$no_ins->create_number;
	$pno_ins->create_number;
	$stat_ins->create_number;
	$date_ins->create_line;
	$name_ins->create_line;
	$mail_ins->create_line;
	$url_ins->create_line;
	$subj_ins->create_line;
	$text_ins->create_text;
	$pwd_ins->create_line;
	$host_ins->create_line;

	my($sec, $min, $hour, $day, $mon, $year, $week) = localtime($date_ins->get_string);

	my $article_year   = sprintf("%04d", $year + 1900);
	my $article_month  = sprintf("%02d", $mon + 1);
	my $article_day    = sprintf("%02d", $day);
	my $article_hour   = sprintf("%02d", $hour);
	my $article_minute = sprintf("%02d", $min);
	my $article_week   = ${$init->{weeks}}[$week];

	$date_ins->set_string("$article_year年$article_month月$article_day日($article_week)$article_hour時$article_minute分");

	if (!$subj_ins->get_string) {
		$subj_ins->set_string('No Title');
	}
	if ($url_ins->get_string eq 'http://') {
		$url_ins->set_string('');
	}

	my($article_mail_start, $article_mail_end);
	if ($mail_ins->get_string) {
		$article_mail_start = '<a href="mailto:' . $mail_ins->get_string . '">';
		$article_mail_end   = '</a>';
	} else {
		$article_mail_start = '<!--';
		$article_mail_end   = '-->';
	}

	my($article_url_start, $article_url_end);
	if ($url_ins->get_string) {
		$article_url_start = '<a href="' . $url_ins->get_string . "\">";
		$article_url_end   = '</a>';
	} else {
		$article_url_start = '<!--';
		$article_url_end   = '-->';
	}

	my($article_edit_start, $article_edit_end);
	if ($parser_ins->get_query('exec_preview')) {
		$article_edit_start = '<!--';
		$article_edit_end   = '-->';
	}

	if ($stat_ins->get_string) {
		$stat_ins->set_string('公開');
	} else {
		$stat_ins->set_string('非公開');

		if (&check_password) {
			$text_ins->set_string('<strong>このコメントは管理者宛てです。全体には公開されていません。</strong><br /><br />' . $text_ins->get_string);
		} else {
			if ($parser_ins->get_query('mode') ne 'admin' and $parser_ins->get_query('mode') ne 'edit') {
				$name_ins->set_string('非公開');
				$mail_ins->set_string('');
				$url_ins->set_string('');
				$subj_ins->set_string('非公開');
				$text_ins->set_string('<p>管理者にのみ公開されます。</p>');
			}
		}
	}

	return(
		ARTICLE_NO         => $no_ins->get_string,
		ARTICLE_PNO        => $pno_ins->get_string,
		ARTICLE_STAT       => $stat_ins->get_string,
		ARTICLE_DATE       => $date_ins->get_string,
		ARTICLE_YEAR       => $article_year,
		ARTICLE_MONTH      => $article_month,
		ARTICLE_DAY        => $article_day,
		ARTICLE_HOUR       => $article_hour,
		ARTICLE_MINUTE     => $article_minute,
		ARTICLE_WEEK       => $article_week,
		ARTICLE_NAME       => $name_ins->get_string,
		ARTICLE_MAIL       => $mail_ins->get_string,
		ARTICLE_MAIL_START => $article_mail_start,
		ARTICLE_MAIL_END   => $article_mail_end,
		ARTICLE_URL        => $url_ins->get_string,
		ARTICLE_URL_START  => $article_url_start,
		ARTICLE_URL_END    => $article_url_end,
		ARTICLE_SUBJ       => $subj_ins->get_string,
		ARTICLE_TEXT       => $text_ins->get_string,
		ARTICLE_PWD        => $pwd_ins->get_string,
		ARTICLE_HOST       => $host_ins->get_string,
		ARTICLE_EDIT_START => $article_edit_start,
		ARTICLE_EDIT_END   => $article_edit_end
	);
}

### エラー表示
sub error {
	my($message) = @_;

	my $skin_ins = new webliberty::Skin;
	if ($agent eq 'mobile') {
		$skin_ins->parse_skin($init->{skin_mobile_error});
	} else {
		$skin_ins->parse_skin($init->{skin_error});
	}

	my $method;
	if ($ENV{'HTTP_USER_AGENT'} =~ /(J-PHONE|KDDI-|UP\.Browser)/i) {
		$method = 'get';
	} else {
		$method = 'post';
	}
	$skin_ins->replace_skin(
		INFO_METHOD => $method,
		INFO_TITLE  => $init->{title},
		INFO_BACK   => $init->{back_url},
		INFO_FILE   => $init->{script_file},
		INFO_ERROR  => $message
	);

	if ($agent eq 'mobile') {
		my($data, $length) = &get_mobile_data($skin_ins->get_data('_all'));

		print "Content-Type: text/html; charset=Shift_JIS\n";
		if ($ENV{'HTTP_USER_AGENT'} =~ /KDDI-|UP\.Browser/i) {
			print "Pragma: no-cache\n";
			print "Cache-Control: no-cache\n\n";
		} else {
			print "Content-Length: $length\n\n";
		}
		print $data;
	} else {
		print $basis_ins->header;
		print $skin_ins->get_data('_all');
	}

	exit;
}

### 携帯用データ作成
sub get_mobile_data {
	my($data) = @_;

	$data =~ s/\xEF\xBD\x9E/\xE3\x80\x9C/g;
	$data = Jcode->new($data, 'utf8')->sjis;

	return($data, length($data) + ($data =~ s/\n/\n/g));
}
