#!/usr/bin/perl

#Web Diary Ver 2.04 (2006/12/05)
#
#Copyright(C) 2002-2006 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::Lock;
use webliberty::Skin;
use webliberty::Rss;

require './init.cgi';

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

my $init = &init::get_init;

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

if ($parser_ins->get_query('mode') eq 'admin') {
	if ($parser_ins->get_query('work')) {
		if ($parser_ins->get_query('pwd') ne $init->{admin_pwd}) {
			&error('パスワードが違います。');
		}
		if ($parser_ins->get_query('work') eq 'new') {
			if ($parser_ins->get_query('exec_regist')) {
				&regist;
				&edit;
			} else {
				&form;
			}
		} elsif ($parser_ins->get_query('work') eq 'edit') {
			if ($parser_ins->get_query('exec_regist')) {
				&regist;
			} elsif ($parser_ins->get_query('exec_del')) {
				&del;
			}
			if ($parser_ins->get_query('exec_form')) {
				&form;
			} else {
				&edit;
			}
		} else {
			&error('不正なアクセスです。');
		}
	} else {
		&admin;
	}
} elsif ($parser_ins->get_query('mode') eq 'past') {
	&past;
} elsif ($parser_ins->get_query('mode') eq 'rss') {
	&rss;
} else {
	&list;
}

exit;

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

