#!/usr/local/bin/perl

require "./setup.pl";

#時刻取得
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
@wday_array = ('SUN','MON','TUE','WED','THU','FRI','SAT');
$date_now = sprintf("%01d\/%01d(%s)%02d\:%02d",$mon +1,$mday,$wday_array[$wday],$hour,$min);

#データの読み込み
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); }
else { $buffer = $ENV{'QUERY_STRING'}; }

@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {

	($name, $value) = split(/=/, $pair);
	$name =~ tr/+/ /;
	$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
	$value =~ tr/+/ /;
	$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

	&jcode'convert(*name,'sjis');
	&jcode'convert(*value,'sjis');

	$value =~ s/</&lt;/g;
	$value =~ s/>/&gt;/g;
	$value =~ s/"/&quot;/g;
	$value =~ s/\t//g;

	$in{$name} = $value;
	push(@out,"$name\0$value");
}

if ($in{'_mode'} eq 'under') { $under = 1; } # 途中経過モード

if ($center) { $center1 = '<center>'; $center2 = '</center>'; }
if ($center_u) { $center3 = '<center>'; $center4 = '</center>'; }

$od_check = (eval { opendir(DIR,$base_dir); }, $@ eq "");
if (!$od_check) { &error("エラー","ファイル一覧が取得できません."); }

$cookie_name = $ENV{'SCRIPT_NAME'};
@newls = ();

@list = readdir(DIR); # ファイル名の抽出

