#!/usr/local/bin/perl

#==========================================================
# RO Member List CGI - MIKADUKI - ver.1.00
# last update 2006/1/19
# riarisu@hotmail.com
#==========================================================
#----------------------------------------------------------
# 外部ファイル
require './jcode.pl';
require './cgi-lib.pl';
require './common.pl';
require './common_image.pl';
require './mikaduki_ini.cgi';
#----------------------------------------------------------

$version = '1.00';

&decode;
&initialize;
&setting_file_check;
&log_read;


if($in{'act'} eq 'management')			{ &management; }
elsif($in{'act'} eq 'register_form')	{ &register_form; }
elsif($in{'act'} eq 'register')			{ &register; }
elsif($in{'act'} eq 'edit_pass')		{ &edit_pass; }
elsif($in{'act'} eq 'edit')				{ &edit; }
elsif($in{'act'} eq 'readme')			{ &readme; }
&top_page;
exit;


#==========================================================
# デコード
#==========================================================
sub decode
{
	my $key,$val;

	undef(%in);

	&ReadParse;
	while(($key,$val) = each(%in))
	{
		if($key eq 'image') { next; }

		# シフトJISコード変換
		&jcode'convert(*val, "sjis", "", "z");

		# タグ処理
		$val =~ s/&/&amp;/g;
		$val =~ s/"/&quot;/g;
		$val =~ s/</&lt;/g;
		$val =~ s/>/&gt;/g;
		$val =~ s/\n//g;
		$val =~ s/\,/，/g;

		if($key eq 'del')
		{
			# 管理削除
			@DEL = split(/\0/,$val);
		}
		else
		{
			$in{$key} = $val;
		}
	}
}


#==========================================================
# 初期化
#==========================================================
sub initialize
{
	$flag_error = 0;		# エラー　0/1 = No/Yes
	$flag_header = 0;		# ヘッダ表示	0/1 = 無し/有り

	# ログファイルの選択
	$l_no = $in{l_no};
	if($l_no eq '') { $l_no = 0; }
	if(!open(NOTE,"$log_file[$l_no]")) { $l_no = 0; }

	$title_name = $title_name[$l_no];
	$title_img  = $title_img[$l_no];
	$home       = $home[$l_no];
	$log_file   = $log_file[$l_no];
	$lock_file  = $lock_file[$l_no];
	$img_dir    = $img_dir[$l_no];
	$img_url    = $img_url[$l_no];
	$pass_write = $pass_write[$l_no];
	$password   = $password[$l_no];

	if($l_no == 0)
	{
		@GUILD_NAME = @GUILD_NAME[0 .. $guild_number[$l_no]-1];
	}
	else
	{
		@GUILD_NAME = @GUILD_NAME[$guild_number[$l_no-1] .. $guild_number[$l_no-1]+$guild_number[$l_no]-1];
	}

	$cgi_top = $cgi;
	$cgi .= "?l_no=$l_no";

	# タイトル
	$title_header = $title_name;
	if($title_img ne '') { $title_name = "<img src=\"$title_img\" alt=\"$title_name\">"; }

	# 背景画像
	if($main_bimg_attachment == 1)	{ $main_bimg_attachment = 'background-attachment:fixed;'; }
	else							{ $main_bimg_attachment = ''; }
	if($main_bimg_repeat == 0)	{ $main_bimg_repeat = 'background-repeat:no-repeat;'; }
	else						{ $main_bimg_repeat = ''; }

	# スタイル
	$link_line = &common'style_line_type($link_line);
	$linkh_line = &common'style_line_type($linkh_line);
	$title_fweight = &common'style_string_thickness($title_fweight);
	$ptitle_fweight = &common'style_string_thickness($ptitle_fweight);
	$label_fweight = &common'style_string_thickness($label_fweight);
}


#==========================================================
# 設定ファイルバージョンの確認
#==========================================================
sub setting_file_check
{
	my $version;

	$version = '1.0';
	if($setting_version == $version) { return; }

	error_end("設定ファイルのバージョンが古いため対応していません。<br>設定ファイルも新しいものに更新して下さい。");
}


