#!/usr/local/bin/perl

# ↑ Perl処理系のパスを指定。不明な場合はプロバイダかサーバー管理者に確認。

#   オンラインショップ構築支援ソフト (ユーザー用)
#      [ウェブ・ストアー for Customers]
#    - Version 1.12 / Feb 20, 2004 / Shareware
#    - Copyright(C)2004 WEB POWER. All Rights Reserved.
#    - 最新版・最新情報は <http://www.webpower.jp/>

&ErrorSign if ($ENV{'QUERY_STRING'} eq 'error');
eval {

#-----------------------------------------------------------------------------#
# ここから初期設定（サーバーへの設置方法は同梱の'readme.txt'をご覧ください）  #
#-----------------------------------------------------------------------------#
#
#   ●印の項目は必ず変更してください。
#   ○印の項目は主にレイアウト関連です。基本的に変更不要です。
#   ◎印の項目はサーバー環境によって変更する必要があります。（1行目も含みます）
#
#  ・ ''内に記述しますが、'を入れたい場合は 中の'は \'にしてください。
#  ・ 行の頭に"#"を付けると、その行は無効になります。(コメントアウト)
#  ・ "$"、";"、"="等は間違って消さないようにしてください。エラーになります。
#  ・ 詳しくは本サイトの解説/FAQ等を参照してください。
#


#---<パスについて>-------------------------------------------------------------
#
#  ・ パスとはサーバー内での場所です。httpで始まるURLとは違うものです。
#  ・ 相対パスとはスクリプトの場所を基準としたパスの指定です。
#      ../ => 1つ上のディレクトリ  ./ => 同じディレクトリ
#  ・ 絶対パスとはサーバー内の一番上のディレクトリを基準としたパスの指定です。
#      /usr/sbin/sendmail  /home/foo/public_html/cgi-bin/script.cgi
#  ・ 仮想アドレスとはURLの一部分(ドメイン名以降)を指します。
#     http://www.domain.com/~foo/cgi-bin/script.cgi
#                          ^ ドメイン名の後のスラッシュ"/"以降の部分
#                             (/~foo/cgi-bin/script.cgi のこと)

# ○ 日本語変換ライブラリ"jcode.pl"のパス
require 'jcode.pl';

# ○ CGI標準入出力ライブラリ"stdio.pl"のパス
require 'stdio.pl';

# ○ データ格納用ディレクトリのパス
#     ※重要 <<外部から直接参照できないような措置をとること>>
#     * このディレクトリのパーミッションは<777>or<707>にする
$DataDir = '../cargo/data/';

# ○ データファイルのファイル名 (ファイル名であってパスではない)
#     * データを記録するファイル。
$DataName = 'data.txt';

# ○ サーバー環境設定ファイルのファイル名 (ファイル名であってパスではない)
#     * パスワード等を記録するファイル。拡張子が"*.cgi"だが、CGIではない
$EnvName = 'env.cgi';

# ○ システム環境設定ファイルのパス
$SetupFile = '../cargo/setup.ini';

# ○ 都道府県・送料定義ファイルのパス
$SendCostFile = '../cargo/sendcost.txt';

# ◎ メール送信コマンドsendmailのパス
#     * メール送信関連機能を使用しない(できない)場合はコメントアウトする
$sendmail = '/usr/sbin/sendmail';

# ○ 特定商取引法に基づく表示を表記したファイルのパス
$HomonFile = '../cargo/hohan.txt';

# ○ ジャンル定義ファイルのパス
$CategoryFile = '../cargo/category.txt';


#---<スキンファイルのパス>-----------------------------------------------------
#
#  ・ スキンファイルとは、CGIが識別できる特殊タグ(%{****})を記述したHTMLファイ
#     ルです。CGIは、このスキンファイルに基づいてページレイアウトをします。
#  ・ ここでは、スキンファイルのパスを指定してください。
#  ・ http://...では指定できません。必ずサーバー内でのパスで指定してください。


# ● オーダーページスキンファイルのパス
$OrderPage = '../cargo/orderform.html';

# ● オーダー完了スキンファイルのパス
$OrderedPage = '../cargo/ordered.html';

# ● 商品ページスキンファイルのパス
$GoodsPage = '../cargo/page.html';

# ● 商品データ表示スキンファイル1のパス
$GoodsTemplate1 = '../cargo/template1.html';

# ○ 商品データ表示スキンファイル2のパス
#     * 設定すればはスキンファイル1と2を交互に表示できる
$GoodsTemplate2 = '../cargo/template2.html';

# ○ 下フレームスキンファイルのパス
#     * フレームを使わない場合はコメントアウトする。
#$FrameFile = 'frame.html';


#---<特殊な設定>---------------------------------------------------------------
#
#   通常は自動的にセットされるため設定不要。ただし、CGI-WRAP等を採用して
#   いるサーバー(interQ等)は、設定する必要がある。
#    * 設定した場合は、$の前のシャープ"#"を取り除く

# ◎ サーバーの名前 (通常設定不要)
#$ENV{'SERVER_NAME'} = 'www.domain.ne.jp';

# ◎ スクリプト(このファイル)の仮想アドレス (通常設定不要)
#$ENV{'SCRIPT_NAME'} = '/~foo/cgi-bin/sbbs.cgi';


#-----------------------------------------------------------------------------#
# 初期設定ここまで (以下、修正不要。変更した場合は動作未保証＆サポート対象外) #
#-----------------------------------------------------------------------------#

};
$Script   = $1 if ($ENV{'SCRIPT_NAME'} =~ /([^\\\/]+$)/);
Error('301 初期設定エラー',$@) if ($@);

    #  ソースコードの文字コード認識
    if (ord "漢" == 0xb4 || ord "漢"  == -76) {
        $jcode = "euc";
        #$JCODE2  = "EUC-JP";
        #$CHARSET = "; charset=EUC-JP";
    } elsif (ord "漢" == 0x8a || ord "漢" == -118) {
        $jcode = "sjis";
        #$JCODE2  = "Shift_JIS";
        #$CHARSET = "; charset=Shift_JIS";
    } elsif (ord "漢"  == 0x1b) {
        $jcode = "jis";
        #$JCODE2  = "ISO-2022-JP";
        #$CHARSET = "; charset=ISO-2022-JP";
    }


#/*------------- 基本情報の設定 ---------------------------------------------*/

$SIG{'PIPE'} = $SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = "sigexit";

$Version  = 'Web Store/1.12';
$DataFile = $DataDir . $DataName;
$FlagFile = $DataFile. '.flg';
$EnvFile  = $DataDir . $EnvName;


Error('100 ファイル未検出','サーバー環境設定ファイルが存在しません。','セットアップ（サーバー環境設定）が完了していません。セットアップは、admin.cgiを実行して行ってください。') if (!-s $EnvFile);

%E = ReadEnvFile($EnvFile);

$licensee   = $E{'Licensee'} ? $E{'Licensee'} : '未登録';
$registCode = $E{'License'}  ? $E{'License'} : 'TRIAL';