foreach $file (@list) {

	next if $file eq '.';
	next if $file eq '..';
	next if -d $file;

	if ($file =~ /\.csv/) {

		#商品設定ファイルを開く(取扱商品データを読み込む)
		if (!open(FILE,"$base_dir$file")) { &error('エラー',"商品ファイル$fileが読み出せません."); }

		#ファイルハンドル'FILE'から１行ずつデータを読む
		while (<FILE>) {

			#無視
			s/\t//g;
			s/\n//g;

			#行頭がシャープまたは空行の場合は次へ
			if (/^#/) { next; }
			if (/^$/) { next; }

			#データ抽出
			($code,$name,$tanka,$rem,$rem2,$rem3,$url,$type) = &DecodeCSV($_);

			$name{$code} = $name;
			$tanka =~ s/\,//g; $tanka =~ s/\\//g; $tanka{$code} = $tanka;

			if ($rem eq '') { $rem = '　'; }
			if ($rem2 eq '') { $rem2 = '　'; }
			if ($rem3 eq '') { $rem3 = '　'; }

			$rem{$code} = $rem;
			$rem2{$code} = $rem2;
			$rem3{$code} = $rem3;
			$url{$code} = $url;
			$type{$code} = $type;
		}
		close(FILE);
	}
}

close(DIR);

#商品コードをキーとした%orderに数量を格納
while (($key,$val) = each %in) {

	if ($key =~ /\;(.+)\;/) { $code = $1; }

	#削除する商品コードを取得
	if ($in{'_action'} eq 'delete') {

		if ($key =~ /\;(.+)\;/) { $delete_id = $1; last; }
	}
	#商品コードが所定の形式で入力され、数量に0以外の数字が指定されている場合に処理
	elsif ($val =~ /\d+/ && $val != 0) {

		if ($key =~ /\;(.+)\;/) {

			$code = $1;
			if ($name{$code} eq '') { &error("エラー","商品コード$codeが商品設定ファイルに存在していない可能\性があるので選択できません.","管理者にお問い合わせください."); }
			$w = 1; $order{$code} = $val;
		}
	}
	elsif ($key =~ /\;(.+)\;/ && $val =~ /\D/) { &error("エラー","商品コード$codeの数量が半角数字以外で指定されています.","半角数字で入力してください."); }
}

#クッキーの取得
$cookies = $ENV{'HTTP_COOKIE'};

@pairs = split(/;/,$cookies);
foreach $pair (@pairs) {

	($key,$val) = split(/=/,$pair,2);
	$key =~ s/ //g;

	if ($key eq $cookie_name) {

		@pairs = split(/,/,$val);
		foreach $pair (@pairs) {

			($key,$val) = split(/:/,$pair,2);
			$COOKIE{$key} = $val;
		}
		last;
	}
}

#削除処理
if ($in{'_action'} eq 'delete') {

	#バスケットファイルを開く
	if (!open(ORDER,"$tmp_dir$in{'_order'}\.bkt")) { &error("何も選択されていません"); }
	@base = <ORDER>;
	close(ORDER);

	@new = grep(!/^($delete_id)\t/,@base);

	if (!@new) { $delall = 1; unlink "$tmp_dir$in{'_order'}\.bkt"; }
	else {
		if (!open(FILE,"> $tmp_dir$in{'_order'}\.bkt")) { &error("設定エラー","バスケットファイルに再記録できません."); }
		print FILE @new;
		close(FILE);
	}
}

#注文フォーム
elsif ($in{'_action'} eq 'mailform') { &mailform; }

#送信フォーム
elsif ($in{'_action'} eq 'mail') { &mail; }

#登録処理
elsif ($w) {

	if ($COOKIE{'OrderNo'} eq '') {

		$COOKIE{'OrderNo'} = sprintf("%04d%02d%02d%02d%02d%02d",$year +1900,$mon +1,$mday,$hour,$min,$sec);

		#新規処理
		if (!open(FILE,"> $tmp_dir$COOKIE{'OrderNo'}\.bkt")) { &error("設定エラー","作業ディレクトリが正しく設定されていません."); }
	}
	else {
		#追加処理
		if (!open(FILE,">> $tmp_dir$COOKIE{'OrderNo'}\.bkt")) { &error("設定エラー","作業ディレクトリが正しく設定されていません."); }
	}

	#商品コードと数量をファイルに記録
	while (($code,$kazu) = each %order) { print FILE "$code\t$kazu\n"; }

	close(FILE);
	chmod(0666,"$tmp_dir$COOKIE{'OrderNo'}\.bkt");
}

#バスケット一時ファイルの一覧
$od_check = (eval { opendir(DIR,$tmp_dir); }, $@ eq "");
if (!$od_check) { &error("エラー","opendir()に致命的なエラーが発生しました."); }
@ls = readdir(DIR);
close(DIR);

#残存した一時ファイルを削除
($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time - 2*24*60*60);
$limit = sprintf("%04d%02d%02d%02d%02d%02d",$yearg +1900,$mong +1,$mdayg,$hourg,$ming,$secg);

foreach $file (@ls) {

	next if $file eq '.';
	next if $file eq '..';
	next if -d $file;
	if ($file =~ /(\d+)\.bkt/) { if ($1 < $limit) { unlink "$tmp_dir$file"; }}
}

#セットするクッキーの内容
if ($delall) { $set_cookie = ""; }
else { $set_cookie = "OrderNo\:$COOKIE{'OrderNo'}"; }

#識別クッキーの設定
print "Set-Cookie: $cookie_name=$set_cookie\n";

#画面出力開始
print "Content-type: text/html\n\n";

if ($under) {

	print <<"EOF";
	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
	<HTML><HEAD><TITLE></TITLE><meta http-equiv="Content-Type" content="text/html; charset=x-sjis">
	<SCRIPT language="JavaScript">
	<!--
	function PageBack(){ history.back(); }
	//-->
	</SCRIPT>
	</HEAD>
	$body2
	$center3
	<form method=POST action="cargo.cgi" target=_parent>
	<input type=hidden name="_order" value="$COOKIE{'OrderNo'}">
	<table><tr>
	<td>$title2</td>
	<td><table border=3 cellpadding=1 cellspacing=2>
EOF

	#バスケットファイルを開く
	if (open(ORDER,"$tmp_dir$COOKIE{'OrderNo'}\.bkt")) {

		&cal1;
		while (($code,$val) = each %list) { &cal2; }

		close(ORDER);

		$taxs = int($taxs);
		$gokei = int($gokei);

		#桁カンマ挿入処理
		1 while $keis =~ s/(.*\d)(\d\d\d)/$1,$2/g;
		1 while $gokei =~ s/(.*\d)(\d\d\d)/$1,$2/g;
		1 while $taxs =~ s/(.*\d)(\d\d\d)/$1,$2/g;
		1 while $kazu =~ s/(.*\d)(\d\d\d)/$1,$2/g;

		print <<"EOF";
		<tr>
EOF
		if ($taxps == 1) {

			print <<"EOF";
			<td bgcolor=#555555 align=right nowrap>小計 $keis円</td>
			<td bgcolor=#555555 align=right nowrap>消費税 $taxs円</td>
EOF
		}

		print <<"EOF";
		<td bgcolor=#555555 align=right nowrap><b>現在のお買い物</b> $gokei円</td>
		</tr>
		</table></td>
		<td nowrap>　<input type=submit value="かごの中を見る/ご注文へ"></td>
EOF
	}
	else {
		print <<"EOF";
		<tr>
EOF
		if ($taxps == 1) {

			print <<"EOF";
			<td bgcolor=#555555 align=right nowrap>小計 0円</td>
			<td bgcolor=#555555 align=right nowrap>消費税 0円</td>
EOF
		}

		print <<"EOF";
		<td bgcolor=#555555 align=right nowrap><b>現在のお買い物</b> 0円</td>
		</tr>
		</table></td>
EOF
	}

print <<"EOF";
<td><font size=-2><a href="cargo.cgi?_mode=under">更新</a></font></td>
</tr>
</table>
</form>
$center4
</body></html>
EOF

exit;

}

print <<"EOF";
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
<HEAD>
<TITLE>$title_bar</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=x-sjis">
<SCRIPT language="JavaScript">
<!--
function PageBack(){ history.back(); }
//-->
</SCRIPT>
</HEAD>
$body
$center1
$title
EOF

#バスケットファイルを開く
if (open(ORDER,"$tmp_dir$COOKIE{'OrderNo'}\.bkt")) {

	print <<"EOF";
	<table><tr><td>$msg_top2</td></tr></table>
	<form method=POST action="cargo.cgi">
	<input type=hidden name="_order" value="$COOKIE{'OrderNo'}">
	<input type=hidden name="_action" value="delete">
	<table border=$border_c cellpadding=1 cellspacing=2>
	<tr>
	<th bgcolor=#555555><font color=#ffffff size=+1>番号</font></th>
	<th bgcolor=#555555><font color=#ffffff size=+1>タイトル</font></th>
	<th bgcolor=#555555><font color=#ffffff size=+1>$rem_name</font></th>
	<th bgcolor=#555555><font color=#ffffff size=+1>$rem_name2</font></th>
	<th bgcolor=#555555><font color=#ffffff size=+1>$rem_name3</font></th>
	<th bgcolor=#555555><font color=#ffffff size=+1>売価</font></th>
	<th bgcolor=#555555><font color=#ffffff size=+1>数量</font></th>
EOF
	if ($taxps == 1) { #消費税を処理する場合

		print <<"EOF";
		<th bgcolor=#555555><font color=#ffffff size=+1>税別計(円)</font></th>
		<th bgcolor=#555555><font color=#ffffff size=+1>消費税(円)</font></th>
		<th bgcolor=#555555><font color=#ffffff size=+1>税込計(円)</font></th>
EOF
	}
	else {
		print <<"EOF";
		<th bgcolor=#555555><font color=#ffffff size=+1>小計(円)</font></th>
EOF
	}

	print <<"EOF";
	<th bgcolor=#555555><font color=#ffffff size=+1>取消</font></th>
	</tr>
EOF
	#集計
	&cal1;

	foreach $code (sort keys %list) { # 商品コード順
#	foreach $code (sort { $list{$b} <=> $list{$a} } keys %list) { # 数量が多い順

		if ($name{$code} eq '') { push(@ERR,$code); }

		#集計
		&cal2;

		#商品名と備考中のコロンを改行に変換
		$name{$code} =~ s/\:/<br>/g;
		$rem{$code} =~ s/\:/<br>/g;
		$rem2{$code} =~ s/\:/<br>/g;
		$rem3{$code} =~ s/\:/<br>/g;

		$c++;
		unless ($c % 2) { $bg = "#ffeedd"; } else { $bg = "#ffffff"; } #１行おきにセルの背景色を替える

		print <<"EOF";
		<tr>
		<td bgcolor=$bg>$code</td>
		<td bgcolor=$bg>$name{$code}</td>
		<td bgcolor=$bg>$rem{$code}</td>
		<td bgcolor=$bg>$rem2{$code}</td>
		<td bgcolor=$bg>$rem3{$code}</td>
		<td bgcolor=$bg align=right>$tanka2</td>
		<td bgcolor=$bg align=right>$kazu2</td>
EOF
		if ($tax == 0) { $tax2 = ""; } # 消費税率が0%の場合は表示しない

		if ($taxps == 1) {

			print <<"EOF";
			<td bgcolor=$bg align=right>$kei2</td>
			<td bgcolor=$bg align=right>$tax2</td>
EOF
		}

		print <<"EOF";
		<td bgcolor=$bg align=right>$kei2_and_tax</td>
		<td bgcolor=$bg><input type=submit name=";$code;" value="取消"></td>
		</tr>
EOF
	}

	close(ORDER);

	print <<"EOF";
	<tr>
	<td bgcolor=#ffaaaa colspan=6 align=center><font size=-1>$message1</font></td>
	<td bgcolor=#ffaaaa align=right><strong>$kazuall</strong></td>
EOF
	if ($taxps == 1) {

		$TAX = $taxs = $keis * $taxrate / 100;
		$taxs = int($taxs);
		1 while $taxs =~ s/(.*\d)(\d\d\d)/$1,$2/g;
		$gokei = $keis + $TAX;
		1 while $keis =~ s/(.*\d)(\d\d\d)/$1,$2/g;

		print <<"EOF";
		<td bgcolor=#ffaaaa align=right><strong>$keis</strong></td>
		<td bgcolor=#ffaaaa align=right><strong>$taxs</strong></td>
EOF
	}
	else {
		1 while $taxs =~ s/(.*\d)(\d\d\d)/$1,$2/g;
	}

	$gokei = int($gokei);
	1 while $gokei =~ s/(.*\d)(\d\d\d)/$1,$2/g;

	print <<"EOF";
	<td bgcolor=#ff8888 align=right><strong><font size=+1>$gokei</font></strong></td>
	<td bgcolor=#ffaaaa>$taxmes</td>
	</tr>
	</table><p>
	</form>
	<p>
	<table><tr><td>$msg_btm2</td></tr></table>
EOF
	if (@ERR) { print "<b>？次の商品コードを持つ商品がリストから削除されましたのでバスケットから[取消]してください &gt; @ERR</b><p>\n"; }
	else {
		print <<"EOF";
		<form method=POST action="cargo.cgi">
		<input type=hidden name="_order" value="$COOKIE{'OrderNo'}">
		<input type=hidden name="_action" value="mailform">
		<input type=submit value="ご注文される方は先へお進みください → NEXT">
		</form>
EOF
	}
}
else { print "<h3>何も選択されていません</h3>\n"; }

print <<"EOF";
<h3><hr noshade size=2>[<A HREF="JavaScript:history.back()">前の画面</A>]
[<A HREF="cargo.cgi">最新のかごの中身</A>]
[<A HREF="$top">$go_name</A>]</h3>
$center2
</body></html>
<!-- $COOKIE{'OrderNo'} -->
EOF

exit;

sub cal1 {

	#同じ商品があれば合算する
	foreach (<ORDER>) {

		s/\n//;
		($code,$kazu) = split(/\t/);
		$list{$code} += $kazu;
	}
}

sub cal2 {

	#計＝数量×単価
	$kei = $kei2 = $list{$code} * $tanka{$code};
	1 while $kei2 =~ s/(.*\d)(\d\d\d)/$1,$2/g;

	$kazu2 = $list{$code};
	$tanka2 = $tanka{$code};
	1 while $kazu2 =~ s/(.*\d)(\d\d\d)/$1,$2/g;
	1 while $tanka2 =~ s/(.*\d)(\d\d\d)/$1,$2/g;

	if ($taxps == 1) {

		#税＝計×税率÷100
		$tax = $kei * $taxrate / 100;
		$tax2 = int($tax);
		1 while $tax2 =~ s/(.*\d)(\d\d\d)/$1,$2/g;

		#税込計＝計＋税
		$kei_and_tax = $kei + $tax;
		$kei2_and_tax = int($kei_and_tax);
	}
	elsif ($taxps == -1) {$kei_and_tax = $kei2_and_tax = $kei; $taxmes = '(税込)'; }
	else { $kei_and_tax = $kei2_and_tax = $kei; $taxmes = ''; }

	1 while $kei2_and_tax =~ s/(.*\d)(\d\d\d)/$1,$2/g;

	#合算
	$keis += $kei;
	$gokei += $kei_and_tax;
	$taxs += $tax;
	$kazuall += $list{$code};
}

sub mailform {

	#訪問販売法での広告表示義務事項ファイルを開く
	if (!open(FILE,"$base_dir$hanbai")) { &error('エラー',"訪問販売法での広告表示義務事項ファイルが読み出せません."); }
	@HANBAI = <FILE>;
	close(FILE);

	#受注フォームファイルを開く
	if (!open(FILE,"$base_dir$juchu")) { &error('エラー',"受注フォームファイルが読み出せません."); }
	@JUCHU = <FILE>;
	close(FILE);

	#画面出力開始
	print "Content-type: text/html\n\n";

	print <<"EOF";
	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
	<HTML>
	<HEAD>
	<TITLE>$title_bar</TITLE>
	<meta http-equiv="Content-Type" content="text/html; charset=x-sjis">
	<SCRIPT language="JavaScript">
	<!--
	function PageBack(){ history.back(); }
	//-->
	</SCRIPT>
	</HEAD>
	$body
	$center1
	<h1>《ご注文フォーム》</h1>
EOF

	#バスケットファイルを開く
	if (open(ORDER,"$tmp_dir$COOKIE{'OrderNo'}\.bkt")) {

		print <<"EOF";
		<form method=POST action="cargo.cgi">
		<input type=hidden name="_order" value="$COOKIE{'OrderNo'}">
		<input type=hidden name="_action" value="mail">
		<table border=$border_c cellpadding=1 cellspacing=2>
		<tr>
		<th bgcolor=#555555><font color=#ffffff size=+1>番号</font></th>
		<th bgcolor=#555555><font color=#ffffff size=+1>タイトル</font></th>
		<th bgcolor=#555555><font color=#ffffff size=+1>$rem_name</font></th>
		<th bgcolor=#555555><font color=#ffffff size=+1>$rem_name2</font></th>
		<th bgcolor=#555555><font color=#ffffff size=+1>$rem_name3</font></th>
		<th bgcolor=#555555><font color=#ffffff size=+1>売価</font></th>
		<th bgcolor=#555555><font color=#ffffff size=+1>数量</font></th>
EOF
		#消費税を処理する場合
		if ($taxps == 1) {

			print <<"EOF";
			<th bgcolor=#555555><font color=#ffffff size=+1>税別計(円)</font></th>
			<th bgcolor=#555555><font color=#ffffff size=+1>消費税(円)</font></th>
			<th bgcolor=#555555><font color=#ffffff size=+1>税込計(円)</font></th>
EOF
		}
		else {
			print <<"EOF";
			<th bgcolor=#555555><font color=#ffffff size=+1>小計(円)</font></th>
EOF
		}

		print <<"EOF";
		</tr>
EOF
		#集計
		&cal1;

		foreach $code (sort keys %list) { # 商品コード順
#		foreach $code (sort { $list{$b} <=> $list{$a} } keys %list) { # 数量が多い順

			#集計
			&cal2;

			#商品名と備考中のコロンをスペースに変換
			$name{$code} =~ s/\:/ /g;
			$rem{$code} =~ s/\:/ /g;
			$rem2{$code} =~ s/\:/ /g;
			$rem3{$code} =~ s/\:/ /g;

			$c++;
			unless ($c % 2) { $bg = "#ffeedd"; } else { $bg = "#ffffff"; } #１行おきにセルの背景色を替える

			print <<"EOF";
			<tr>
			<td bgcolor=$bg>$code</td>
			<td bgcolor=$bg>$name{$code}</td>
			<td bgcolor=$bg>$rem{$code}</td>
			<td bgcolor=$bg>$rem2{$code}</td>
			<td bgcolor=$bg>$rem3{$code}</td>
			<td bgcolor=$bg align=right>$tanka2</td>
			<td bgcolor=$bg align=right>$kazu2</td>
			<input type=hidden name="ORDER" value="●$code $name{$code}">
EOF
			if ($mailrem) { print "<input type=hidden name=\"ORDER\" value=\"$rem{$code}\">\n"; }

			if ($taxps == 1) {

				if ($tax == 0) { $tax2 = ""; } # 消費税率が0%の場合はエラー

				print <<"EOF";
				<td bgcolor=$bg align=right>$kei2</td>
				<td bgcolor=$bg align=right>$tax2</td>
				<input type=hidden name="ORDER" value="\@$tanka2円×$kazu2＝$kei2円.">
EOF
			}
			else {
				print <<"EOF";
				<input type=hidden name="ORDER" value="\@$tanka2×$kazu2＝$kei2_and_tax\.">
EOF
			}

			print <<"EOF";
			<td bgcolor=$bg align=right>$kei2_and_tax</td>
			</tr>
EOF
		}

		close(ORDER);

		$taxs = int($taxs);
		$gokei = int($gokei);

		#カンマ挿入処理
		1 while $keis =~ s/(.*\d)(\d\d\d)/$1,$2/g;
		1 while $gokei =~ s/(.*\d)(\d\d\d)/$1,$2/g;
		1 while $taxs =~ s/(.*\d)(\d\d\d)/$1,$2/g;
		1 while $kazu =~ s/(.*\d)(\d\d\d)/$1,$2/g;

		print <<"EOF";
		<tr>
		<th bgcolor=#ffaaaa colspan=6><font size=-1 align=center>送料別合計 →</font></th>
		<td bgcolor=#ffaaaa align=right><strong>$kazuall</strong></td>
EOF
		if ($taxps == 1) {

			print <<"EOF";
			<input type=hidden name="消費税" value="$taxs円">
			<td bgcolor=#ffaaaa align=right><strong>$keis</strong></td>
			<td bgcolor=#ffaaaa align=right><strong>$taxs</strong></td>
EOF
		}

		print <<"EOF";
		<td bgcolor=#ff8888 align=right>$taxmes <strong><font size=+1>$gokei</font></strong></td>
		</tr>
		</table>
		<p>
		<input type=hidden name="合計" value="$gokei円 $taxmes">
		<table><tr><td>
EOF
		foreach (@JUCHU) { print; }

		print <<"EOF";
		</td></tr></table>
		</form>
EOF
	}
	else { print "<h3>何も選択されていません</h3>\n"; }

	print <<'EOF';
	<br><h3>《訪問販売法での広告表示事項等》</h3>
EOF
	print "<form><textarea cols=80 rows=10>";
	foreach (@HANBAI) { print; }

	if ($reg_name eq '' || $reg_code eq '') { $reg = "未登録"; }
	else { $reg = "$reg_name 登録コード：$reg_code"; }

	print "\n"; #↓削除しないこと.
	print '＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿__＿＿＿＿＿＿＿＿＿＿＿______' . "\n";
	print "ショッピングバスケットシステム・プロ http://www.rescue.ne.jp/\n";
	print "シェアウエア登録：$reg\n";
	print "</textarea></form><p>\n";

	print <<"EOF";
	<h3><hr>[<A HREF="JavaScript:history.back()">前の画面</A>]
	[<A HREF="$top">$go_name</A>]</h3>
	$center2
	</body></html>
EOF
	exit;
}

#メール送信処理
sub mail {

	unless ($in{'_EMAIL'} =~ /\b[-\w.]+@[-\w.]+\.[-\w]+\b/) { &error('未記入があります','Ｅメールは半角で正しくご記入ください.'); }

	$host = $ENV{'REMOTE_HOST'};
	$addr = $ENV{'REMOTE_ADDR'};
	if ($host eq '') { $host = $addr; }
	if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; }

	if ($hiho) {

		$in{'_SUBJECT'} = "\[$in{'_order'}\] Mail Order";
		if (!open(OUT,"| $sendmail -s \"$in{'_SUBJECT'}\" -f \"$in{'_EMAIL'}\" $mailto")) { &error('Error'); }
	}
	else {
		if (!open(OUT,"| $sendmail -t")) { &error('Error'); }

		print OUT "X-Processed: $date_now\n";
		print OUT "X-Mailer: SHPPING CARGO PRO by www.rescue.ne.jp $reg_code\n";
		print OUT "X-HTTP-REFERER: $ENV{'HTTP_REFERER'}\n";
		print OUT "To: $mailto\n";
		print OUT "From: $in{'_EMAIL'}\n";
		print OUT &jis("Subject: \[$in{'_order'}\] $in{'_SUBJECT'}\n");
		print OUT "\n";
	}

	foreach (@out) {

		($name,$value) = split("\0");

		#メール用にタグ変換
		$value =~ s/&amp;/&/g;
		$value =~ s/&quot;/"/g;
		$value =~ s/&lt;/</g;
		$value =~ s/&gt;/>/g;
		if ($value =~ /(\.)$/) { $value =~ s/\./\n/; }

		if ($name eq 'ORDER' && $value ne '') { print OUT &jis("$value\n"); }
		elsif ($name eq 'ORDER' && $value eq '') { next; }
		elsif ($name eq '_EMAIL') { print OUT &jis("[Ｅメール]\n$value\n\n"); }
		elsif ($name =~ /^\_/) { next; }
		else { print OUT &jis("[$name]\n$value\n\n"); }
	}

	print OUT "\n";
	print OUT "Sender Information >>\n";
	print OUT "X-HTTP-User-Agent: $ENV{'HTTP_USER_AGENT'}\n";
	print OUT "X-Remote-host: $host\n";
	print OUT "X-Remote-Addr: $ENV{'REMOTE_ADDR'}\n";
	close(OUT);

	#-------------------->

	#識別クッキーの設定(空書込)
	print "Set-Cookie: $cookie_name=\n";

	#画面出力開始
	print "Content-type: text/html\n\n";

	print <<"EOF";
	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
	<HTML>
	<HEAD>
	<TITLE>$title_bar</TITLE>
	<meta http-equiv="Content-Type" content="text/html; charset=x-sjis">
	<SCRIPT language="JavaScript">
	<!--
	function PageBack(){ history.back(); }
	//-->
	</SCRIPT>
	</HEAD>
	$body
	$center1
	<table><tr><td>$msg_sended</td></tr></table>
	<p>
EOF
	print "<form>\n";
	print "<textarea cols=70 rows=20>";

	print "発注日 $date_now\n";
	print "受付番号 $in{'_order'}\n";
	print "問い合わせ先 $mailto\n\n";

	foreach (@out) {

		($name,$value) = split("\0");
		if ($value =~ /(\.)$/) { $value =~ s/\./\n/; }

		if ($name eq 'ORDER' && $value ne '') { print "$value\n"; }
		elsif ($name eq 'ORDER' && $value eq '') { next; }
		elsif ($name eq '_EMAIL') { print "[Ｅメール]\n$value\n\n"; }
		elsif ($name =~ /^\_/) { next; }
		else { print "[$name]\n$value\n\n"; }
	}

	print "</textarea></form><p>\n";

	if ($resp) {

		sleep(1);

		if ($hiho) {

			$in{'_SUBJECT'} = "\[$in{'_order'}\] Mail Order (COPY)";
			open(OUT,"| $sendmail -s \"$in{'_SUBJECT'}\" -f \"$mailto\" $in{'_EMAIL'}");
		}
		else {
			open(OUT,"| $sendmail -t");

			print OUT "X-Processed: $date_now\n";
			print OUT "X-Mailer: SHPPING CARGO PRO by www.rescue.ne.jp $reg_code\n";
			print OUT "X-HTTP-REFERER: $ENV{'HTTP_REFERER'}\n";
			print OUT "To: $in{'_EMAIL'}\n";
			print OUT "From: $mailto\n";
			print OUT &jis("Subject: \[$in{'_order'}\] $in{'_SUBJECT'} (写し)\n");
			print OUT "\n";
		}

		print OUT &jis("$head\n");

		foreach (@out) {

			($name,$value) = split("\0");

			#メール用にタグ変換
			$value =~ s/&amp;/&/g;
			$value =~ s/&quot;/"/g;
			$value =~ s/&lt;/</g;
			$value =~ s/&gt;/>/g;
			if ($value =~ /(\.)$/) { $value =~ s/\./\n/; }

			if ($name eq 'ORDER' && $value ne '') { print OUT &jis("$value\n"); }
			elsif ($name eq 'ORDER' && $value eq '') { next; }
			elsif ($name eq '_EMAIL') { print OUT &jis("[Ｅメール]\n$value\n\n"); }
			elsif ($name =~ /^\_/) { next; }
			else { print OUT &jis("[$name]\n$value\n\n"); }
		}

		print OUT &jis("$sign\n");

		close(OUT);
	}

	print <<"EOF";
	<p>
	<table><tr><td>$msg_sended2</td></tr></table><p>
	<h3><hr>[<A HREF="JavaScript:history.back()">前の画面</A>]
	[<A HREF="$end" target="_top">$end_name</A>]</h3>
	$center2
	</body></html>
EOF

exit;

}