#==========================================================
# HTMLヘッダ
#==========================================================
sub html_header
{
	if($flag_header != 0) { return; }
	$flag_header = 1;

	print <<"HERE";
Content-type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="Content-Style-Type" content="text/css">
<title>$title_header</title>
<link rel="next" href="$home">
<style type="text/css">
<!--
*
{
	padding:0;
	margin:0;
}
body
{
	font-size:$main_fsize;
	color:$main_fcolor;
	line-height:$main_fline;
	background:$main_bgcolor url($main_bimage);
	$main_bimg_attachment;
	$main_bimg_repeat;
	text-align:center;
	margin:10px 20px;
}
a:link
{
	color:$link_color;
	border-bottom:1px $link_line $link_color;
	text-decoration:none;
}
a:visited
{
	color:$linkv_color;
	border-bottom:1px $link_line $linkv_color;
	text-decoration:none;
}
a:hover,a:active
{
	color:$linkh_color;
	border-bottom:1px $linkh_line $linkh_color;
	text-decoration:none;
}
h1
{
	font-size:$title_fsize;
	color:$title_fcolor;
	font-weight:$title_fweight;
	line-height:$title_fsize;
}
h1 a:link, h1 a:visited, h1 a:hover, h1 a:active
{
	color:$title_fcolor;
	border-width:0px;
}
h2
{
	font-size:$ptitle_fsize;
	color:$ptitle_fcolor;
	font-weight:$ptitle_fweight;
	line-height:$ptitle_fsize;
	margin:20px 0;
}
h2 a:hover, h2 a:active
{
	color:$ptitle_fcolor;
	border-width:0px;
}

div#menu
{
	border-top:1px solid $hr_color;
	border-bottom:1px solid $hr_color;
	padding:3px;
	margin:10px 0;
}
div#footer
{
	text-align:right;
	margin-top:30px;
}
.skip_navi
{
	position:absolute;
	top:0px;
	left:-9999px;
}

hr
{
	height:$hr_height;
	color:$hr_color;
	background-color:$hr_color;
	border-width:0;
	width:$hr_width;
	margin:auto;
}
th
{
	font-weight:normal;
	white-space:nowrap;
}
em
{
	color:$note_fcolor;
	font-style:normal;
}
form
{
	margin:20px 0;
}
ul
{
	text-align:left;
	margin-left:20px;
}
li
{
	margin-bottom:20px;
}
.ul2 li
{
	margin-bottom:0px;
}


table.member
{
	margin:40px 0px;
	width:$data_table_width
}
.member hr
{
	height:1px;
	border-bottom:1px solid $data_hr_color;
	width:100%;
}
.name_bar th
{
	font-weight:bold;
	background-color:$name_bgcolor;
	padding:2px 8px;
	text-align:left;
}
 .name_bar td
{
	background-color:$name_bgcolor;
	padding:2px 8px;
	text-align:right;
}
td.image
{
	width:200px;
	padding:10px;
}
td.status
{
	padding-top:5px;
	text-align:left;
}
table.base_status, table.status
{
	border-top:1px solid $data_hr_color;
	margin:5px 0px;
	width:100%;
}
span.label
{
	color:$data_lfcolor;
}
span.data
{
	color:$data_fcolor;
}
.status th
{
	color:$data_lfcolor;
	text-align:right;
}
.status td
{
	color:$data_fcolor;
}
td.comment
{
	border-top:1px solid $data_hr_color;
	padding-top:5px;
	text-align:left;
}


div.regist_form
{
	border-top:1px solid $hr_color;
	padding-top:5px;
	margin-top:20px;
	text-align:left;
}
.regist_form table
{
	margin-top:20px;
}
.register_form th, .asregister_form td
{
	padding:1px 4px;
}
.regist_form th
{
	color:$label_fcolor;
	font-weight:$label_fweight;
	background-color:$label_bgcolor;
	padding:1px 10px;
	text-align:right;
}
.regist_form td
{
	text-align:left;
}

input, textarea
{
	border:1px solid $form_bcolor;
	background-color:$form_bgcolor;
	padding:1px 2px;
}
input.none
{
	border:0px;
	background-color:transparent;
}
input.button
{
	background-color:#cccccc;
	margin:20px 0px;
}
input.button_no_margin
{
	background-color:#cccccc;
}

table.table
{
	border:1px solid $table_bcolor;
	border-collapse:collapse;
	background-color:$table_bgcolor;
	margin:auto;
}
.table td,.table th
{
	color:$main_fcolor;
	border:1px solid $table_bcolor;
	padding:5px;
}
.p_right
{
	padding-right:30px;
}
.w100p
{
	width:100%;
}
.center
{
	text-align:center;
}
.left
{
	text-align:left;
}
.right
{
	text-align:right;
}
.nowrap
{
	white-space:nowrap;
}
-->
</style>
</head>
<body>
<h1><a name="page_top">$title_name</a></h1>
<p class="skip_navi"><a href="#skip_page_title">本文へ移動</a></p>
<div id="menu">
[<a href="$home" target="_top">HOME</a>]　
[<a href="$cgi">TOP</a>]　
[<a href="$cgi&amp;act=register_form">新規登録</a>]　
[<a href="$cgi&amp;act=readme">使い方</a>]　
[<a href="$cgi&amp;act=management">管理用</a>]
</div>
HERE
}


#==========================================================
# HTMLフッタ
#==========================================================
sub html_footer
{
	print "<div id=\"footer\">MIKADUKI ver.$version - (C) <a href=\"http://www5c.biglobe.ne.jp/~riarisu/\" target=\"_balnk\">Parallel Universes</a></div>\n";
	print "</body></html>";
}


#==========================================================
# トップページ
#==========================================================
sub top_page
{
	&html_header;
	&member_show;
 	&html_footer;
 	exit;
}