Error('100 ファイル未検出','設定ファイルが存在しません。') if (!-e $SetupFile);
open(FILE, $SetupFile) || Error('101 ファイル読込エラー','設定ファイルの読み込みができません。');
while (<FILE>) {
	if ($hereDocument) {
		if (/^\|$hereDocument\|/) {
			undef $hereDocument;
		} else {
			$S{$Key} .= $_;
		}
		next;
	}
	next if (/^#/ || /^\s*$/);
	s/\r|\n//;
	($Key,$Value) = split(/=/, $_, 2);
	$Key =~ s/\s|\t//g;
	if ($Key =~ /\./) {
		@Key = split /\./, $Key;
		if ($Key[0] ne '*' && $Script !~ /$Key[0]/) {
			undef @Key;
			next;
		} else {
			$Key = $Key[1];
			undef @Key;
		}
	}
	if ($Value =~ /^\s*"(.*)"\s*$/ || $Value =~ /^\s*'(.*)'\s*$/) {
		$Value = $1;
		$Value =~ s/\\\"/"/g;
		$Value =~ s/\\\'/'/g;
	} elsif ($Value =~ /\|(.+)\|/) {
		$hereDocument = $1;
		next;
	} else {
		$Value =~ s/\s|\t//g;
	}
	if ($Key =~ /\+$/) {
		$S{$Key} .= "\t$Value";
	} else {
		$S{$Key}  = $Value;
	}
}
close(FILE);

$ktotal = $S{'TaxIncluded'} ? '税　別　計' : '小　　　計';


###############################################################################

sub debug;

$HTTP_USER_AGENT = substr($ENV{'HTTP_USER_AGENT'}, 0, 150);
$HTTP_USER_AGENT =~ s/&/&amp;/g;
$HTTP_USER_AGENT =~ s/"/&quot;/g;
$HTTP_USER_AGENT =~ s/</&lt;/g;
$HTTP_USER_AGENT =~ s/>/&gt;/g;
$REMOTE_HOST = $ENV{'REMOTE_HOST'};
$REMOTE_ADDR = $ENV{'REMOTE_ADDR'};
if ($REMOTE_HOST eq $REMOTE_ADDR || !$REMOTE_HOST) {
	$REMOTE_HOST = gethostbyaddr(pack('C4',split(/\./, $REMOTE_ADDR)),2) || $REMOTE_ADDR;
	$REMOTE_HOST = $REMOTE_ADDR if (!$REMOTE_HOST);
}

Error('100 ファイル未検出','ジャンル定義ファイルが存在しません。') if (!-e $CategoryFile);
open(FILE, "$CategoryFile") || Error('101 ファイル読込エラー','ジャンル定義ファイルの読み込みができません。');
while (<FILE>) {
	next if (/^#/ || /^$/);
	chomp;
	push(@Category, $_);
}
close(FILE);

@DATE = gmtime(time + 3600 * $S{'TimeZone'});
%OrderTime = stdio::GetCookie("$S{'CookieName'}.T");
$date = (!$OrderTime{'Time'} || time - $OrderTime{'Time'} < 3600) ? sprintf("%d%02d%02d",$DATE[5]+1900,$DATE[4]+1,$DATE[3]) : $OrderTime{'Date'};

acceptOrder() if ($ENV{'QUERY_STRING'} eq 'order');

%STDIN = decodeQueryString($jcode);

#/*------------- 処理別による条件分岐 ---------------------------------------*/

if ($STDIN{'mode'} eq 'kago' || $STDIN{'mode'} eq 'cancel' || $STDIN{'mode'} eq 'clear'){
	InputCookie();}

elsif ($STDIN{'mode'} eq 'basket'){
	SeeBasket();}

elsif ($STDIN{'mode'} eq 'law'){
	OutputList_based_SellsLaw();}

elsif ($STDIN{'mode'} eq 'mitumori'){
	OutputMitumorisho();}

elsif ($STDIN{'mode'} eq 'frame'){
	OutputFrame();}

elsif ($STDIN{'mode'} eq 'オーダーする'){
	outputOrderForm();}


$STDIN{'start'} = 1 if (!$STDIN{'start'});

#/*--- 商品ファイルの読み込み	---*/
if ($STDIN{'Category'} eq ""){
	@Record = stdio::ReadFile($DataFile, $STDIN{'start'}-1, $S{'PageMax'}, $E{'UseLock'}, 0, 1);}
else{
	@Record = stdio::ReadFile($DataFile, undef, undef, $E{'UseLock'});}
Error('110 排他制御中','只今混雑しています。時間をおいて再試行してください。') if ($Record[0] == -2);

#/*--- 検索とジャンルの絞り込み		---*/
if ($STDIN{'Category'} || $STDIN{'mode'} eq 'search') {
	shift @Record;
	if ($STDIN{'Category'}) {
		foreach (@Record) {
			%Field = stdio::ReadData(split /\t/);
			push(@newRecord, $_) if ($Field{'Category'} eq $STDIN{'Category'});
			%Field = ();
		}
		@Record = @newRecord;
		undef @newRecord;
	}
	if ($STDIN{'mode'} eq 'search'){
		KeywordSearch();
		$QueryString = "&amp;mode=search&amp;frame=$STDIN{'frame'}&amp;Category=$STDIN{'Category'}&amp;keyword=$keyword&amp;mhmode=$STDIN{'mhmode'}&amp;Price=$STDIN{'Price'}";
		$searchResult= "<p align=center><b>$STDIN{'keyword'}</b>で検索の結果、<b>" . sprintf("%d",$#Record+1) . "</b>件がデータベースに存在しました。</p>" if (@Record);
	} else {
		$QueryString = "&amp;frame=$STDIN{'frame'}&amp;Category=$STDIN{'Category'}";
	}
	$FileHead{'Lines'} = $#Record + 1;
	@Record = splice(@Record, $STDIN{'start'}-1, $S{'PageMax'});
} else {
	$QueryString = "&amp;frame=on" if ($STDIN{'frame'});
	%FileHead = stdio::ReadData(split /\t/, shift(@Record));
	$FileHead{'Lines'} --;
}

#/*--- スキンファイル読込		---*/
Error('100 ファイル未検出','商品データ表示スキンファイル1が存在しません。') if (!-e $GoodsTemplate1);
open(FILE, $GoodsTemplate1) || Error('101 ファイル読込エラー','商品データ表示スキンファイル1の読み込みができません。');
$Template1 = join "", <FILE>;
close(FILE);

if (-e $GoodsTemplate2) {
	open(FILE, $GoodsTemplate2) || Error('101 ファイル読込エラー','商品データ表示スキンファイル2の読み込みができません。');
	$Template2 = join "", <FILE>;
	close(FILE);
}

foreach (@Category) {
	($eCategory,$jCategory) = split /,/;
	$Category{$eCategory} = $jCategory;
}

#/*--- ジャンル選択フォームセット	---*/
$Category = qq|<select name=Category>\n|
	  . qq|  <option value=0>全てのジャンル|;
foreach (@Category) {
	($eCategory,$jCategory) = split /,/;
	if ($STDIN{'Category'} eq $eCategory) {
		$Category .= qq|  <option value=$eCategory selected>$jCategory\n|;
		$nowCategory = $jCategory;
	} else {
		$Category .= qq|  <option value=$eCategory>$jCategory\n|;
	}
}
$Category .= qq|</select>|;
$nowCategory = '全てのジャンル' if ($nowCategory eq "");

$targetFrame = 'target=footer' if ($STDIN{'frame'});

#/*--- 商品案内ページ表示開始		---*/
Error('100 ファイル未検出','商品ページ表示スキンファイルの読み込みができません。') if (!-e $GoodsPage);
open(FILE, $GoodsPage) || Error('101 ファイル読込エラー','商品ページ表示スキンファイルの読み込みができません。');
print "Content-type: text/html\n\n";
while (<FILE>) {
	if (/%\{Goods\}/ && !$noPrint) {
		if ($Record[0]) {
			foreach (@Record) {
				%Field = stdio::ReadData(split /\t/);
				if ($Field{'Stock'} ne "" && $Field{'Stock'} == 0) {
					%Field = ();
					next;
				} elsif ($Field{'Stock'} ne "" && $Field{'Stock'} < 10) {
					$Field{'Option'} .= '<b>在庫僅少</b>';	
				}
				if ($j == 1  && $Template2) {
					$printData = $Template2;
					$j = 0;
				} else {
					$printData = $Template1;
					$j = 1;
				}
				$Field{'Comment'}= '　' if ($Field{'Comment'} eq "");
				$Field{'Image'}  = qq|<img src="$Field{'Image'}" border=0>| if ($Field{'Image'} ne "");
				$Field{'Name'}   = qq|<a href="$Field{'Url'}">$Field{'Name'}</a>| if ($Field{'Url'} ne "");
				if ($Field{'Expires'} ne "" && $Field{'Price2'} ne "" && $Field{'Expires'} - $date >= 0) {
					$Field{'Price'}  = $Field{'Price2'};
					$Field{'Expires'}= ($Field{'Expires'} =~ /(\d{4})(\d{2})(\d{2})/) ? "$1\/$2\/$3" : undef;
					$Field{'Option'} .= ' ' . $Field{'Expires'} . 'まで特別価格';
				}
				$Field{'Option'}  = '　' if ($Field{'Option'} eq "");
				$printData =~ s/%\{Code\}/sprintf("%04d",$Field{'Code'})/eg;
				$printData =~ s/%\{Name\}/$Field{'Name'}/g;
				$printData =~ s/%\{Price\}/setComma($Field{'Price'})/eg;
				$printData =~ s/%\{Tax\}/setComma(setTax($Field{'Price'},$S{'TaxRate'}))/eg;
				$printData =~ s/%\{PriceTax\}/setComma($Field{'Price'}-setTax($Field{'Price'},$S{'TaxRate'}))/eg if ($S{'TaxIncluded'});
				$printData =~ s/%\{Comment\}/$Field{'Comment'}/g;
				$printData =~ s/%\{Image\}/$Field{'Image'}/g;
				$printData =~ s/%\{Option\}/$Field{'Option'}/g;
				if ($Field{'InputType'} eq 'select') {
					$inputType = qq|<select name=$Field{'Code'}>\n|;
					foreach (0 .. 20) {
						$inputType .= qq|  <option>$_\n|;
					}
					$inputType .= qq|</select>個|;
				} elsif ($Field{'InputType'} eq 'checkbox') {
					$inputType = qq|<input type=checkbox name=$Field{'Code'} value=1>購入|;
				} else {
					$inputType = qq|<input name=$Field{'Code'} size=2 maxlength=2 value=0>個|;
				}
				if ($Field{'Plus1'}) {
					@Plus1 = split /</, $Field{'Plus1'};
					$Plus1 =  qq|<select name="$Field{'Code'}.1">\n|
						. qq|  <option value=noselect>$Plus1[0]\n|;
					foreach (1 .. $#Plus1) {
						@fieldPlus1 = split />/, $Plus1[$_];
						$Plus1 .= qq|  <option value=$fieldPlus1[0]>$fieldPlus1[1]\n|;
					}
					$Plus1 .= qq|</select>|;
					@Plus3 = @fieldPlus1 = ();
				} else {
					$Plus1 = '　';
				}
				if ($Field{'Plus2'}) {
					@Plus2 = split /</, $Field{'Plus2'};
					$Plus2 =  qq|<select name="$Field{'Code'}.2">\n|
						. qq|  <option value=noselect>$Plus2[0]\n|;
					foreach (1 .. $#Plus2) {
						@fieldPlus2 = split />/, $Plus2[$_];
						$Plus2 .= qq|  <option value=$fieldPlus2[0]>$fieldPlus2[1]\n|;
					}
					$Plus2 .= qq|</select>|;
					@Plus3 = @fieldPlus2 = ();
				} else {
					$Plus2 = '　';
				}
				if ($Field{'Plus3'}) {
					@Plus3 = split /</, $Field{'Plus3'};
					$Plus3 =  qq|<select name="$Field{'Code'}.3">\n|
						. qq|  <option value=noselect>$Plus3[0]\n|;
					foreach (1 .. $#Plus3) {
						@fieldPlus3 = split />/, $Plus3[$_];
						$Plus3 .= qq|  <option value=$fieldPlus3[0]>$fieldPlus3[1]\n|;
					}
					$Plus3 .= qq|</select>|;
					@Plus3 = @fieldPlus3 = ();
				} else {
					$Plus3 = '　';
				}
				$printData =~ s/%\{Plus1\}/$Plus1/g;
				$printData =~ s/%\{Plus2\}/$Plus2/g;
				$printData =~ s/%\{Plus3\}/$Plus3/g;
				$printData =~ s/%\{InputType\}/$inputType/g;
				$printData =~ s/%\{Stock\}/$Field{'Stock'}/g;
				$printData =~ s/%\{.*\}//g;
				print $printData;
				$Plus1 = $Plus2 = $Plus3 = "";
				%Field = ();
			}
		} else {
			print qq|<h3 align=center>商品データが存在しません</h3>\n|;
		}
	} elsif (/%\{Navi\}/ && $Record[0]) {

		#/*--- 1ページ目の場合		---*/
		if (!$STDIN{'start'} || $STDIN{'start'} <= 1) {
			$STDIN{'start'} = 1;
			if ($S{'PageMax'} >= $FileHead{'Lines'}) {
				$pageEnd   = $FileHead{'Lines'};
			} else {
				$nextStart = $STDIN{'start'} + $S{'PageMax'};
				$pageEnd   = $STDIN{'start'} + $S{'PageMax'} - 1;
				$nextLink  = qq|<a href="$Script?start=$nextStart$QueryString">|;
				$nextLinkd = qq|</a>|;
			}

		#/*--- 2ページ目以降の場合	---*/
		} else {
			$backStart = $STDIN{'start'} - $S{'PageMax'};
			$backStart = 1 if ($backStart < 1);
			$backLink  = qq|<a href="$Script?start=$backStart$QueryString">|;
			$backLinkd = qq|</a>|;
			if ($STDIN{'start'} + $S{'PageMax'} > $FileHead{'Lines'}) {
				$pageEnd   = $FileHead{'Lines'};
			} else {
				$nextStart = $STDIN{'start'} + $S{'PageMax'};
				$pageEnd   = $STDIN{'start'} + $S{'PageMax'} - 1;
				$nextLink  = qq|<a href="$Script?start=$nextStart$QueryString">|;
				$nextLinkd = qq|</a>|;
			}
		}
		$allPages  = int($FileHead{'Lines'} / $S{'PageMax'});
		$allPages ++ if ($FileHead{'Lines'} % $S{'PageMax'} != 0);
		$nowPage   = int(($STDIN{'start'}-1)/$S{'PageMax'}) + 1;

		print "<p align=center>";
		print " $backLink" . "Prev$backLinkd ";
		print qq| [ <a href="$Script?start=1$QueryString">1</a>/ ] |;
		if ($allPages <= 10) {
			for ($i=1; $i<=$allPages; $i++) {
				if ($i == $nowPage) {
					print  qq| <b>$i</b> |;
				} else {
					printf(qq| <a href="$Script?start=%d$QueryString">$i</a> |,($i-1)*$S{'PageMax'}+1);
				}
			}
		} elsif ($nowPage <= 5) {
			for ($i=1; $i<10; $i++) {
				if ($i == $nowPage) {
					print  qq| <b>$i</b> |;
				} else {
					printf(qq| <a href="$Script?start=%d$QueryString">$i</a> |,($i-1)*$S{'PageMax'}+1);
				}
			}
		} elsif ($allPages - $nowPage <= 4) {
			for ($i=$allPages-8; $i<=$allPages; $i++) {
				if ($i == $nowPage) {
					print  qq| <b>$i</b> |;
				} else {
					printf(qq| <a href="$Script?start=%d$QueryString">$i</a> |,($i-1)*$S{'PageMax'}+1);
				}
			}
		} else {
			for ($i=$nowPage-4; $i<=$nowPage+4; $i++) {
				if ($i == $nowPage) {
					print  qq| <b>$i</b> |;
				} else {
					printf(qq| <a href="$Script?start=%d$QueryString">$i</a> |,($i-1)*$S{'PageMax'}+1);
				}
			}
		}
		printf(qq| [ /<a href="$Script?start=%d$QueryString">$allPages</a> ] |,($allPages-1)*$S{'PageMax'}+1);
		print " $nextLink" . "Next$nextLinkd ";
		print "</p>\n";

	} else {
		if (/%\{NoPrint\}/ && !$Record[0]) {
			$noPrint = 1;
			print qq|<hr noshade>\n|;
			print qq|<h3 align=center>該当する商品は登録されていません</h3>\n|;
		} elsif (/%\{\/NoPrint\}/) {
			$noPrint = 0;
		} elsif ($noPrint){
			next;}

		s/%\{Target\}/$targetFrame/g;
		s/%\{Frame\}/$STDIN{'frame'}/g;
		s/%\{FrameMode\}/&amp;frame=$STDIN{'frame'}/g;
		s/%\{Script\}/$Script/g;
		s/%\{Title\}/$S{'Title'}/g;
		s/%\{Body\}/$S{'Body'}/g;
		s/%\{Start\}/$STDIN{'start'}/g;
		s/%\{Stop\}/$pageEnd/g;
		s/%\{Max\}/$FileHead{'Lines'}/g;
		s/%\{SearchResult\}/$searchResult/g;
		s/%\{Category\}/$nowCategory/g;
		s/%\{CategorySelect\}/$Category/g;
		s/%\{Time\((.+)\)\}/stdio::SetTime($1,$S{'TimeZone'})/eg;
		s/%\{.*\}//g;
		print;
	}
}
close(FILE);
exit(0);

#/*------------- キーワード検索 ---------------------------------------------*/

sub KeywordSearch {
	Error('フォーム入力ミス','検索用キーワードを入力、もしくは価格帯を選択してください。') if ($STDIN{'keyword'} eq "" && !$STDIN{'Price'});
	if ($STDIN{'Price'}) {
		foreach (@Record) {
			%Field = stdio::ReadData(split /\t/);
			push(@newRecord, $_)if ($Field{'Price'} <= $STDIN{'Price'});
			%Field = ();
		}
		@Record = @newRecord;
		undef @newRecord;
	}
	if ($STDIN{'keyword'} ne "") {
		$STDIN{'keyword'} =~ s/&amp;/&/g;
		@Record = stdio::SearchRecord($STDIN{'keyword'},$STDIN{'mhmode'},0,@Record);
		$STDIN{'keyword'} =~ s/&/&amp;/g;
		$keyword = $STDIN{'keyword'};
		$keyword =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
	}
	return;
}

#/*------------- 訪問販売法に基づく表示 -------------------------------------*/

sub OutputList_based_SellsLaw {
	Error('100 ファイル未検出','訪販法に基づく表記記述ファイルが存在しません。') if (!-e $HomonFile);
	open(FILE, $HomonFile) || Error('101 ファイル読込エラー','訪販法に基づく表記記述ファイルの読み込みができません。');
	$Print = join "", <FILE>;
	close(FILE);

	
	$Print = '<big>' . $Print . '</big>' if ($ENV{'HTTP_USER_AGENT'} =~ /MSIE/);
	print "Content-type: text/html\n\n";
	print <<_EOF_;

<html>
<head>
<title>$S{'Title'} [特定商取引に関する法律に基づく表\記]</title>
$S{'StyleSheet'}</head>
<body $S{'Body'}>
<div align=center>
<table border=0 cellspacing=1 width=500 bgcolor=000080>
  <tr>
    <td width=100%><table border=0 width=100% cellpadding=5>
      <tr>
        <td width=100% bgcolor=FFFFDD checked=false align=center><b><font size=4 color=000080>特定商取引に関する法律に基づく表\記</font></b></td>
      </tr>
      <tr>
        <td width=100% bgcolor=FFFFFF><font size="2"><pre>$Print</pre></font></td>
      </tr>
    </table>
    </td>
  </tr>
</table>
</div>
<p align=center><input type=button value=" もとに戻る " onClick="history.back()"></p>
<hr noshade>
</body>
</html>

_EOF_
	exit(0);
}

#/*------------- 注文受付 ---------------------------------------------------*/

sub acceptOrder {
	$OutFrameBorder = 2;		# ○ 外枠の太さ
	$InFrameBorder  = 1;		# ○ 内枠の太さ
	$CellPadding    = 5;		# ○ セル内の余白
	$NameBgcolor  = '#FFFFD9';	# ○ 項目名の背景色
	$ValueBgcolor = '#FFFFFF';	# ○ 項目の背景色


	if ($ENV{'REQUEST_METHOD'} eq 'POST') {
		read(STDIN, $QUERY_DATA, $ENV{'CONTENT_LENGTH'});
	}

	if ($S{'ScriptUrl'} && $ENV{'HTTP_REFERER'} !~ /$S{'ScriptUrl'}/i){
		Error('204 参照元エラー','外部からの投稿はできません。');}

	elsif ($method eq 'POST' && $ENV{'REQUEST_METHOD'} ne 'POST'){
		Error('203 メソッドエラー','不正利用の可能性があります。');}

	%Field = readGoodsFile($DataFile);
	@Goods = getOrderdata_from_cookie($S{'CookieName'});

	$i = 0;

	#/*--- フォームデータ処理 (前)		---*/
	foreach (split /&/, $QUERY_DATA) {
		($Name, $Value) = split /=/;
		$Name  =~ s/\t//g;
		$Value =~ s/\t//g;
		$Name  =~ tr/+/ /;
		$Value =~ tr/+/ /;
		$Name  =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
		$Value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
		if ($jcode) {
			if ($h2z) {
				if ($jcode eq 'sjis')   { jcode::h2z_sjis(*Value); }
				elsif ($jcode eq 'jis') { jcode::h2z_jis(*Value); }
				elsif ($jcode eq 'euc') { jcode::h2z_euc(*Value); }
			}
			jcode::convert(*Value,$jcode);
			jcode::convert(*Name,$jcode);
		}
		$Value =~ s/\r\n/\n/g;
		$Value =~ s/\r/\n/g;
		$Value =~ s/[\n|\s]*$//g;
		$hidden .= qq|  <input type=hidden name="$Name" value="$Value">\n| if ($Name ne '_submit');

		if ($Name eq '_indispen') {
			$Indispen{$Value} = 1;

		} elsif ($Name eq '_hidden') {
			$Hidden{$Value} = 1;

		} elsif ($Name eq '_submit') {
			$Submit	= $Value;

		} else {
			if ($Name eq '_pref') {
				$pref = $Value;
				$Name = '都道府県';

			} elsif ($Name eq '_pref2') {
				$pref2 = $Value;
				$Name = '発送先都道府県';
			}

			$name = $Value if ($Name eq '_name');
			$from = $Value if ($Name eq '_from');
			$STDIN[$i] = $Name . "\t" . $Value;
			$i ++;
		}
	}

	#/*--- 標準エラーチェック		---*/
	if ($corbonCopy) {
		if (!$from) {
			$ErrorMessage .= qq|<li>メールアドレスを入力してください。\n|;
		} elsif ($from !~ /^[\w\+\-\.]+@[\w\+\-]+\.[\w\+\.\-]+$/ && $corbonCopy) {
			$ErrorMessage .= qq|<li>メールアドレスの形式が間違っています。\n|;
		}
	}

	#/*--- フォームデータ処理 (後)		---*/
	for ($i = 0; $i <= $#STDIN; $i ++) {
		($Name,$Value) = split "\t", $STDIN[$i];

		#/*--- エラーチェック		---*/
		if ($Name eq '_from' && $Value && $Value !~ /^[\w\+\-\.]+@[\w\+\-]+\.[\w\+\.\-]+$/) {
			$ErrorMessage .= qq|<li>メールアドレスの形式が間違っています。\n|;
		}

		if ($Indispen{$Name} && $Value eq "") {
			$Name = '名前' if ($Name eq '_name');
			$Name = 'メールアドレス' if ($Name eq '_from');
			$Name = 'お支払い方法' if ($Name eq '_payment');
			$ErrorMessage .= qq|<li>$Nameを入力して下さい。\n|;
		}
		$HiddenField = 1 if ($Hidden{$Name});
		if ($Name eq '_payment') { $payment = $Value; }

		#/*--- 確認ページのHTMLを構成		---*/
		if (!$Submit && !$ErrorMessage) {
			$Name  =~ s/&/&amp;/g;
			$Value =~ s/&/&amp;/g;
			$Name  =~ s/"/&quot;/g;
			$Value =~ s/"/&quot;/g;
			$Name  =~ s/</&lt;/g;
			$Value =~ s/</&lt;/g;
			$Name  =~ s/>/&gt;/g;
			$Value =~ s/>/&gt;/g;
			$Value =~ s/\n/<br>/g;
			$Value2 = $Value;
			$Value2 = '(未入力)' if ($Value2 eq "");
			

			$confirm .= qq|            <tr>\n|
				  . qq|              <td width=20% bgcolor=$NameBgcolor nowrap><b>メールアドレス</b></td>\n|
				  . qq|              <td width=80% bgcolor=$ValueBgcolor>$Value2</td>\n|
				  . qq|            </tr>\n|
				  	if ($Name eq '_from' && !$HiddenField);

			$confirm .= qq|            <tr>\n|
				  . qq|              <td width=20% bgcolor=$NameBgcolor nowrap><b>名前</b></td>\n|
				  . qq|              <td width=80% bgcolor=$ValueBgcolor>$Value2</td>\n|
				  . qq|            </tr>\n|
					if ($Name eq '_name' && !$HiddenField);

			$confirm .= qq|            <tr>\n|
				  . qq|              <td width=20% bgcolor=$NameBgcolor nowrap><b>お支払い方法</b></td>\n|
				  . qq|              <td width=80% bgcolor=$ValueBgcolor>$Value2</td>\n|
				  . qq|            </tr>\n|
					if ($Name eq '_payment' && !$HiddenField);

			if ($Value2 =~ /<br>/i && $pre) {
				$Value2 =~ s/<br>/\n/g;
				$Value2 = '<pre>' . $Value . '</pre>';
				$Value2 = '<big>' . $Value . '</big>' if ($ENV{'HTTP_USER_AGENT'} =~ /MSIE/);
			}

			$confirm .= qq|            <tr>\n|
				  . qq|              <td width=20% bgcolor=$NameBgcolor><b>$Name</b></td>\n|
				  . qq|              <td width=80% bgcolor=$ValueBgcolor>$Value2</td>\n|
				  . qq|            </tr>\n|
					if (!$HiddenField && $Name !~ /^_/);

			$Value =~ s/<br>/\n/g;
			$HiddenField = 0;

		#/*--- メール出力形式の構成		---*/
		} elsif (!$ErrorMessage) {

			$Value = '(未入力)' if ($Value eq "");

			$msg  .= "[$Name]\n"
			      .  "$Value\n\n"
				if ($Name !~ /^_/);

			$msg .=   "[名前]\n"
				. "$Value\n\n" if ($Name eq '_name');

			$msg .=   "[メールアドレス]\n"
				. "$Value\n\n" if ($Name eq '_from');
			
			$msg .=   "[お支払い方法]\n"
				. "$Value\n\n" if ($Name eq '_payment');
		}
	}

	#/*--- 送信内容に不備がある場合		---*/
	if ($ErrorMessage) {
		&Error('フォーム入力ミス','フォームの入力内容に不備があります。',
			  qq|　フォームの入力内容に入力漏れ、指定文字数超過等の不備があったため、投稿処理は一旦中断されました。検出された該当箇所をもう一度ご確認の上、再試行してみて下さい。繰り返し、エラーメッセージが表\示される場合は、このサイトの管理者に連絡して下さい。\n|
			. qq|<ul><b>\n|
			. qq|$ErrorMessage|
			. qq|</b></ul>\n|
		);
	}
	if ($from !~ /^[\w\+\-\.]+@[\w\+\-]+\.[\w\+\.\-]+$/) {
		$from = 'Do not reply. <anonymous@on.the.net>';
	} else {
		$corbon = $from;
	}
	$from = $S{'MasterEmail'} if ($from !~ /^[\w\+-]+@[\w\+-]+\.[\w\+-\.]+$/);
	undef($BccTo) if ($BccTo !~ /([\w\+-]+@[\w\+-]+\.[\w\+-\.\,]+)+/);

	$pref = $pref2 if ($pref2);
	Error('100 ファイル未検出','送料定義ファイルが存在しません。') if (!-e $SendCostFile);
	open(FILE, $SendCostFile) || Error('101 ファイル読込エラー','送料定義ファイルの読み込みができません。');
	while (<FILE>) {
		next if (/^#/ || /^$/);
		chomp;
		($Pref,$SendCost) = split /,/;
		if ($pref eq $Pref) {
			$find = 1;
			last;
		}
	}
	close(FILE);
	Error('120 レコード未検出','指定された地域のレコードは存在しません。') if (!$find);
	Error('120 レコード未検出','オーダーは完了しています。もしくは、カゴの中身がありません。') if (!$Goods[0]);

	#/*--- 送信内容確認ページ		---*/
	if (!$Submit) {
		print "Content-type: text/html\n\n";
		print <<_EOF_;

<html>
<head>
<title>$S{'Title'} [ご注文内容確認]</title>
$S{'StyleSheet'}</head>
<body $S{'Body'}>
$S{'Header2'}
<font size=5 color=#000080>ご注文内容の確認</font>
<hr noshade>
<small>送料が計算されましたのでご確認ください。</small><br>
　
<table border=0 cellpadding=4 cellspacing=1>
  <tr>
    <td bgcolor=$S{'bgColorListMain'} align=center nowrap><font color=$S{'ftColorListMain'}>コード</font></td>
    <td bgcolor=$S{'bgColorListMain'} align=center nowrap><font color=$S{'ftColorListMain'}>商品名</font></td>
    <td bgcolor=$S{'bgColorListMain'} align=center nowrap><font color=$S{'ftColorListMain'}>内容</font></td>
    <td bgcolor=$S{'bgColorListMain'} align=center nowrap><font color=$S{'ftColorListMain'}>単価 (円)</font></td>
    <td bgcolor=$S{'bgColorListMain'} align=center nowrap><font color=$S{'ftColorListMain'}>数量</font></td>    
    <td bgcolor=$S{'bgColorListMain'} align=center nowrap><font color=$S{'ftColorListMain'}>金額 (円)</font></td>
  </tr>
_EOF_

		foreach (@Goods) {
			local(@Record) = split /:/;
			$bgColor = $bgColor eq $S{'bgcolorListA'} ? $S{'bgcolorListB'} : $S{'bgcolorListA'};
			print  qq|  <tr>\n|;
			printf(qq|    <td align=center bgcolor=$bgColor>%04d</td>\n|,$Record[0]);
			print  qq|    <td bgcolor=$bgColor>$Field{$Record[0]}{'Name'}</td>\n|;
			if ($Field{$Record[0]}{'Stock'} ne "" && $Field{$Record[0]}{'Stock'} - $Record[1] < 0) {
				print qq|      <td align=center bgcolor=$bgColor colspan=6>申\し訳ございませんが只今品切れいたしました</td>\n|;
				print qq|    </tr>\n|;
				next;
			} elsif ($Field{$Record[0]}{'SendCost'} ne "") {
				$SendCost += $Field{$Record[0]}{'SendCost'};
			}

			print qq|    <td bgcolor=$bgColor><small>　\n|;
			$i = 0;
			if ($Field{$Record[0]}{'Plus1'} && $Record[2]) {
				foreach (split /</, $Field{$Record[0]}{'Plus1'}) {
					if (!$i) {
						$Field[0] = $_;
						$i ++;
						next;
					}
					($Field[1],$Field[2],$Field[3]) = split />/;
					last if ($Record[2] eq $Field[1]);
					$i ++;
				}
				print qq|($Field[0]) $Field[2]　|;
				$PriceTest += $Field[3];
				$i = 0;
				@Field = ();
			}
			if ($Field{$Record[0]}{'Plus2'} && $Record[3]) {
				foreach (split /</, $Field{$Record[0]}{'Plus2'}) {
					if (!$i) {
						$Field[0] = $_;
						$i ++;
						next;
					}
					($Field[1],$Field[2],$Field[3]) = split />/;
					last if ($Record[3] eq $Field[1]);
					$i ++;
				}
				print qq|($Field[0]) $Field[2]　|;
				$PriceTest += $Field[3];
				$i = 0;
				@Field = ();
			}
			if ($Field{$Record[0]}{'Plus3'} && $Record[4]) {
				foreach (split /</, $Field{$Record[0]}{'Plus3'}) {
					if (!$i) {
						$Field[0] = $_;
						$i ++;
						next;
					}
					($Field[1],$Field[2],$Field[3]) = split />/;
					last if ($Record[4] eq $Field[1]);
					$i ++;
				}
				print qq|($Field[0]) $Field[2]　|;
				$PriceTest += $Field[3];
				$i = 0;
				@Field = ();
			}

			print qq|</small></td>\n|;
			if ($Field{$Record[0]}{'Expires'} ne "" && $Field{$Record[0]}{'Expires'} - $date >= 0) {
				$Field{$Record[0]}{'Price2'} += $PriceTest ? $PriceTest : 0;
				$Field{$Record[0]}{'Price'}   = $Field{$Record[0]}{'Price2'};
			} else {
				$Field{$Record[0]}{'Price'} += $PriceTest ? $PriceTest : 0;
			}
			print qq|      <td align=right bgcolor=$bgColor>| . setComma($Field{$Record[0]}{'Price'}) . qq|</td>\n|;
			$zbetuSum       = $Field{$Record[0]}{'Price'} * $Record[1];	# 注文品別税別計
			$totalZbetuSum += $zbetuSum;					# 注文品別税別合計
			print qq|    <td align=right bgcolor=$bgColor>$Record[1]</td>\n|;
			print qq|    <td align=right bgcolor=$bgColor>| . setComma($zbetuSum) . qq|</td>\n|;
			print qq|  </tr>\n|;
			undef $PriceTest;
		}
		
		if ($S{'Service'} && $S{'Service'} <= $totalZbetuSum) {
			$SendCost = 0;
		}
		$tax = setTax($totalZbetuSum, $S{'TaxRate'});
		$totalZkomiSum = $totalZbetuSum;
		if ($S{'TaxIncluded'}) {
			$totalZbetuSum -= $tax;
		} else {
			$totalZkomiSum += $tax;
		}
		$tax = setComma($tax);
		
		if ($S{'Payment'}) {
			foreach (split /,/, $S{'Payment'}) {
				my($key, $val) = split /=/;
				if ($payment eq $key) {
					$totalZkomiSum += $val;
					$daihiki = <<_EOF_;
  <tr>
    <td colspan=5 bgcolor=$S{'bgcolorTotal'} align=center>$key手数料</td>
    <td bgcolor=$S{'bgcolorTotal'} align=right>$val</td>
  </tr>
_EOF_
					last;
				}
			}
		}
		$total = $totalZkomiSum + $SendCost;
		
		$totalZkomiSum = setComma($totalZkomiSum);
		$totalZbetuSum = setComma($totalZbetuSum);
		$SendCost      = setComma($SendCost);
		$total         = setComma($total);

		print <<_EOF_;
  <tr>
    <td colspan=6><hr noshade size=3><td>
  </tr>
  <tr>
    <td colspan=5 bgcolor=$S{'bgcolorTotal2'} align=center>$ktotal</td>
    <td bgcolor=$S{'bgcolorTotal2'} align=right>$totalZbetuSum</td>
  </tr>
  <tr>
    <td colspan=5 bgcolor=$S{'bgcolorTotal2'} align=center>消　費　税</td>
    <td bgcolor=$S{'bgcolorTotal2'} align=right>$tax</td>
  </tr>
  <tr>
    <td colspan=5 bgcolor=$S{'bgcolorTotal'} align=center>送　　　料</td>
    <td bgcolor=$S{'bgcolorTotal'} align=right>$SendCost</td>
  </tr>
  $daihiki<tr>
    <td colspan=5 bgcolor=$S{'bgcolorTotal'} align=center>合　　　計</td>
    <td bgcolor=$S{'bgcolorTotal'} align=right><b>$total</b></td>
  </tr>
</table>
<p>　</p>
<font size=5 color=#000080>ご送信内容の確認</font>
<hr noshade>
<form action="$Script?order" method=POST>
  <input type=hidden name=_submit value=1>
$hidden
  <table border=0 width=80%>
    <tr>
      <td align=center><table border=0 cellpadding=$OutFrameBorder cellspacing=0 width=100%>
        <tr>
          <td bgcolor=000000><table border=0 cellpadding=$CellPadding cellspacing=$InFrameBorder width=100%>
          $confirm
          </table></td>
        </tr>
      </table>
      <p><center><input type=submit value="　○ 送信 　"><input type=button value="　× 戻る 　" onClick="javascript:history.back(1)"></center></p>
      <p>送信内容をご確認の上、よろしければ送信をクリックして下さい。<br>時間帯によっては反応が遅い場合がありますが、一度だけクリックしてください。</p></td>
    </tr>
  </table>
</form>
<hr noshade>
$S{'Footer2'}

_EOF_

		exit(0);
	}

	#/*--- オーダー処理の場合	---*/
	srand(time ^ ($$ + ($$ << 15)) || time);
	@otime = gmtime(time+$S{'TimeZone'}*3600);
	$orderCode = sprintf("%04d%02d%02d%02d%02d%02d", $otime[5]+1900,$otime[4]+1,$otime[3],$otime[2],$otime[1],$otime[0]) . int(rand(10));
	$timeNow   = stdio::SetTime($S{'TimeFormat'},$S{'TimeZone'});
	$dateNow   = gmtime(time + 3600 * $S{'TimeZone'});
	$order = <<_EOF_;

ご注文日時 : $timeNow
ご注文番号 : $orderCode

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ ご注文内容
───────────────────────────────────

_EOF_

	#/*--- 受注メール構成開始	---*/
	foreach (@Goods) {
		local(@Record) = split /:/;
		$Buy{$Record[0]} = $Record[1];
		$bgColor = $bgColor eq $S{'bgcolorListA'} ? $S{'bgcolorListB'} : $S{'bgcolorListA'};
		$order .= sprintf("[%04d]",$Record[0]);
		$order .= " $Field{$Record[0]}{'Name'}";

		if ($Field{$Record[0]}{'Stock'} ne "" && $Field{$Record[0]}{'Stock'} - $Record[1] < 0) {
			Error('',"申\し訳ございませんが、$Field{$Record[0]}{'Name'}は只今品切れいたしました。");
		} elsif ($Field{$Record[0]}{'SendCost'} ne "") {
			$SendCost += $Field{$Record[0]}{'SendCost'};
		}

		$i = 0;
		if ($Field{$Record[0]}{'Plus1'} && $Record[2]) {
			foreach (split /</, $Field{$Record[0]}{'Plus1'}) {
				if (!$i) {
					$Field[0] = $_;
					$i ++;
					next;
				}
				($Field[1],$Field[2],$Field[3]) = split />/;
				last if ($Record[2] eq $Field[1]);
				$i ++;
			}
			$order .= " ($Field[0])$Field[2]";
			$PriceTest += $Field[3];
			$i = 0;
			@Field = ();
		}
		if ($Field{$Record[0]}{'Plus2'} && $Record[3]) {
			foreach (split /</, $Field{$Record[0]}{'Plus2'}) {
				if (!$i) {
					$Field[0] = $_;
					$i ++;
					next;
				}
				($Field[1],$Field[2],$Field[3]) = split />/;
				last if ($Record[3] eq $Field[1]);
				$i ++;
			}
			$order .= " ($Field[0])$Field[2]";
			$PriceTest += $Field[3];
			$i = 0;
			@Field = ();
		}
		if ($Field{$Record[0]}{'Plus3'} && $Record[4]) {
			foreach (split /</, $Field{$Record[0]}{'Plus3'}) {
				if (!$i) {
					$Field[0] = $_;
					$i ++;
					next;
				}
				($Field[1],$Field[2],$Field[3]) = split />/;
				last if ($Record[4] eq $Field[1]);
				$i ++;
			}
			$order .= " ($Field[0])$Field[2]";
			$PriceTest += $Field[3];
			$i = 0;
			@Field = ();
		}
		$order .= "\n";
		$order .= "   単価 ";
		if ($Field{$Record[0]}{'Expires'} ne "" && $Field{$Record[0]}{'Expires'} - $date >= 0) {
			$Field{$Record[0]}{'Price2'} += $PriceTest ? $PriceTest : 0;
			$Field{$Record[0]}{'Price'}   = $Field{$Record[0]}{'Price2'};
		} else {
			$Field{$Record[0]}{'Price'} += $PriceTest ? $PriceTest : 0;
		}
		$order .= setComma($Field{$Record[0]}{'Price'}) . "円";
		$totalGoods     += $Record[1];
		$zbetuSum       = $Field{$Record[0]}{'Price'} * $Record[1];
		$totalZbetuSum += $zbetuSum;
		$order .= " × " . $Record[1] . " = " . setComma($zbetuSum) . "円\n\n";
		undef $PriceTest;
		undef @Record;
	}
	
	if ($S{'Service'} && $S{'Service'} <= $totalZbetuSum) {
		$SendCost = 0;
	}
	$tax = setTax($totalZbetuSum, $S{'TaxRate'});
	$totalZkomiSum = $totalZbetuSum;
	if ($S{'TaxIncluded'}) {
		$totalZbetuSum -= $tax;
	} else {
		$totalZkomiSum += $tax;
	}
	$tax = setComma($tax);
	$total = $totalZkomiSum + $SendCost;
	$totalZkomiSum = setComma($totalZkomiSum);
	$totalZbetuSum = setComma($totalZbetuSum);
	$SendCost      = setComma($SendCost);
	if ($S{'Payment'}) {
		foreach (split /,/, $S{'Payment'}) {
			my($key, $val) = split /=/;
			if ($payment eq $key) {
				$total += $val;
				$daihiki = "  $key手数料 : $val円";
				last;
			}
		}
	}
	$total         = setComma($total);

	$totalZbetuSum = " " x (7 - length($totalZbetuSum)) . $totalZbetuSum;
	$SendCost      = " " x (7 - length($SendCost)) . $SendCost;
	$total         = " " x (7 - length($total)) . $total;
	$tax           = " " x (7 - length($tax)) . $tax;
	if ($S{'TaxIncluded'}) { $order .= <<_EOF_; } else { $order .= <<_EOF2_; }
───────────────────────────────────
  
  送    料  :  $SendCost円$daihiki
----------------------------------------------------------------------
  合    計  :  $total円
───────────────────────────────────
_EOF_
───────────────────────────────────
 
  送    料  :  $SendCost円$daihiki
----------------------------------------------------------------------
  合    計  :  $total円
───────────────────────────────────
_EOF2_

	$order .= <<_EOF_;

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ お客様の情報
───────────────────────────────────

$msg

───────────────────────────────────
 送信日時     : $dateNow

 サーバー名   : $ENV{'SERVER_NAME'} : $ENV{'SERVER_PORT'}
 スクリプト名 : $ENV{'SCRIPT_NAME'}
 要求メソ\ッド : $ENV{'REQUEST_METHOD'}
 参照元       : $ENV{'HTTP_REFERER'}
 エージェント : $HTTP_USER_AGENT
 ホスト名(IP) : $REMOTE_HOST ($REMOTE_ADDR)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
_EOF_

	$order = $S{'MailHeader'} . $order . $S{'MailFooter'};
	$from = $name . " <$from>";
	if (!stdio::SendMail($sendmail,$S{'MasterEmail'},$corbon,$S{'BccTo'},$S{'MasterEmail'},undef,"$S{'Title'} [注文メール]",$order)) {
		Error('送信失敗','メールの送信ができませんでした。');
	}

	@Record = stdio::ReadFile($DataFile);
	Error('100 ファイル未検出','データファイルの読み込みができません。') if ($Record[0] == -1);
	Error('110 排他制御中','只今、混雑しています。時間をおいて再試行してください。') if ($Record[0] == -2);
	Error('101 ファイル読込エラー','データファイルの読み込みができません。') if (!$Record[1]);

	foreach ($i = 1; $i <= $#Record; $i ++) {
		%Field = stdio::ReadData(split /\t/, $Record[$i]);
		if ($Buy{$Field{'Code'}}) {
			$Field{'Stock'} -= $Buy{$Field{'Code'}} if ($Field{'Stock'} ne "" && $Field{'Stock'} > 0);
			$Field{'Sell'}  += $Buy{$Field{'Code'}};
			$Record[$i] =
				  'Code='	. $Field{'Code'}	. "\t"
				. 'Time='	. $Field{'Time'}	. "\t"
				. 'Name='	. $Field{'Name'}	. "\t"
				. 'Category='	. $Field{'Category'}	. "\t"
				. 'Price='	. $Field{'Price'}	. "\t"
				. 'Price2='	. $Field{'Price2'}	. "\t"
				. 'Expires='	. $Field{'Expires'}	. "\t"
				. 'Stock='	. $Field{'Stock'}	. "\t"
				. 'Sell='	. $Field{'Sell'}	. "\t"
				. 'SendCost='	. $Field{'SendCost'}	. "\t"
				. 'InputType='	. $Field{'InputType'}	. "\t"
				. 'Url='	. $Field{'Url'}		. "\t"
				. 'Image='	. $Field{'Image'}	. "\t"
				. 'Comment='	. $Field{'Comment'}	. "\t"
				. 'Plus1='	. $Field{'Plus1'}	. "\t"
				. 'Plus2='	. $Field{'Plus2'}	. "\t"
				. 'Plus3='	. $Field{'Plus3'}	. "\t"
				. "\n";
		}
		%Field = ();
	}

	#/*--- ファイルのロック/入出力	---*/
	Error('110 排他制御中','只今混雑しています。時間をおいて再試行してください。') if (!stdio'LockCheck($DataFile,$E{'UseLock'}));
	$lockResult = stdio'FileLock($DataFile,$E{'UseLock'},@Record);
	if ($lockResult == -1){
		Error('603 シンボリックリンク不可','このサーバーではシンボリックリンクが使えません。');}

	elsif ($lockResult == 0){
		Error('102 ファイル書込エラー','ファイルへの書き込みができません。');}

	#/*--- オーダー内容をファイル書込	---*/
	$OrderFile = $DataDir . $orderCode . '.ord';
	if (open(FILE,">$OrderFile")) {
		print FILE $order;
		close(FILE);
	}

	Error('100 ファイル未検出','オーダー完了スキンファイルが存在しません。') if (!-e $OrderedPage);
	open(FILE, $OrderedPage) || Error('101 ファイル読込エラー','オーダー完了スキンファイルファイルの読み込みができません。');
	print "Content-type: text/html\n";
	stdio::SetCookie($S{'CookieName'},-1,-1);
	stdio::SetCookie("$S{'CookieName'}.T",-1,-1);
	print "\n";
	while (<FILE>) {
		s/%\{Title\}/$S{'Title'}/g;
		s/%\{Body\}/$S{'Body'}/g;
		s/%\{Script\}/$Script/g;
		s/%\{Order\}/$order/g;
		s/%\{Time\((.+)\)\}/stdio::SetTime($1,$S{'TimeZone'})/eg;
		s/%\{.*\}//g;
		print;
	}
	close(FILE);
	exit(0);
}

#/*------------- 注文フォーム表示 -------------------------------------------*/

sub outputOrderForm {
	%Field = readGoodsFile($DataFile);
	@Goods = getOrderdata_from_cookie($S{'CookieName'}) if ($_[0] != 1);
	Error('120 レコード未検出','カゴの中身がありません。') if (!$Goods[0]);
	Error('100 ファイル未検出','訪販法に基づく表記記述ファイルが存在しません。') if (!-e $HomonFile);
	open(FILE, $HomonFile) || Error('101 ファイル読込エラー','訪販法に基づく表記記述ファイルの読み込みができません。');
	$Print = join "", <FILE>;
	close(FILE);

	#/*--- 著作権表示。削除しないこと	---*/
	$Print  .= "\n"
	       .  "＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿＿\n"
	       .  "オンラインショップ支援システム [ウェブストアー]\n"
	       .  "  Produced by WiS. <http://www.webpower.jp/>\n"
	       .  "  Licensed to $licensee  <$registCode>\n";


	Error('100 ファイル未検出','送料定義ファイルが存在しません。') if (!-e $SendCostFile);
	open(FILE, $SendCostFile) || Error('101 ファイル読込エラー','送料定義ファイルの読み込みができません。');
	while (<FILE>) {
		next if (/^#/ || /^$/);
		chomp;
		($Pref,$SendCost) = split /,/;
		$PrefSelect .= qq|    <option>$Pref\n|;
	}
	close(FILE);

	#/*--- オーダーページ表示開始		---*/
	Error('100 ファイル未検出','オーダーページスキンファイルが存在しません。') if (!-e $OrderPage);
	open(FILE, $OrderPage) || Error('101 ファイル読込エラー','オーダーページスキンファイルが存在しません。');
	print "Content-type: text/html\n\n";
	while (<FILE>) {
		if (/%\{OrderTable\}/) {
			print qq|<table border=0 cellpadding=4 cellspacing=1>\n|;
			print qq|  <tr>\n|;
			print qq|    <td bgcolor=$S{'bgColorListMain'} align=center nowrap><font color=$S{'ftColorListMain'}>コード</font></td>\n|;
			print qq|    <td bgcolor=$S{'bgColorListMain'} align=center nowrap><font color=$S{'ftColorListMain'}>商品名</font></td>\n|;
			print qq|    <td bgcolor=$S{'bgColorListMain'} align=center nowrap><font color=$S{'ftColorListMain'}>内容</font></td>\n|;
			print qq|    <td bgcolor=$S{'bgColorListMain'} align=center nowrap><font color=$S{'ftColorListMain'}>単価 (円)</font></td>\n|;
			print qq|    <td bgcolor=$S{'bgColorListMain'} align=center nowrap><font color=$S{'ftColorListMain'}>数量</font></td>\n|;
			print qq|    <td bgcolor=$S{'bgColorListMain'} align=center nowrap><font color=$S{'ftColorListMain'}>金額 (円)</font></td>\n|;
			print qq|  </tr>\n|;
			foreach (@Goods) {
				local(@Record) = split /:/;
				$bgColor = $bgColor eq $S{'bgcolorListA'} ? $S{'bgcolorListB'} : $S{'bgcolorListA'};
				print  qq|  <tr>\n|;
				printf(qq|    <td align=center bgcolor=$bgColor>%04d</td>\n|,$Record[0]);
				print  qq|    <td bgcolor=$bgColor>$Field{$Record[0]}{'Name'}</td>\n|;
				if ($Field{$Record[0]}{'Stock'} ne "" && $Field{$Record[0]}{'Stock'} - $Record[1] < 0) {
					print qq|      <td align=center bgcolor=$bgColor colspan=6>申\し訳ございませんが只今品切れいたしました</td>\n|;
					print qq|    </tr>\n|;
					next;
				}
				print qq|    <td bgcolor=$bgColor><small>　|;

				$i = 0;
				if ($Field{$Record[0]}{'Plus1'} && $Record[2]) {
					foreach (split /</, $Field{$Record[0]}{'Plus1'}) {
						if (!$i) {
							$Field[0] = $_;
							$i ++;
							next;
						}
						($Field[1],$Field[2],$Field[3]) = split />/;
						last if ($Record[2] eq $Field[1]);
						$i ++;
					}
					print qq|($Field[0]) $Field[2]　|;
					$PriceTest += $Field[3];
					$i = 0;
					@Field = ();
				}
				if ($Field{$Record[0]}{'Plus2'} && $Record[3]) {
					foreach (split /</, $Field{$Record[0]}{'Plus2'}) {
						if (!$i) {
							$Field[0] = $_;
							$i ++;
							next;
						}
						($Field[1],$Field[2],$Field[3]) = split />/;
						last if ($Record[3] eq $Field[1]);
						$i ++;
					}
					print qq|($Field[0]) $Field[2]　|;
					$PriceTest += $Field[3];
					$i = 0;
					@Field = ();
				}
				if ($Field{$Record[0]}{'Plus3'} && $Record[4]) {
					foreach (split /</, $Field{$Record[0]}{'Plus3'}) {
						if (!$i) {
							$Field[0] = $_;
							$i ++;
							next;
						}
						($Field[1],$Field[2],$Field[3]) = split />/;
						last if ($Record[4] eq $Field[1]);
						$i ++;
					}
					print qq|($Field[0]) $Field[2]　|;
					$PriceTest += $Field[3];
					$i = 0;
					@Field = ();
				}
				print qq|</small></td>\n|;
				if ($Field{$Record[0]}{'Expires'} ne "" && $Field{$Record[0]}{'Expires'} - $date >= 0) {
					$Field{$Record[0]}{'Price2'} += $PriceTest ? $PriceTest : 0;
					$Field{$Record[0]}{'Price'}   = $Field{$Record[0]}{'Price2'};
				} else {
					$Field{$Record[0]}{'Price'} += $PriceTest ? $PriceTest : 0;
				}
				print qq|      <td align=right bgcolor=$bgColor>| . setComma($Field{$Record[0]}{'Price'}) . qq|</td>\n|;
				$zbetuSum       = $Field{$Record[0]}{'Price'} * $Record[1];
				$totalZbetuSum += $zbetuSum;
				print qq|    <td align=right bgcolor=$bgColor>$Record[1]</td>\n|;
				print qq|    <td align=right bgcolor=$bgColor>| . setComma($zbetuSum) . qq|</td>\n|;
				print qq|  </tr>\n|;
				undef $PriceTest;
			}
			$tax = setTax($totalZbetuSum, $S{'TaxRate'});
			$totalZkomiSum = $totalZbetuSum;
			if ($S{'TaxIncluded'}) {
				$totalZbetuSum -= $tax;
			} else {
				$totalZkomiSum += $tax;
			}
			$tax = setComma($tax);
			$totalZkomiSum = setComma($totalZkomiSum);
			$totalZbetuSum = setComma($totalZbetuSum);
			print qq|  <tr>\n|;
			print qq|    <td colspan=9><hr noshade size=3><td>\n|;
			print qq|  </tr>\n|;
			print qq|  <tr>\n|;
			print qq|    <td colspan=5 bgcolor=$S{'bgcolorTotal2'} align=center>$ktotal</td>\n|;
			print qq|    <td bgcolor=$S{'bgcolorTotal2'} align=right>$totalZbetuSum</td>\n|;
			print qq|  </tr>\n|;
			print qq|  <tr>\n|;
			print qq|    <td colspan=5 bgcolor=$S{'bgcolorTotal2'} align=center>消　費　税</td>\n|;
			print qq|    <td bgcolor=$S{'bgcolorTotal2'} align=right>$tax</td>\n|;
			print qq|  </tr>\n|;
			print qq|  <tr>\n|;
			print qq|    <td colspan=5 bgcolor=$S{'bgcolorTotal'} align=center>合　　計　<small>（送料は含まれていません）</small></td>\n|;
			print qq|    <td bgcolor=$S{'bgcolorTotal'} align=right><b>$totalZkomiSum</b></td>\n|;
			print qq|  </tr>\n|;
			print qq|</table>\n|;
		} else {
			s/%\{Title\}/$S{'Title'}/g;
			s/%\{Body\}/$S{'Body'}/g;
			s/%\{Hohan\}/$Print/;
			s/%\{Script\}/$Script/g;
			s/%\{Pref\}/$PrefSelect/g;
			s/%\{Time\((.+)\)\}/stdio::SetTime($1,$S{'TimeZone'})/eg;
			s/%\{.*\}//g;
			print;
		}
	}
	exit(0);
}



#/*------------- カゴへ商品を入れる (クッキー処理) --------------------------*/

sub InputCookie {
	@Goods = getOrderdata_from_cookie($S{'CookieName'});

	#/*--- 標準入力から商品を追加	---*/
	foreach (@Query) {
		if ($STDIN{$_}) {
			Error('405 フォーム入力ミス','同一商品は99個までしかカゴに入れられません。') if ($STDIN{$_} =~ /\D/ || $STDIN{$_} >= 100);
			if ($Hash{$_} ne "") {
				$Goods[$Hash{$_}] = qq|$_:$STDIN{$_}:$STDIN{"$_.1"}:$STDIN{"$_.2"}:$STDIN{"$_.3"}|;
			} else {
				if ($STDIN{"$_.1"} eq 'noselect' || $STDIN{"$_.2"} eq 'noselect' || $STDIN{"$_.3"} eq 'noselect') {
					Error('405 フォーム入力ミス','選択されていない項目があります。');
				}
				push(@Goods, qq|$_:$STDIN{$_}:$STDIN{"$_.1"}:$STDIN{"$_.2"}:$STDIN{"$_.3"}|);
			}
			$Buy{$_} = $STDIN{$_};
		}
	}

	#/*--- カゴから商品を削除	---*/
	if ($STDIN{'mode'} eq 'cancel') {
		$i = 0;
		foreach (@Goods) {
			@Field = split /:/;
			undef $Goods[$i] if ($STDIN{$Field[0]});
			$i ++;
		}
		@Goods = grep $_, @Goods;

	#/*--- カゴの中身を空にする	---*/
	} elsif ($STDIN{'mode'} eq 'clear') {
		undef @Goods;
	}

	#/*--- 在庫のチェック		---*/
	Error('100 ファイル未検出','データファイルの読み込みが存在しません。') if (!-e $DataFile);
	Error('110 排他制御中','只今、混雑しています。時間をおいて再試行してください。') if (!stdio::LockCheck($DataFile));
	open(FILE, $DataFile) || Error('101 ファイル読込エラー','データファイルの読み込みができません。');
	while (<FILE>) {
		%Field = stdio::ReadData(split /\t/);
		if ($Buy{$Field{'Code'}}) {
			if ($Field{'Stock'} ne "" && $Field{'Stock'} - $Buy{$Field{'Code'}} < 0) {
				if ($Field{'Stock'} <= 0) {
					close(FILE);
					Error('',"申\し訳ございませんが、$Field{'Name'}は只今品切れいたしました。");
				} else {
					close(FILE);
					Error('',"申\し訳ございませんが、$Field{'Name'}は$Field{'Stock'}個までしかお買い求めいただけません。");
				}
			}
		}
		%Field = ();
	}

	if (!$STDIN{'frame'}){
		print "Content-type: text/html\n";
		if (!$Goods[0]) {
			stdio::SetCookie($S{'CookieName'},-1,-1);
			stdio::SetCookie("$S{'CookieName'}.T",-1,-1);
		} else {
			stdio::SetCookie($S{'CookieName'},join('&', @Goods));
			stdio::SetCookie("$S{'CookieName'}.T","Time:" . time . "&Date:" . $date);
		}
		print "\n";
		SeeBasket(1);
	}
	OutputFrame(1);
}



#/*------------- カゴの中身を見る -------------------------------------------*/

sub SeeBasket {
	%Field = readGoodsFile($DataFile);
	if ($_[0] != 1){
		print "Content-type: text/html\n\n";
		@Goods = getOrderdata_from_cookie($S{'CookieName'});
	}
	print <<_EOF_;

<html>
<head>
<title>$S{'Title'}</title>
$S{'StyleSheet'}</head>
<body $S{'Body'}>
$S{'Header'}

_EOF_

	#/*--- カゴの中身がある場合	---*/
	if ($Goods[0]) {
		print qq|<form method=POST action="$Script" name=orderList><input type=hidden name=mode value=cancel>\n|;
		print qq|  <table border=0 cellpadding=4 cellspacing=1>\n|;
		print qq|    <tr>\n|;
		print qq|      <td bgcolor=$S{'bgColorListMain'} align=center nowrap><font color=$S{'ftColorListMain'}>コード</font></td>\n|;
		print qq|      <td bgcolor=$S{'bgColorListMain'} align=center nowrap><font color=$S{'ftColorListMain'}>商品名</font></td>\n|;
		print qq|      <td bgcolor=$S{'bgColorListMain'} align=center nowrap><font color=$S{'ftColorListMain'}>内容</font></td>\n|;
		print qq|      <td bgcolor=$S{'bgColorListMain'} align=center nowrap><font color=$S{'ftColorListMain'}>単価 (円)</font></td>\n|;
		print qq|      <td bgcolor=$S{'bgColorListMain'} align=center nowrap><font color=$S{'ftColorListMain'}>数量</font></td>\n|;
		print qq|      <td bgcolor=$S{'bgColorListMain'} align=center nowrap><font color=$S{'ftColorListMain'}>金額 (円)</font></td>\n|;
		print qq|      <td bgcolor=$S{'bgColorListMain'} align=center nowrap><font color=$S{'ftColorListMain'}>取消</font></td>\n|;
		print qq|    </tr>\n|;
		foreach (@Goods) {
			local(@Record) = split /:/;
			$bgColor = $bgColor eq $S{'bgcolorListA'} ? $S{'bgcolorListB'} : $S{'bgcolorListA'};
			print  qq|    <tr>\n|;
			printf(qq|      <td align=center bgcolor=$bgColor>%04d</td>\n|,$Record[0]);
			if ($Field{$Record[0]}{'Url'}){
				print qq|      <td bgcolor=$bgColor><a href="$Field{$Record[0]}{'Url'}">$Field{$Record[0]}{'Name'}</a></td>\n|;}
			else{
				print qq|      <td bgcolor=$bgColor>$Field{$Record[0]}{'Name'}</td>\n|;}

			if ($Field{$Record[0]}{'Stock'} ne "" && $Field{$Record[0]}{'Stock'} - $Record[1] < 0) {
				print qq|      <td align=center bgcolor=$bgColor colspan=6>申\し訳ございませんが只今品切れいたしました</td>\n|;
				print qq|      <td align=center bgcolor=$bgColor><input type=checkbox name=remove value=$Record[0]></td>\n|;
				print qq|    </tr>\n|;
				next;
			}
			print qq|      <td bgcolor=$bgColor><small>　|;

			$i = 0;
			if ($Field{$Record[0]}{'Plus1'} && $Record[2]) {
				foreach (split /</, $Field{$Record[0]}{'Plus1'}) {
					if (!$i) {
						$Field[0] = $_;
						$i ++;
						next;
					}
					($Field[1],$Field[2],$Field[3]) = split />/;
					last if ($Record[2] eq $Field[1]);
					$i ++;
				}
				print qq|($Field[0]) $Field[2]　|;
				$PriceTest += $Field[3];
				$i = 0;
				@Field = ();
			}
			if ($Field{$Record[0]}{'Plus2'} && $Record[3]) {
				foreach (split /</, $Field{$Record[0]}{'Plus2'}) {
					if (!$i) {
						$Field[0] = $_;
						$i ++;
						next;
					}
					($Field[1],$Field[2],$Field[3]) = split />/;
					last if ($Record[3] eq $Field[1]);
					$i ++;
				}
				print qq|($Field[0]) $Field[2]　|;
				$PriceTest += $Field[3];
				$i = 0;
				@Field = ();
			}
			if ($Field{$Record[0]}{'Plus3'} && $Record[4]) {
				foreach (split /</, $Field{$Record[0]}{'Plus3'}) {
					if (!$i) {
						$Field[0] = $_;
						$i ++;
						next;
					}
					($Field[1],$Field[2],$Field[3]) = split />/;
					last if ($Record[4] eq $Field[1]);
					$i ++;
				}
				print qq|($Field[0]) $Field[2]　|;
				$PriceTest += $Field[3];
				$i = 0;
				@Field = ();
			}
			print qq|</small></td>\n|;
			if ($Field{$Record[0]}{'Expires'} ne "" && $Field{$Record[0]}{'Expires'} - $date >= 0) {
				$Field{$Record[0]}{'Price2'} += $PriceTest ? $PriceTest : 0;
				$Field{$Record[0]}{'Price'}   = $Field{$Record[0]}{'Price2'};
			} else {
				$Field{$Record[0]}{'Price'} += $PriceTest ? $PriceTest : 0;
			}
			print qq|      <td align=right bgcolor=$bgColor>| . setComma($Field{$Record[0]}{'Price'}) . qq|</td>\n|;
			$zbetuSum       = $Field{$Record[0]}{'Price'} * $Record[1];
			$totalZbetuSum += $zbetuSum;
			print qq|      <td align=right bgcolor=$bgColor>$Record[1]</td>\n|;
			print qq|      <td align=right bgcolor=$bgColor>| . setComma($zbetuSum) . qq|</td>\n|;
			print qq|      <td align=center bgcolor=$bgColor><input type=checkbox name=remove value=$Record[0]></td>\n|;
			print qq|    </tr>\n|;
			undef $PriceTest;
		}
		$tax = setTax($totalZbetuSum, $S{'TaxRate'});
		$totalZkomiSum = $totalZbetuSum;
		if ($S{'TaxIncluded'}) {
			$totalZbetuSum -= $tax;
		} else {
			$totalZkomiSum += $tax;
		}
		$tax = setComma($tax);
		$totalZkomiSum = setComma($totalZkomiSum);
		$totalZbetuSum = setComma($totalZbetuSum);
		print <<_EOF_;
    <tr>
      <td colspan=9><hr noshade size=3><td>
    </tr>
    <tr>
      <td colspan=5 bgcolor=$S{'bgcolorTotal2'} align=center>$ktotal</td>
      <td bgcolor=$S{'bgcolorTotal2'} align=right>$totalZbetuSum</td>
    </tr>
    <tr>
      <td colspan=5 bgcolor=$S{'bgcolorTotal2'} align=center>消　費　税</td>
      <td bgcolor=$S{'bgcolorTotal2'} align=right>$tax</td>
    </tr>
    <tr>
      <td colspan=5 bgcolor=$S{'bgcolorTotal'} align=center>合　　計　<small>（送料は含まれていません）</small></td>
      <td bgcolor=$S{'bgcolorTotal'} align=right><b>$totalZkomiSum</b></td>
      <td bgcolor=000000><small><input type=submit value="取消" onClick="return confirm('選択した商品を元に戻します。よろしいですか?');"></td>
    </tr>
    <tr>
      <td colspan=9 align=right><small><a href="javascript:CheckAll(true)">全て選択</a>｜<a href="javascript:CheckAll(false)">全ての選択を解除</a></small></td>
    </tr>
  </table>
</form>
<table border=1 cellspacing=0 cellpadding=2 bgcolor="#FFFFFF">
  <tr><form method=POST action="$Script" target=_top>
    <td><input type=submit name=mode value="オーダーする"></td></form>
    <td><input type=button value=" もとに戻る " onClick="history.back()"></td><td><input type=button value="ショッピングのtopへ戻る" onClick=location.href="../index.html"></td>
  </tr>
</table>
　<br>
<script language=JavaScript>
<!--
    function CheckAll(checked) {
        len = document.orderList.elements.length;
        var i = 0;
        for (i = 0; i < len; i ++) {
            if (document.orderList.elements[i].name == "remove") {
                document.orderList.elements[i].checked = checked;
            }
        }
    }
// -->
</script>

_EOF_

	#/*--- カゴの中身が無い場合	---*/
	} else {
		print qq|<h3>カゴの中身がありません。</h3><table border=1 cellspacing=0 cellpadding=2 bgcolor="#FFFFFF">
  <tr>
    <td><input type=button value=" もとに戻る " onClick="history.back()"></td><td><input type=button value="ショッピングのtopへ戻る" onClick=location.href="../index.html"></td>
  </tr>
</table>
\n|;
	}
	print qq|<hr noshade>\n|;
	print $S{'Footer'};
	print qq|</body>\n|;
	print qq|</html>\n|;
	exit(0);
}

#/*------------- カゴの中身の読み込み ---------------------------------------*/

sub getOrderdata_from_cookie {
	local($i) = 0;
	foreach (split /;/, $ENV{'HTTP_COOKIE'}) {
		@ARG = split /=/;
		$ARG[0] =~ s/ //g;
		if ($ARG[0] eq $_[0]) {
			foreach (split /&/, $ARG[1]){
				@Field = split /:/;
				if ($Hash{$Field[0]} ne "") {
					$Goods[$Hash{$Field[0]}] = $_;
				} else {
					$Goods[$i] = $_;
					$Hash{$Field[0]} = $i;
					$i ++;
				}
				@Field = ();
			}
			return @Goods;
		}
	}
	return;
}

#/*------------- 商品ファイル読み込み ---------------------------------------*/

sub readGoodsFile {
	Error('100 ファイル未検出','商品ファイルが存在しません。') if (!-e $_[0]);
	open(FILE, $_[0]) || Error('101 ファイル読込エラー','設定ファイルの読み込みができません。');
	while (<FILE>) {
		next if (/^Version=/);
		foreach (split /\t/) {
			local($key,$value) = split /=/, $_, 2;
			if ($key eq 'Code'){
				$Code = $value;}
			else{
				$Field{$Code}{$key} = $value;}
		}
	}
	close(FILE);
	return %Field;
}


#------------------------------------------------------------------------------
# ■ 消費税の計算 (setTax)
#
#     呼出元 : (汎用)
#     引  数 : 価格, 税率[%](0は税込み)
#     戻り値 : 消費税(小数点以下は切捨) !! 消費税税加算後の価格では無い
#------------------------------------------------------------------------------

sub setTax #($price, $tax_rate)
{

  my($price, $tax_rate) = @_;

  if ($S{'TaxIncluded'}) {
    return $tax_rate ? $price - int($price / (1 + $tax_rate * 0.01)) : 0;
  } else {
    return $tax_rate ? int($tax_rate * $price / 100) : 0;
  }
}


#------------------------------------------------------------------------------
# ■ 3桁毎にカンマ打ち (Show_ErrorPage)
#
#     呼出元 : (汎用)
#     引  数 : 数字
#     戻り値 : カンマが打たれた文字列
#------------------------------------------------------------------------------

sub setComma #($str)
{
  local($str) = $_[0];

  return $str if ($str =~ /\D/);
  1 while $str =~ s/(\d+)(\d{3})/$1,$2/;
  return $str;
}


#/*------------- 標準入力デコード処理 ---------------------------------------*/

sub decodeQueryString {
	if ($ENV{'REQUEST_METHOD'} eq 'POST') {
		read(STDIN, $QUERY_DATA, $ENV{'CONTENT_LENGTH'});
	} else {
		$QUERY_DATA  = $ENV{'QUERY_STRING'};
	}
	foreach (split /&/, $QUERY_DATA) {
		($name, $value) = split /=/;
		$value =~ tr/+/ /;
		$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
		jcode::convert(*value,$_[0]) if ($_[0]);
		$value =~ s/&/&amp;/g;
		$value =~ s/"/&quot;/g;
		$value =~ s/</&lt;/g;
		$value =~ s/>/&gt;/g;
		$value =~ s/\t//g;
		$value =~ s/\r\n/\n/g;
		$value =~ s/\r/\n/g;
		$value =~ s/\n/<br>/g;
		if ($name eq 'remove'){
			$STDIN{$value} = $name;}
		else{
			$STDIN{$name} = $value;}
		push(@Query, $name) if ($name =~ /^\d*$/ && $value ne 'remove');
	}
	return %STDIN;
}

###############################################################################

exit(0);

#/*------------- 環境設定ファイル読み込み -----------------------------------*/

sub ReadEnvFile {
	open(FILE, $_[0]) || Error('101 ファイル読込エラー','環境設定ファイルの読み込みができません。');
	while(<FILE>) {
		s/\r|\n//g;
		($Key,$Value) = split /\t/;
		$E{$Key} = $Value;
	}
	close(FILE);
	return %E;
}

#/*------------- エラーサイン画像出力 ---------------------------------------*/

sub ErrorSign {
	@array = (
	'47','49','46','38','39','61','1c','00','1c','00','a1','00','00','00','00','00','ff','00','00','ff',
	'ff','ff','bf','bf','bf','21','f9','04','01','00','00','03','00','2c','00','00','00','00','1c','00',
	'1c','00','00','02','68','9c','8f','a9','cb','18','1f','9a','4c','30','ce','59','df','95','d9','6e',
	'd5','69','1f','15','8e','4e','28','9a','68','fa','65','82','90','a9','d5','1b','b7','f3','0b','57',
	'36','24','00','40','0e','d9','b8','7a','3f','20','8b','31','f4','d1','74','9c','1b','11','57','43',
	'3a','95','cb','a0','94','87','a3','56','8f','87','e1','4b','6b','f4','9c','b0','b8','32','94','39',
	'7e','98','c1','61','12','39','5b','2c','47','07','5e','b3','3d','ba','ca','97','e8','fa','be','c6',
	'0f','18','08','c8','27','88','32','50','00','00','3b');
	print "Content-type: image/gif\n";
	print "Content-length: 151\n";
	print "\n";
	binmode(STDOUT);
	foreach (@array) {
		print pack('C*',hex($_));
	}
	exit(0);
}

#/*------------- エラー発生時の処理 -----------------------------------------*/

sub Error {
	@ErrorMessage = @_;
	$ErrorMessage[0] = '000 システムエラー'				    if (!$ErrorMessage[0]);
	$ErrorMessage[1] = '原因不明のエラー発生により強制終了されました。' if (!$ErrorMessage[1]);
	$ErrorMessage[2] = '<p>' . $ErrorMessage[2] . '</p>'		    if  ($ErrorMessage[2]);
	$ErrorMessage[2] = qq|  <p>　このプログラムはリクエスト処理中にエラーが発生したため、処理を中断しました。エラーの発生原因として、リクエスト内容の不備、アクセス権が与えられていない、誤った設定がなされている、あるいは突発的なサーバーエラー等の可能\性が考えられます。<br>\n|
			 . qq|　表\示されたエラーメッセージをご確認の上、再試行してみてください。ブラウザでリロードすることで再試行できます。繰り返し、エラーメッセージが表\示される場合は、このサイトの管理者に連絡してください。</p>\n|
			 if (!$ErrorMessage[2]);

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

<html>
<head>
<title>$S{'Title'} [$ErrorMessage[0]]</title>
<meta http-equiv="Pragma" content="no-cache">
$S{'StyleSheet'}</head>
<body $S{'Body'}>
<img src="$Script?error" width=28 height=28 alt="&lt;!&gt;"><font size=5><b> $ErrorMessage[0]</b></font>
<hr size=1 width=65% align=left>
<blockquote>
  <h3>$ErrorMessage[1]</h3>
  $ErrorMessage[2]
  <p align=center><a href="javascript:history.back(1)">前ページへ戻る</a></p>
</blockquote>
<hr noshade>
</body>
</html>

_EOF_
	exit(1);
}

sub sigexit {
	if (-e $stdio::lockfile) { unlink($stdio::lockfile); }
	if (-e $stdio::tempfile) { unlink($stdio::tempfile); }
	exit(1);
}