sub EncodeCSV {

	local(@fields) = @_;
	local(@CSV) = ();

	foreach $text (@fields) {

		$text =~ s/"/""/g;
		if ($text =~ /,|"/) { $text = "\"$text\""; }

		$text =~ s/&amp;/&/g;
		$text =~ s/&quot;/"/g;
		$text =~ s/&lt;/</g;
		$text =~ s/&gt;/>/g;

		push(@CSV,$text);
	}

	return join(',',@CSV);
}

sub DecodeCSV {

	local($text) = @_;
	local(@fields) = ();
	local($a);

	$text =~ s/\n//;
	if ($text eq '') { return (); }

	while ($text =~ m/"([^\\]*(\\.[^\\]*)*)",?|([^,]+),?|,/g) {

		$a = defined($1) ? $1 : $3;
		$a =~ s/""/"/g;

		$a =~ s/&/&amp;/g;
		$a =~ s/"/&quot;/g;
		$a =~ s/</&lt;/g;
		$a =~ s/>/&gt;/g;

		push(@fields,$a);
	}
	push(@fields, undef) if $text =~ m/,$/;

	@fields;
}

sub lock {

	# ロック方式の自動判定 symlink()優先
	$symlink_check = (eval { symlink("",""); }, $@ eq "");
	if (!$symlink_check) {

		$c = 0;
		while(-f "$lockfile") { # file式

			$c++;
			if ($c >= 3) { &error('リトライエラー','ただいま混雑している可能性があります.','戻ってもう一度実行してみてください.'); }
			sleep(2);
		}
		open(LOCK,">$lockfile");
		close(LOCK);
	}
	else {
		local($retry) = 3;
		while (!symlink(".", $lockfile)) { # symlink式

			if (--$retry <= 0) { &error('リトライエラー','ただいま混雑している可能性があります.','戻ってもう一度実行してみてください.'); }
			sleep(2);
		}
	}
}

sub error {

	local (@msg) = @_;
	local ($i);

	if (-e $lockfile) { unlink($lockfile); }

	print "Content-type: text/html\n\n";

	print <<"EOF";
	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
	<HTML>
	<HEAD>
	<TITLE>$title_bar</TITLE>
	<meta http-equiv="Content-Type" content="text/html; charset=x-sjis">
	<SCRIPT language="JavaScript">
	<!--
	function PageBack(){ history.back(); }
	//-->
	</SCRIPT>
	</HEAD>
	$body
	$center1
	<h1>$_[0]</h1>
	<table><tr><td>
EOF
	foreach $i (1 .. $#msg) { print "$msg[$i]<br>\n"; }

	print <<"EOF";
	</td></tr></table>
	<h3>[<A HREF="JavaScript:history.back()">前の画面</A>]
[<A HREF="cargo.cgi">最新のかごの中身</A>]
[<A HREF="$top">$go_name</A>]</h3>
	$center2
	</body></html>
EOF
	exit;
}

sub jis {

	local($msg) = @_;
	&jcode'convert(*msg,'jis');
	return $msg;
}