#==========================================================
# メンバーの表示
#==========================================================
sub member_show
{
	# 総登録数の表示
	print "<p class=\"right\">現在の登録数：$data_number</p>\n";

	foreach $line(@DATA)
	{
		&value_read($line);

		if($image eq '')	{ $image = "　"; }
		else				{ $image = "<img src=\"$img_url$image\" alt=\"$image_alt\">"; }

		print <<"HERE";
<table summary="メンバー$no" border="0" cellspacing="0" class="member">
<tr class="name_bar"><th>$name</th><td>No.$no / LastUpdate:$date</td></tr>
<tr><td class="image">$image</td><td class="status">

<span class="label">$LABEL[1]：</span><span class="data">$nname</span>


<table summary="基本情報" border="0" class="base_status">
<tr><th>$LABEL[2]：</th><td>$job</td><th>$LABEL[3]：</th><td>$gender</td></tr>
<tr><th>$LABEL[4]：</th><td>$base_lv</td><th>$LABEL[5]：</th><td>$job_lv</td></tr>
<tr><th>$LABEL[6]：</th><td>$hp</td><th>$LABEL[7]：</th><td>$sp</td></tr>
</table>


<table summary="ステータス情報" border="0" class="status">
HERE

		if($flag_status == 1)
		{
			print <<"HERE";
<tr><th>$LABEL[8]：</th><td class="p_right">$str</td>
<th>$LABEL[14]：</th><td class="p_right">$atk</td>
<th>$LABEL[15]：</th><td>$def</td></tr>
<tr><th>$LABEL[9]：</th><td class="p_right">$agi</td>
<th>$LABEL[16]：</th><td class="p_right">$matk</td>
<th>$LABEL[17]：</th><td>$mdef</td></tr>
<tr><th>$LABEL[10]：</th><td class="p_right">$vit</td>
<th>$LABEL[18]：</th><td class="p_right">$hit</td>
<th>$LABEL[19]：</th><td>$flee</td></tr>
<tr><th>$LABEL[11]：</th><td class="p_right">$int</td>
<th>$LABEL[20]：</th><td class="p_right">$critical</td>
<th>$LABEL[21]：</th><td>$aspd</td></tr>
<tr><th>$LABEL[12]：</th><td class="p_right">$dex</td>
<th>$LABEL[22]：</th><td colspan="3">$guild</td></tr>
<tr><th>$LABEL[13]：</th><td class="p_right">$luk</td>
<th>$LABEL[23]：</th><td colspan="3">$position</td></tr>
HERE
		}
		else
		{
			print <<"HERE";
<tr><th>$LABEL[22]：</th><td colspan="3">$guild</td>
<th>$LABEL[23]：</th><td colspan="3">$position</td></tr>
HERE
		}

		print <<"HERE";
</table>
</td></tr>
<tr><td colspan="2" class="comment">
$comment
</td></tr>
HERE

		print <<"HERE";
<tr><td colspan="2" class="right"><a href="$cgi&amp;act=edit_pass&amp;no=$no">[編集・削除]</a></td></tr>
</table>
HERE
	}
}