### 記事登録
sub regist {
	my $edit_ins = new webliberty::String($parser_ins->get_query('edit'));
	my $subj_ins = new webliberty::String($parser_ins->get_query('subj'));
	my $text_ins = new webliberty::String($parser_ins->get_query('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 $hour_ins   = new webliberty::String($parser_ins->get_query('hour'));
	my $minute_ins = new webliberty::String($parser_ins->get_query('minute'));

	$edit_ins->create_number;
	$subj_ins->create_line;
	$text_ins->create_text;

	if (!$subj_ins->get_string) {
		&error('題名が入力されていません。');
	}
	if (!$text_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 (!($hour_ins->get_string =~ /^\d\d$/)) {
		&error('日付の時間が正しく指定されていません。');
	}
	if (!($minute_ins->get_string =~ /^\d\d$/)) {
		&error('日付の分が正しく指定されていません。');
	}

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

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

	if ($edit_ins->get_string) {
		#ファイル拡張子取得
		open(FH, $init->{log_file}) or &error("Read Error : $init->{log_file}");
		while (<FH>) {
			chomp;
			my($no, $date, $subj, $text, $file) = split(/\t/);

			if ($edit_ins->get_string == $no) {
				$org_files = $file;
			}
		}
		close(FH);

		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{$_}";
		}

		#記事編集
		my $new_date = $year_ins->get_string . $month_ins->get_string . $day_ins->get_string . $hour_ins->get_string . $minute_ins->get_string;
		my $new_line = $edit_ins->get_string . "\t$new_date\t" . $subj_ins->get_string . "\t" . $text_ins->get_string . "\t$files\n";
		my $new_data;

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

			if (!$flag and $new_date >= $date) {
				$new_data .= $new_line;

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

		if (!$flag) {
			$new_data .= $new_line;
		}

		open(FH, ">$init->{log_file}") or &error("Write Error : $init->{log_file}");
		print FH $new_data;
		close(FH);
	} else {
		my $new_no;

		#記事番号取得
		open(FH, $init->{log_file}) or &error("Read Error : $init->{log_file}");
		while (<FH>) {
			chomp;
			my($no, $date, $subj, $text, $file) = split(/\t/);

			if ($new_no < $no) {
				$new_no = $no;
			}
		}
		close(FH);

		#アップロードファイル保存
		my $file_name = $new_no + 1;

		foreach (1 .. 3) {
			if ($parser_ins->get_query('file' . $_)) {
				$flag = 1;
			}
		}
		if ($flag) {
			foreach (1 .. 3) {
				if ($parser_ins->get_query('file' . $_)) {
					my $file_ins = new webliberty::File($parser_ins->get_filename('file' . $_));
					$file{$_} = "$file_name\-$_\." . $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($last_no, $thread) = (0, 0);
		my($last_subj, $last_text);

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

			if ($last_no < $no) {
				$last_no   = $no;
				$last_subj = $subj;
				$last_text = $text;
			}
		}

		if ($subj_ins->get_string eq $last_subj and $text_ins->get_string eq $last_text) {
			$lock_ins->file_unlock;
			&error('すでに投稿されています。');
		}

		#記事編集
		my $new_date = $year_ins->get_string . $month_ins->get_string . $day_ins->get_string . $hour_ins->get_string . $minute_ins->get_string;
		my $new_line = ($last_no + 1) . "\t$new_date\t" . $subj_ins->get_string . "\t" . $text_ins->get_string . "\t$files\n";
		my @new_data;
		$flag = 0;

		seek(FH, 0, 0);

		while (<FH>) {
			chomp;
			my($no, $date, $subj, $text, $file) = split(/\t/);

			if (!$flag and $new_date >= $date) {
				push(@new_data, $new_line);

				$flag = 1;
			}
			push(@new_data, "$_\n");
		}
		close(FH);

		if (!$flag) {
			push(@new_data, $new_line);
		}

		#過去ログ作成
		if ($#new_data >= $init->{log_size}) {
			my @past;
			my $i = 0;

			while (my $log = pop(@new_data)) {
				unshift(@past, $log);

				$i++;
				if ($i >= $init->{past_size}) {
					last;
				}
			}

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

			@dir = sort { $b <=> $a } @dir;

			my $file_ins  = new webliberty::File($dir[0]);
			my $past_file = ($file_ins->get_name + 1) . '.' . $init->{past_ext};

			open(PAST, ">$init->{past_dir}$past_file") or &error("Write Error : $init->{past_dir}$past_file");
			print PAST @past;
			close(PAST);

			chmod(0606, "$init->{past_dir}$past_file");
		}

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

	$lock_ins->file_unlock;

	return;
}

### 登録記事一覧
sub 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;
	$skin_ins->parse_skin($init->{skin_admin_edit});
	$skin_ins->replace_skin(
		INFO_MESSAGE     => $message,
		INFO_TITLE       => $init->{title},
		INFO_DESCRIPTION => $init->{description},
		INFO_URL         => $init->{site_url},
		INFO_BACK        => $init->{back_url},
		INFO_SCRIPT      => $init->{script_file},
		INFO_PWD         => $parser_ins->get_query('pwd')
	);

	print $basis_ins->header;
	print $skin_ins->get_data('header');

	print $skin_ins->get_data('diary_head');

	my($all_size, $i);

	open(FH, $init->{log_file}) or &error("Read Error : $init->{log_file}");
	while (<FH>) {
		$all_size++;
	}
	seek(FH, 0, 0);
	while (<FH>) {
		chomp;
		my($no, $date, $subj, $text, $file) = split(/\t/);

		$i++;
		if ($i <= $start) {
			next;
		}
		if ($i > $end) {
			last;
		}

		my $no_ins    = new webliberty::String($no);
		my $date_ins  = new webliberty::String($date);
		my $subj_ins  = new webliberty::String($subj);
		my $text_ins  = new webliberty::String($text);

		$no_ins->create_number;
		$date_ins->create_line;
		$subj_ins->create_line;
		$text_ins->create_text;

		my($article_year, $article_month, $article_day, $article_hour, $article_minute, $article_week);
		if ($date_ins->get_string =~ /^(\d\d\d\d)(\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;
			$article_month  = $2;
			$article_day    = $3;
			$article_hour   = $4;
			$article_minute = $5;
			$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');
		}

		print $skin_ins->get_replace_data(
			'diary',
			ARTICLE_NO         => $no_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_SUBJ       => $subj_ins->get_string,
			ARTICLE_TEXT       => $text_ins->get_string
		);
	}
	close(FH);

	print $skin_ins->get_data('diary_foot');

	my $page_list;
	foreach (0 .. int(($all_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>";
		}
	}
	print $skin_ins->get_replace_data(
		'page',
		PAGE_LIST => $page_list
	);

	print $skin_ins->get_data('footer');

	return;
}

### 記事削除
sub del {
	if (!$parser_ins->get_query('del')) {
		&error('削除したい記事を選択してください。');
	}

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

	my($new_data, $flag);

	open(FH, $init->{log_file}) or &error("Read Error : $init->{log_file}");
	while (<FH>) {
		chomp;
		my($no, $date, $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);

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

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

	$lock_ins->file_unlock;

	return;
}

### 投稿フォーム表示
sub form {
	my($form_new_start, $form_new_end, $form_res_start, $form_res_end);
	my($form_work, $form_date, $form_year, $form_month, $form_day, $form_hour, $form_minute, $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   = '-->';

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

			if ($parser_ins->get_query('edit') == $no) {
				if ($date =~ /^(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/) {
					$form_year   = $1;
					$form_month  = $2;
					$form_day    = $3;
					$form_hour   = $4;
					$form_minute = $5;
				}

				my $subj_ins = new webliberty::String($subj);
				my $text_ins = new webliberty::String($text);

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

				$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';

		$form_res_start = '<!--';
		$form_res_end   = '-->';

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

		$form_year   = $year + 1900;
		$form_month  = $mon + 1;
		$form_day    = $day;
		$form_hour   = $hour;
		$form_minute = $min;
	}

	$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_date .= '<select name="hour" xml:lang="ja" lang="ja">';
	foreach (0 .. 23) {
		my $hour = sprintf("%02d", $_);
		if ($hour == $form_hour) {
			$form_date .= "<option value=\"$hour\" selected=\"selected\">$_時</option>";
		} else {
			$form_date .= "<option value=\"$hour\">$_時</option>";
		}
	}
	$form_date .= '</select>';

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

	my $skin_ins = new webliberty::Skin;
	$skin_ins->parse_skin($init->{skin_admin_form});
	$skin_ins->replace_skin(
		INFO_TITLE       => $init->{title},
		INFO_DESCRIPTION => $init->{description},
		INFO_URL         => $init->{site_url},
		INFO_BACK        => $init->{back_url},
		INFO_SCRIPT      => $init->{script_file},
		INFO_PWD         => $parser_ins->get_query('pwd')
	);

	print $basis_ins->header;
	print $skin_ins->get_data('header');

	print $skin_ins->get_replace_data(
		'form',
		FORM_WORK      => $form_work,
		FORM_NO        => $parser_ins->get_query('edit'),
		FORM_DATE      => $form_date,
		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_RES_START => $form_res_start,
		FORM_RES_END   => $form_res_end
	);

	print $skin_ins->get_data('footer');

	return;
}

### ログイン画面表示
sub admin {
	my $skin_ins = new webliberty::Skin;
	$skin_ins->parse_skin($init->{skin_admin});
	$skin_ins->replace_skin(
		INFO_TITLE       => $init->{title},
		INFO_DESCRIPTION => $init->{description},
		INFO_URL         => $init->{site_url},
		INFO_BACK        => $init->{back_url},
		INFO_SCRIPT      => $init->{script_file}
	);

	print $basis_ins->header;
	print $skin_ins->get_data('header');
	print $skin_ins->get_data('contents');
	print $skin_ins->get_data('footer');

	return;
}

### 過去ログ表示
sub past {
	my $page_ins = new webliberty::String($parser_ins->get_query('page'));
	$page_ins->create_number;

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

	my($select_list, $all_size);
	foreach (@dir) {
		if ($_ =~ /^(\d+)\.(\w+)$/ and $2 eq $init->{past_ext}) {
			if ($page_ins->get_string eq $1) {
				$select_list .= "<option value=\"$1\" selected=\"selected\">過去ログ$1ページ</option>";
			} else {
				$select_list .= "<option value=\"$1\">過去ログ$1ページ</option>";
			}

			$all_size++;
		}
	}
	if ($select_list) {
		$select_list = "<option value=\"\">選択してください</option>$select_list";
	} else {
		$select_list = "<option value=\"\">過去ログはありません</option>";
	}

	my $skin_ins = new webliberty::Skin;
	$skin_ins->parse_skin($init->{skin_past});
	$skin_ins->replace_skin(
		INFO_TITLE       => $init->{title},
		INFO_DESCRIPTION => $init->{description},
		INFO_URL         => $init->{site_url},
		INFO_BACK        => $init->{back_url},
		INFO_SCRIPT      => $init->{script_file},
		INFO_SELECT_LIST => $select_list
	);

	print $basis_ins->header;
	print $skin_ins->get_data('header');

	if ($page_ins->get_string) {
		print $skin_ins->get_data('diary_head');

		my $past_file = $init->{past_dir} . $page_ins->get_string . '.' . $init->{past_ext};
		my($all_size, $i);

		open(FH, $past_file) or &error("Read Error : $past_file");
		while (<FH>) {
			$all_size++;
		}
		seek(FH, 0, 0);
		while (<FH>) {
			chomp;
			my($no, $date, $subj, $text, $file) = split(/\t/);

			print $skin_ins->get_replace_data(
				'diary',
				&article($no, $date, $subj, $text, $file)
			);
		}
		close(FH);

		print $skin_ins->get_data('diary_foot');
	}

	print $skin_ins->get_data('navi_head');
	foreach (1 .. $all_size) {
		my($prev_start, $prev_end);

		if (!$page_ins->get_string or $_ != $page_ins->get_string) {
			$prev_start = "<a href=\"$init->{script_file}?mode=past&amp;page=$_\">";
			$prev_end   = "</a>";
		}
		print $skin_ins->get_replace_data(
			'navi',
			NAVI_NO    => $_,
			NAVI_START => $prev_start,
			NAVI_END   => $prev_end,
		);
	}
	print $skin_ins->get_data('navi_foot');

	print $skin_ins->get_data('footer');

	return;
}

### RSS配信
sub rss {
	my($items, $last_date, $i);

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

		$i++;
		if ($i > $init->{page_size}) {
			last;
		}

		if (!$last_date) {
			$last_date = $date;
		}

		my %article = &article($no, $date, $subj, $text, $file);
		my $text    = $article{'ARTICLE_TEXT'};

		$text =~ s/\n//g;

		$items .= "$subj\t$init->{site_url}#diary_$no\t$text\t$date\n";
	}
	close(FH);

	print "Content-Type: text/xml\n\n";

	my $rss_ins = new webliberty::Rss;
	print $rss_ins->create_rss(
		rdf_about   => "$init->{site_url}?mode=rss",
		title       => $init->{title},
		link        => $init->{site_url},
		description => $init->{description},
		date        => $last_date,
		items       => $items
	);

	return;
}

### 記事一覧表示
sub list {
	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;
	$skin_ins->parse_skin($init->{skin_diary});
	$skin_ins->replace_skin(
		INFO_TITLE       => $init->{title},
		INFO_DESCRIPTION => $init->{description},
		INFO_URL         => $init->{site_url},
		INFO_BACK        => $init->{back_url},
		INFO_SCRIPT      => $init->{script_file}
	);

	print $basis_ins->header;
	print $skin_ins->get_data('header');

	print $skin_ins->get_data('diary_head');

	my($all_size, $i);

	open(FH, $init->{log_file}) or &error("Read Error : $init->{log_file}");
	while (<FH>) {
		$all_size++;
	}
	seek(FH, 0, 0);
	while (<FH>) {
		chomp;
		my($no, $date, $subj, $text, $file) = split(/\t/);

		$i++;
		if ($i <= $start) {
			next;
		}
		if ($i > $end) {
			last;
		}

		print $skin_ins->get_replace_data(
			'diary',
			&article($no, $date, $subj, $text, $file)
		);
	}
	close(FH);

	print $skin_ins->get_data('diary_foot');

	my($prev_start, $prev_end, $next_start, $next_end);
	if ($page_ins->get_string > 0) {
		$prev_start = "<a href=\"$init->{script_file}?page=" . ($page_ins->get_string - 1) . "\">";
		$prev_end   = '</a>';
	}
	if (int(($all_size - 1) / $init->{page_size}) > $page_ins->get_string) {
		$next_start = "<a href=\"$init->{script_file}?page=" . ($page_ins->get_string + 1) . "\">";
		$next_end   = '</a>';
	}
	print $skin_ins->get_replace_data(
		'page',
		PAGE_PREV_START => $prev_start,
		PAGE_PREV_END   => $prev_end,
		PAGE_NEXT_START => $next_start,
		PAGE_NEXT_END   => $next_end
	);

	print $skin_ins->get_data('navi_head');
	foreach (0 .. int(($all_size - 1) / $init->{page_size})) {
		my($prev_start, $prev_end);

		if ($_ != $page_ins->get_string) {
			$prev_start = "<a href=\"$init->{script_file}?page=$_\">";
			$prev_end   = "</a>";
		}
		print $skin_ins->get_replace_data(
			'navi',
			NAVI_NO    => $_ + 1,
			NAVI_START => $prev_start,
			NAVI_END   => $prev_end,
		);
	}
	print $skin_ins->get_data('navi_foot');

	print $skin_ins->get_data('footer');

	return;
}

### 記事表示
sub article {
	my($no, $date, $subj, $text, $file) = @_;

	my $no_ins   = new webliberty::String($no);
	my $date_ins = new webliberty::String($date);
	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;
	$date_ins->create_line;
	$subj_ins->create_line;
	$text_ins->create_text;

	my($article_new_start, $article_new_end);
	if ($date_ins->get_string =~ /^(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/) {
		my($sec, $min, $hour, $day, $mon, $year, $week) = localtime(time);
		my $day_ins = new webliberty::Date;

		if ($day_ins->get_interval(sprintf("%04d-%02d-%02d", $year + 1900, $mon + 1, $day), "$1-$2-$3") >= $init->{new_days}) {
			$article_new_start = '<!--';
			$article_new_end   = '-->';
		}
	}

	my($article_year, $article_month, $article_day, $article_hour, $article_minute, $article_week);
	if ($date_ins->get_string =~ /^(\d\d\d\d)(\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;
		$article_month  = $2;
		$article_day    = $3;
		$article_hour   = $4;
		$article_minute = $5;
		$article_week   = ${$init->{weeks}}[$week];

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

	$text_ins->permit_html;

	if (!$subj_ins->get_string) {
		$subj_ins->set_string('No Title');
	}

	if ($init->{autolink_mode}) {
		$text_ins->create_link($init->{autolink_attribute});
	}

	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;

			if ($_) {
				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;
				}

				if ($flag and $width > 0 and $height > 0) {
					$file = "<a href=\"$init->{upfile_dir}$_\"$target><img src=\"$init->{upfile_dir}$_\" alt=\"アップロードファイル $_\" width=\"$width\" height=\"$height\" /></a>";
				} elsif ($width > 0 and $height > 0) {
					$file = "<img src=\"$init->{upfile_dir}$_\" alt=\"アップロードファイル $_\" width=\"$width\" height=\"$height\" />";
				} else {
					$file = "<a href=\"$init->{upfile_dir}$_\"$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_dir}$_";

				$text_ins->replace_string('\$FILE' . $i . '_path', $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_dir}$article_file1\"$target>$article_file1</a>";
		}
		if ($article_file2) {
			$article_file2 = "<a href=\"$init->{upfile_dir}$article_file2\"$target>$article_file2</a>";
		}
		if ($article_file3) {
			$article_file3 = "<a href=\"$init->{upfile_dir}$article_file3\"$target>$article_file3</a>";
		}
	}
	if (!$article_files) {
		$article_file_start = '<!--';
		$article_file_end   = '-->';
	}

	return(
		ARTICLE_NO         => $no_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_SUBJ       => $subj_ins->get_string,
		ARTICLE_TEXT       => $text_ins->get_string,
		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_NEW_START  => $article_new_start,
		ARTICLE_NEW_END    => $article_new_end
	);
}

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

	my $skin_ins = new webliberty::Skin;
	$skin_ins->parse_skin($init->{skin_error});

	$skin_ins->replace_skin(
		INFO_ERROR => $message
	);

	print $basis_ins->header;
	print $skin_ins->get_data('_all');

	exit;
}