#==========================================================
# 登録フォーム
#==========================================================
sub register_form
{
	my $input_no,$button,$male_select,$female_select,$now_image;

	&html_header;

	if($in{'no'} eq '')
	{
		print "<h2><a name=\"skip_page_title\">登録フォーム</a></h2>\n";
		$button = '登録する';
	}
	else
	{
		print "<h2><a name=\"skip_page_title\">編集フォーム</a></h2>\n";
		$button = '編集する';
	}

	if(($in{'no'} eq '') && ($in{'p_write'} ne $pass_write) && ($in{'p_write'} ne $password))
	{
		print <<"HERE";
<p>登録するにはパスワードが必要となります。<br>
下記入力欄にパスワードを入力して下さい。</p>
<form method="POST" enctype="multipart/form-data" action="$cgi_top">
<input type="hidden" name="l_no" value="$l_no">
<input type="hidden" name="act" value="register_form">
<input type="password" name="p_write" size="$form_pass" maxlength="8"><br>
<input type="submit" class="button" value="認証">
</form>
HERE
		exit;
	}

	$input_no = 0;
	if($in{'job'} eq '') { $in{'job'} = $LABEL_JOB[0]; }
	if($in{'gender'} eq '') { $in{'gender'} = 'male'; }
	if($in{'guild'} eq '') { $in{'guild'} = $GUILD_NAME[0]; }

	print <<"HERE";
<form method="POST" enctype="multipart/form-data" action="$cgi_top">
<input type="hidden" name="l_no" value="$l_no">
<input type="hidden" name="act" value="register">
<input type="hidden" name="mode" value="$flag_register">
<input type="hidden" name="no" value="$in{'no'}">
<input type="hidden" name="image_show" value="$in{'image_show'}">
<p>「 $input_essential 」と書かれている項目については必ず記入・設定をして下さい。</p>


<div class="regist_form">
<p>【1】キャラクターの基本情報。</p>

<table summary="登録フォーム" border="0" cellspacing="5">
<tr><th><label for="name">$LABEL[0]</label></th>
<td colspan="3"><input type="text" name="name" id="name" size="$form_width" value="$in{'name'}"> $input_essential</td></tr>
<tr><th><label for="nname">$LABEL[1]</label></th>
<td colspan="3"><input type="text" name="nname" id="nname" size="$form_width" value="$in{'nname'}"></td></tr>
<tr><th>$LABEL[2]</th>
<td class="p_right"><select name="job">
HERE

	foreach (0 .. $#LABEL_JOB)
	{
		if($in{'job'} eq $LABEL_JOB[$_])	{ print "<option value=\"$LABEL_JOB[$_]\" selected>$LABEL_JOB[$_]\n";}
		else								{ print "<option value=\"$LABEL_JOB[$_]\">$LABEL_JOB[$_]\n"; }
	}
	if($in{'gender'} eq 'male')	{ $male_select =  " selected"; }
	else						{ $female_select = " selected"; }

	print <<"HERE";
</select> $input_essential</td>
<th><label for="gender">$LABEL[3]</label></th>
<td><select name="gender" id="gender">
<option value="male"$male_select>male
<option value="female"$female_select>female
</select> $input_essential</td></tr>
<tr><th><label for="base_lv">$LABEL[4]</label></th>
<td><input type="text" name="base_lv" id="base_lv" size="$form_width2" value="$in{'base_lv'}"></td>
<th><label for="job_lv">$LABEL[5]</label></th>
<td><input type="text" name="job_lv" id="job_lv" size="$form_width2" value="$in{'job_lv'}"></td></tr>
<tr><th><label for="hp">$LABEL[6]</label></th>
<td><input type="text" name="hp" id="hp" size="$form_width2" maxlength="5" value="$in{'hp'}"></td>
<th><label for="sp">$LABEL[7]</label></th>
<td><input type="text" name="sp" id="sp" size="$form_width2" maxlength="4" value="$in{'sp'}"></td></tr>
</table>
</div>


<div class="regist_form">
<p>【2】キャラクターのステータス情報</p>

<table summary="登録フォーム2" border="0" cellspacing="5">
HERE

	if($flag_status == 1)
	{
		print <<"HERE";
<tr><th><label for="str">$LABEL[8]</label></th>
<td class="p_right"><input type="text" name="status0" id="str" size="$form_width2" maxlength="2" value="$in{'status0'}"> ＋ 
<input type="text" name="status0_2" size="$form_width2" maxlength="2" value="$in{'status0_2'}"></td>
<th><label for="atk">$LABEL[14]</label></th>
<td class="p_right"><input type="text" name="status6" id="atk" size="$form_width2" maxlength="3" value="$in{'status6'}"> ＋ 
<input type="text" name="status6_2" size="$form_width2" maxlength="2" value="$in{'status6_2'}"></td>
<th><label for="def">$LABEL[15]</label></th>
<td><input type="text" name="status7" id="def" size="$form_width2" maxlength="2" value="$in{'status7'}"> ＋ 
<input type="text" name="status7_2" size="$form_width2" maxlength="3" value="$in{'status7_2'}"></td></tr>

<tr><th><label for="agi">$LABEL[9]</label></th>
<td><input type="text" name="status1" id="agi" size="$form_width2" maxlength="2" value="$in{'status1'}"> ＋ 
<input type="text" name="status1_2" size="$form_width2" maxlength="2" value="$in{'status1_2'}"></td>
<th><label for="matk">$LABEL[16]</label></th>
<td><input type="text" name="status8" id="matk" size="$form_width2" maxlength="3" value="$in{'status8'}"> 〜 
<input type="text" name="status8_2" size="$form_width2" maxlength="3" value="$in{'status8_2'}"></td>
<th><label for="mdef">$LABEL[17]</label></th>
<td><input type="text" name="status9" id="mdef" size="$form_width2" maxlength="2" value="$in{'status9'}"> ＋ 
<input type="text" name="status9_2" size="$form_width2" maxlength="3" value="$in{'status9_2'}"></td></tr>

<tr><th><label for="vit">$LABEL[10]</label></th>
<td><input type="text" name="status2" id="vit" size="$form_width2" maxlength="2" value="$in{'status2'}"> ＋ 
<input type="text" name="status2_2" size="$form_width2" maxlength="2" value="$in{'status2_2'}"></td>
<th><label for="hit">$LABEL[18]</label></th>
<td><input type="text" name="status10" id="hit" size="$form_width2" maxlength="3" value="$in{'status10'}"></td>
<th><label for="flee">$LABEL[19]</label></th>
<td><input type="text" name="status11" id="flee" size="$form_width2" maxlength="3" value="$in{'status11'}"> ＋ 
<input type="text" name="status11_2" size="$form_width2" maxlength="2" value="$in{'status11_2'}"></td></tr>

<tr><th><label for="int">$LABEL[11]</label></th>
<td><input type="text" name="status3" id="int" size="$form_width2" maxlength="2" value="$in{'status3'}"> ＋ 
<input type="text" name="status3_2" size="$form_width2" maxlength="2" value="$in{'status3_2'}"></td>
<th><label for="critical">$LABEL[20]</label></th>
<td><input type="text" name="status12" id="critical" size="$form_width2" maxlength="2" value="$in{'status12'}"></td>
<th><label for="aspd">$LABEL[21]</label></th>
<td><input type="text" name="status13" id="aspd" size="$form_width2" maxlength="3" value="$in{'status13'}"></td></tr>

<tr><th><label for="dex">$LABEL[12]</label></th>
<td><input type="text" name="status4" id="dex" size="$form_width2" maxlength="2" value="$in{'status4'}"> ＋ 
<input type="text" name="status4_2" size="$form_width2" maxlength="2" value="$in{'status4_2'}"></td>
<th><label for="guild">$LABEL[22]</label></th>
<td colspan="3">
HERE
	}
	else
	{
		print "<tr><th><label for=\"guild\">$LABEL[22]</label></th>\n<td colspan=\"3\">\n";
	}

	if($GUILD_NAME[0] eq '')
	{
		# 登録ギルド指定無し
		print "<input type=\"text\" name=\"guild\" id=\"guild\" size=\"$form_width\" maxlength=\"22\" value=\"$in{'guild'}\" class=\"form\"></td></tr>\n";
	}
	else
	{
		# 登録ギルド指定有り
		print "<select name=\"guild\" id=\"guild\">";
		foreach (0 .. $#GUILD_NAME)
		{
			if($in{'guild'} eq $GUILD_NAME[$_])	{ print "<option value=\"$GUILD_NAME[$_]\" selected>$GUILD_NAME[$_]\n";}
			else								{ print "<option value=\"$GUILD_NAME[$_]\">$GUILD_NAME[$_]\n"; }
		}
		print "</select> $input_essential</td></tr>\n";
	}

	if($flag_status == 1)
	{
		print <<"HERE";
<tr><th><label for="luk">$LABEL[13]</label></th>
<td><input type="text" name="status5" id="luk" size="$form_width2" maxlength="2" value="$in{'status5'}"> ＋ 
<input type="text" name="status5_2" size="$form_width2" maxlength="2" value="$in{'status5_2'}"></td>
HERE
	}
	else
	{
		print "<tr>";
	}

	print <<"HERE";
<th><label for="position">$LABEL[23]</label></th>
<td colspan="3"><input type="text" name="position" id="position" size="$form_width" maxlength="22" value="$in{'position'}"></td></tr>
</table>
</div>


<div class="regist_form">
<p>【3】コメント</p>

<table summary="登録フォーム3" border="0" cellspacing="5">
<tr><td><textarea name="comment" rows="$form_comment_row" cols="$form_comment_col">$in{'comment'}</textarea></td></tr>
</table>
</div>


<div class="regist_form">
<p>【4】キャラクター画像</p>

<ul class="ul2">
<li>利用可能\な画像フォーマットは <em>JPEG</em>、<em>GIF</em>、<em>PNG</em>です。</li>
<li>登録可能\な最大画像サイズは　<em>縦$img_height_maxピクセル×横$img_width_maxピクセル</em>　です。</li>
<li>画像のファイルサイズは <em>$cgi_lib'maxdata bytes</em> まで。</li>
</ul>

<p>説明文にはキャラクター画像上にマウスカーソ\ルを置いた時に表\示される文字を入力して下さい。</p>

<table summary="登録フォーム4" border="0" cellspacing="5">
HERE

	if($in{'no'} ne '')
	{
		if($in{'image_show'} ne '') { $now_image = "<img src=\"$img_url$in{'image_show'}\" alt=\"$image_alt\">"; }
		print "<th>現在の画像</th><td>$now_image\n";
		if($in{'image_show'} ne '')
		{
			print "<br><input type=\"checkbox\" name=\"image_del\" id=\"image_del\" class=\"none\" value=\"on\"><label for=\"image_del\">この画像を削除する</label><br>\n";
			print "新規に画像を登録する場合はチェックを付けなくても自動で新しい画像に切替わります。\n";
		}
		print "</td></tr>\n";
		$in{'image'} = '';
	}

	print <<"HERE";
<tr><th><label for="image">キャラクター画像</label></th>
<td><input type="file" name="image" id="image" size="$form_width" value=""></td></tr>
<tr><th><label for="image_alt">説明文</label></th>
<td><input type="text" name="image_alt" id="image_alt" size="$form_width" maxlength="22" value="$in{'image_alt'}"></td></tr>
</table>
</div>


<div class="regist_form">
<p>【5】パスワード</p>

<p>登録した内容を編集・削除するのに用います。<br>
半角英数字8文字以内で入力して下さい。</p>

<table summary="登録フォーム5" border="0" cellspacing="5">
<tr><th><label for="pass">パスワード</label></th>
<td><input type="password" name="pass" id="pass" size="$form_width3" maxlength="8" value="$in{'pass'}"> $input_essential</td></tr>
</table>

<input type="submit" class="button" value="$button">
</div>
</form>
HERE

 	&html_footer;
 	exit;
}


#==========================================================
# 登録
#==========================================================
sub register
{
	my $new_no,$new_value,$new_image;

	&input_check;
	&file_lock;

	if($in{'no'} eq '')
	{
		# 新規投稿
		# ナンバーの取得と、2重投稿の確認
		$new_no = 1;
		if(@DATA != '')
		{
			foreach $line(@DATA)
			{
				&value_read($line);
				if($no > $new_no) { $new_no = $no; }
				if($name eq $in{'name'})
				{
					&file_unlock;
					return;
				}
			}
			$new_no++;
		}
		$no = $new_no;
		&value_set;
		$new_value = &value_write;
		push(@DATA,$new_value);
	}
	else
	{
		# 編集
		$new_no = $in{'no'};
		$no = $in{'no'};
		&value_set;
		$new_value = &value_write;
		$new_image = $image;
		foreach $line(@DATA)
		{
			&value_read($line);
			if($no == $new_no)
			{
				&value_read($line);
				if((($in{'image_del'} eq 'on') || ($new_image ne '')) && ($new_image ne $image))
				{
					unlink $img_dir.$image;
				}
				else
				{
					$new_image = $image;
					&value_read($new_value);
					$image = $new_image;
					$new_value = &value_write;
				}
				$line = $new_value;
				last;
			}
		}
	}

	&log_write;
	&file_unlock;
	&log_read;
}


#==========================================================
# 入力内容の確認
#==========================================================
sub input_check
{
	my $i,$value_name;

	# 入力確認
	if($in{'name'} eq '') { &error_input('キャラクター名を入力して下さい。',0); }
	if(($in{'base_lv'} ne '') && (($in{'base_lv'} < 1) || ($in{'base_lv'} > 99)))
	{ &error_input("$LABEL[3]には数値を入力して下さい。",0); }
	if(($in{'job_lv'} ne '') && (($in{'job_lv'} < 1) || ($in{'job_lv'} > 99)))
	{ &error_input("$LABEL[4]には数値を入力して下さい。",0); }
	if(($in{'hp'} ne '') && (($in{'hp'} < 1) || ($in{'hp'} > 99999)))
	{ &error_input("$LABEL[5]には数値を入力して下さい。",0); }
	if(($in{'sp'} ne '') && (($in{'sp'} < 1) || ($in{'sp'} > 9999)))
	{ &error_input("$LABEL[6]には数値を入力して下さい。",0); }

	# ステータスの入力確認
	for($i=0;$i<=13;$i++)
	{
		$value_name = 'status' . $i;
		if($in{$value_name} ne '')
		{
			if(($in{$value_name} < 0) || ($in{$value_name} > 999))
			{ &error_input("$LABEL[8+$i]には数値を入力して下さい。",0); }
			$value_name = 'status' . $i . '_2';
			if(($in{$value_name} ne '') && (($in{$value_name} < 0) || ($in{$value_name} > 999)))
			{ &error_input("$LABEL[8+$i]には数値を入力して下さい。",0); }
			elsif($in{$value_name} eq '')
			{ $in{$value_name} = 0; }
		}
		else
		{
			$value_name = 'status' . $i . '_2';
			$in{$value_name} = '';
		}
	}

	# パスワードの入力確認
	if($in{'pass'} eq '') { &error_input("パスワードを入力して下さい。",0); }
}


#==========================================================
# 値のセット
#==========================================================
sub value_set
{
	$name = $in{'name'};
	$nname = $in{'nname'};
	$gender = $in{'gender'};
	$job = $in{'job'};
	$base_lv = $in{'base_lv'};
	$job_lv = $in{'job_lv'};
	$hp = $in{'hp'};
	$sp = $in{'sp'};
	if($in{'status0'} ne '')	{ $str = $in{'status0'} . '+' . $in{'status0_2'}; }
	else						{ $str = ''; }
	if($in{'status1'} ne '')	{ $agi = $in{'status1'} . '+' . $in{'status1_2'}; }
	else						{ $agi = ''; }
	if($in{'status2'} ne '')	{ $vit = $in{'status2'} . '+' . $in{'status2_2'}; }
	else						{ $vit = ''; }
	if($in{'status3'} ne '')	{ $int = $in{'status3'} . '+' . $in{'status3_2'}; }
	else						{ $int = ''; }
	if($in{'status4'} ne '')	{ $dex = $in{'status4'} . '+' . $in{'status4_2'}; }
	else						{ $dex = ''; }
	if($in{'status5'} ne '')	{ $luk = $in{'status5'} . '+' . $in{'status5_2'}; }
	else						{ $luk = ''; }
	if($in{'status6'} ne '')	{ $atk = $in{'status6'} . '+' . $in{'status6_2'}; }
	else						{ $atk = ''; }
	if($in{'status7'} ne '')	{ $def = $in{'status7'} . '+' . $in{'status7_2'}; }
	else						{ $def = ''; }
	if($in{'status8'} ne '')	{ $matk = $in{'status8'} . '〜' . $in{'status8_2'}; }
	else						{ $matk = ''; }
	if($in{'status9'} ne '')	{ $mdef = $in{'status9'} . '+' . $in{'status9_2'}; }
	else						{ $mdef = ''; }
	$hit = $in{'status10'};
	if($in{'status11'} ne '')	{ $flee = $in{'status11'} . '+' . $in{'status11_2'}; }
	else						{ $flee = ''; }
	$critical = $in{'status12'};
	$aspd = $in{'status13'};
	$guild = $in{'guild'};
	$position = $in{'position'};
	$comment = $in{'comment'};
	$comment =~ s/\r/<br>/g;
	$image_alt = $in{'image_alt'};
	$pass = crypt($in{'pass'},"xx");

	$ip = $ENV{'REMOTE_ADDR'};
	$host = &common'get_host($ip);
	$date = &get_now_date;
	&upload;
}


#==========================================================
# 画像アップロード
#==========================================================
sub upload
{
	my $flag,$fname;

	if($in{'image'} eq '')
	{
		$image = '';
		return;
	}

	($flag,$fname) = split(/\,/,&common_image'img_upload($in{'image'},$img_dir,$no,$img_width_max,$img_height_max,@in));
	if($flag == 0)
	{
		$image = $fname;
	}
	else
	{
		&file_unlock;
		if($flag == 1)		{ &error_input("画像のアップに失敗しました。",0); }
		elsif($flag == 2)	{ &error_input("画像のサイズがオーバーしています。<br>縦：$img_height_maxピクセル　、　横：$img_width_maxピクセル　以内にして下さい。",0); }
		elsif($flag == 3)	{ &error_input("アップできる画像フォーマットはJPEG、GIF、PNGのみです。",0); }
	}
}


#==========================================================
# 編集・削除パスワード入力フォーム
#==========================================================
sub edit_pass
{
	&html_header;
	print <<"HERE";
<h2><a name="skip_page_title">記事の編集・削除</a></h2>
<form method="POST" action="$cgi_top">
<input type="hidden" name="l_no" value="$l_no">
<input type="hidden" name="no" value="$in{'no'}">
<input type="hidden" name="act" value="edit">
<label for="pass_edit">パスワード：</label>
<input type="password" name="pass" id="pass_edit" size="$form_pass" maxlength="8"><br><br>
<input type="radio" name="process" id="edit" class="none" value="edit" checked><label for="edit">編集</label>
<input type="radio" name="process" id="delete" class="none" value="delete"><label for="delete">削除</label>　
<input type="submit" class="button_no_margin" value="認証">
</form>
HERE
	&html_footer;
	exit;
}
#==========================================================
# ユーザー処理
#==========================================================
sub edit
{
	if($in{'pass'} eq '')
	{
		&error_input("パスワードが記入されていません。",1);
		&edit_pass;
	}

	foreach $line(@DATA)
	{
		&value_read($line);
		if($no == $in{'no'})
		{
			if(($pass eq crypt($in{'pass'},"xx")) || ($password eq $in{'pass'}))
			{
				if($in{'process'} eq 'edit')
				{
					$in{'name'} = $name;
					$in{'nname'} = $nname;
					$in{'gender'} = $gender;
					$in{'job'} = $job;
					$in{'base_lv'} = $base_lv;
					$in{'job_lv'} = $job_lv;
					$in{'hp'} = $hp;
					$in{'sp'} = $sp;
					if($str ne '') { ($in{'status0'},$in{'status0_2'}) = split(/\+/,$str); }
					if($agi ne '') { ($in{'status1'},$in{'status1_2'}) = split(/\+/,$agi); }
					if($vit ne '') { ($in{'status2'},$in{'status2_2'}) = split(/\+/,$vit); }
					if($int ne '') { ($in{'status3'},$in{'status3_2'}) = split(/\+/,$int); }
					if($dex ne '') { ($in{'status4'},$in{'status4_2'}) = split(/\+/,$dex); }
					if($luk ne '') { ($in{'status5'},$in{'status5_2'}) = split(/\+/,$luk); }
					if($atk ne '') { ($in{'status6'},$in{'status6_2'}) = split(/\+/,$atk); }
					if($def ne '') { ($in{'status7'},$in{'status7_2'}) = split(/\+/,$def); }
					if($matk ne '') { ($in{'status8'},$in{'status8_2'}) = split(/〜/,$matk); }
					if($mdef ne '') { ($in{'status9'},$in{'status9_2'}) = split(/\+/,$mdef); }
					$in{'status10'} = $hit;
					if($flee ne '') { ($in{'status11'},$in{'status11_2'}) = split(/\+/,$flee); }
					$in{'status12'} = $critical;
					$in{'status13'} = $aspd;
					$in{'guild'} = $guild;
					$in{'position'} = $position;
					$in{'comment'} = $comment;
					$in{'comment'} =~ s/<br>/\r/g;
					$in{'image_show'} = $image;
					$in{'image_alt'} = $image_alt;
					&register_form;
				}
				else
				{
					&file_lock;
					if($image ne '') { unlink $img_dir.$image; }
					$line = '';
					&log_write;
					&file_unlock;
					&log_read;
					&top_page;
				}
			}
			else
			{
				&error_input("パスワードが違います。",1);
				&edit_pass;
			}
		}
	}
	&error("指定したデータはすでに削除されています。");
	&top_page;
}


#==========================================================
# 使い方
#==========================================================
sub readme
{
	&html_header;
	print <<"HERE";
<h2><a name="skip_page_title">使い方</a></h2>

<ul>
<li><strong><em>登録する</em></strong><br>
上部メニューの <a href="$cgi&amp;act=register_form">新規登録</a> から登録できます。<br>
登録時には下記の点に注意して下さい。<br>
<br>
<ul class="ul2">
<li>「 $input_essential 」と書かれている項目については必ず記入する。</li>
<li>ステータスの数値は半角で記入する。</li>
</ul>
<br>
キャラクター画像をアップする場合は下記の点に注意して下さい。<br>
<br>
<ul class="ul2">
<li>利用可能\な画像フォーマットは <em>JPEG</em>、<em>GIF</em>、<em>PNG</em>です。</li>
<li>登録可能\な最大画像サイズは　<em>縦$img_height_maxピクセル×横$img_width_maxピクセル</em>　です。</li>
<li>画像のファイルサイズは <em>$cgi_lib'maxdata bytes</em> まで。</li>
</ul>
<br>
登録しようとすると「cgi-lib.pl: Request to receive too much data: ******* bytes」と表\示され登録できない場合、画像のファイルサイズが上値を超えていることを示します。<br>
画像のサイズ小さくするなどしてファイルサイズを小さくしてから再度登録して下さい。</li>

<li><strong><em>登録情報の編集</em></strong><br>
変更したいキャラクター情報の下にある「 [編集・削除] 」をクリックしてください。<br>
パスワードをきかれるので、登録時に指定したパスワードを入力し、編集にチェックを付け認証ボタンを押すと編集フォームが開きます。<br>
編集したい情報を書換えてください。</li>

<li><strong><em>登録情報の削除</em></strong><br>
削除したいキャラクター情報の下にある「 [編集・削除] 」をクリックしてください。<br>
パスワードをきかれるので、登録時に指定したパスワードを入力し、削除にチェックを付け認証ボタンを押すと削除されます。</li>
</ul>
HERE
	&html_footer;
exit;
}


#==========================================================
# 管理モード
#==========================================================
sub management
{
	if($in{'pass'} ne '')
	{
		if($in{'pass'} eq $password)	{ &management_delete; }
		else							{ &error("パスワードが違います"); }
	}

	&html_header;
	print <<"HERE";
<h2><a name="skip_page_title">管理モード</a></h2>
<p>パスワードを入力して下さい</p>
<form method="POST" action="$cgi_top">
<input type="hidden" name="l_no" value="$l_no">
<input type="hidden" name="act" value="management">
<input type="password" name="pass"><br>
<input type="submit" class="button" value="認証">
</form>
HERE
	&html_footer;
	exit;
}
#==========================================================
# 管理モード（削除）
#==========================================================
sub management_delete
{
	my $line,$del;

	unless(@DEL == '')
	{
		&file_lock;
		foreach $line(@DATA)
		{
			&value_read($line);
			foreach $del(@DEL)
			{
				if($no == $del)
				{
					if($image ne '') { unlink $img_dir.$image; }
					$line = '';
					last;
				}
			}
		}
		&log_write;
		&file_unlock;
		&log_read;
	}
	&html_header;
	print <<"HERE";
<h2><a name="skip_page_title">管理モード</a></h2>

<p>削除したい記事にチェックを入れて削除ボタンを押して下さい</p>

<form method="POST" action="$cgi_top">
<input type="hidden" name="l_no" value="$l_no">
<input type="hidden" name="act" value="management">
<input type="hidden" name="pass" value="$in{'pass'}">
<input type="submit" class="button" value="削除">

<table border="1" class="table" summary="ログ一覧">
<tr><th>削除</th><th>No</th><th>$LABEL[0]</th><th>投稿日</th><th>ホスト</th><th>IP</th></tr>
HERE

	foreach $line(@DATA)
	{
		&value_read($line);
		print "<tr class=\"center nowrap\"><td><input type=\"checkbox\" name=\"del\" class=\"none\" value=\"$no\"></td>\n";
		print "<td>$no</td><td>$name</td><td>$date</td><td>$host</td><td>$ip</td></tr>\n";
	}
	print "</table></form>\n";
	&html_footer;
	exit;
}


#==========================================================
# 現在時刻の取得
#
# return : 現在時刻
#==========================================================
sub get_now_date
{
	return(&common'get_now_date(1,1,1,0,0,0,0));
}


#==========================================================
# ファイルのロック
#==========================================================
sub file_lock
{
	if($flag_lock == 1)
	{
		if(&common'file_lock($lock_file) == 1)
		{
			&error_input('アクセスが集中しているため処理を続行できません<br>しばらく待ってから再度行ってください',0);
		}
	}
	return;
}
#==========================================================
# ファイルロックの解除
#==========================================================
sub file_unlock
{
	&common'file_unlock($lock_file);
}


#==========================================================
# value
#==========================================================
sub value_read
{
	($no,$date,$name,$nname,$gender,$job,$base_lv,$job_lv,$hp,$sp,$str,$agi,$vit,$int,$dex,$luk,
	$atk,$def,$matk,$mdef,$hit,$flee,$critical,$aspd,$guild,$position,$comment,$image,$image_alt,
	$pass,$host,$ip) = split(/\,/,$_[0]);
}

sub value_write
{
	my $value;

	$value = join(',', $no,$date,$name,$nname,$gender,$job,$base_lv,$job_lv,$hp,$sp,$str,$agi,$vit,$int,$dex,$luk,
	$atk,$def,$matk,$mdef,$hit,$flee,$critical,$aspd,$guild,$position,$comment,$image,$image_alt,$pass,$host,$ip,"\n");
	return($value);
}


#==========================================================
# ログデータの読込み
#==========================================================
sub log_read
{
	if(!open(NOTE,"$log_file")) { &error_end("ログファイルを開けません"); }
	@DATA = <NOTE>;
	close(NOTE);
	$data_number = @DATA;
}
#==========================================================
# ログデータの書込み
#==========================================================
sub log_write
{
	if(!open(NOTE,">$log_file")) { &error_end("ログファイルを開けません"); }
	print NOTE @DATA;
	close(NOTE);
	$data_number = @DATA;
}
#==========================================================
# エラーメッセージの表示
#
# input  : 0 = メッセージ
#==========================================================
sub error
{
	$flag_error = 1;
	&html_header;
	print "<p><strong><em>error：</em>$_[0]</strong></p><br>\n";
}
#==========================================================
# エラーメッセージの表示（入力エラー）
#
# input  : 0 = メッセージ
#　　　　　1 = 0/1 = 新規/編集
#==========================================================
sub error_input
{
	&error($_[0]);
	if($_[1] == 0)		{ &register_form; }
	elsif($_[1] == 1)	{ &edit_pass; }
	else				{ &top_page; }
}
#==========================================================
# エラーメッセージの表示（復帰無し）
#
#　input  : 0 = メッセージ
#==========================================================
sub error_end
{
	&error($_[0]);
	&html_footer;
	exit;
}