#!/usr/local/bin/perl

;# ショッピングバスケットシステム version 1.22 <Freeware> for Japanese
;#
;# Copyright (C) 1997-2001 CGI-RESCUE, All rights reserved.
;# Scripts Found at: http://www.rescue.ne.jp/

;# 履歴(History)
;# v0.00 04/Oct/97 初期版
;# v1.00 20/Jun/98 公開版リリース
;# v1.10 19/Jul/98 備考欄が送信されない点を修正
;# v1.11 29/Oct/98 カーボンコピー機能を廃止し代替処理
;# v1.12
;# v1.20 14/Nov/01 特定商取引に関する法律(特商法)に対応
;# v1.21 24/Nov/01 タグ記述ミスの修正(cargo.cgi)
;# v1.22 04/Des/01 消費税率が０の場合に合計が出ないバグの修正(cargo.cgi)

#----------------#
#    初期設定    #
#----------------#----------------------------------------------------------------------

#このスクリプトのＵＲＬ(httpからフルパスで設定)
$reload = 'http://設置した場所/cargo.cgi';

#ありがとうメッセージのＵＲＬ(httpからフルパスで設定)
$location = 'http://設置した場所/thanks.html';

#WebFORMの設定
$webform = 'http://設置した場所/webform.cgi';

#サービス名
$title = 'ショッピングバスケット';

#商品選択画面
$modoru = 'http://設置した場所/';

#ホームページ
$homepage = 'http://ホームページ/';

#BODY設定
$body = '<body bgcolor=#ffffff>';

#日本語コード変換らいぶらり
require './jcode-211.pl';

#消費税率(%) 算出しない場合は 0 と設定
$taxrate = 5;

#特定商取引に関する法律(特商法)で義務付けされている告知表示 ... $tokushoho = <<'EOF'; 〜 EOF の間に記述する
$tokushoho = <<'EOF';

○販売業者名


○所在地


○電話番号


○販売価格、送料、代金の支払い時期および方法


○商品代金以外の必要料金


○申し込みの有効期限


○引渡し時期


○返品特約


○返品期限と返品送料


○不良品の取り扱い


EOF


#---------------------------------------------------------------------------------------

read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); # 標準入力に限定
if ($ENV{'QUERY_STRING'} ne "") { &error("不正な入力を検知しました"); }

@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;

	# 記録するデータはsjisに統一する
	&jcode'convert(*name,'sjis');
	&jcode'convert(*value,'sjis');

	$value =~ s/</&lt;/g;
	$value =~ s/>/&gt;/g;
	$value =~ s/://g;
	$value =~ s/,//g;

	$FORM{$name} = $value;
}

# クッキー読み込み

$cookies = $ENV{'HTTP_COOKIE'};

@cookie_pairs = split(/;/,$cookies);
foreach $cookie_pair (@cookie_pairs) {

	($name, $value) = split(/=/, $cookie_pair);
	$name =~ s/ //g;
	$DUMMY{$name} = $value;
}

$goods_next = 0;
foreach $goods_num (1 .. $#cookie_pairs + 1) {

	$cookie_name = 'CARGO_'.$goods_num;
	if ($DUMMY{$cookie_name} =~ /^goods:/ || $DUMMY{$cookie_name} =~ /^removed/) { $GOODS[$goods_num] = $DUMMY{$cookie_name}; $goods_next = $goods_num + 1; }
}

# 分岐

if ($FORM{'action'} eq 'regist') { &regist; }
elsif ($FORM{'action'} eq 'remove') { &remove; }
else { &html; }

sub html { # かごに入れた商品一覧

	print "Content-type: text/html; charset=Shift_JIS\n\n";
	print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";
        print "<html><head><title>$title</title>\n";
	print "<!-- 簡易ショッピングバスケットシステム (C)1997-2001 CGI-RESCUE, All rights reserved.-->\n";
	print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=x-sjis\">\n";

	print <<"EOF";
<SCRIPT language="JavaScript">
<!--
SubmitCheck=false;
function Submit() {
	if(SubmitCheck==false){ SubmitCheck=true; document.Order.submit(); }
	else{ bottonAlert(); }
}
function bottonAlert() {
	Check = navigator.userAgent.indexOf(";");
	if(Check != -1 && navigator.userAgent.substring(Check+2,Check+10)=="MSIE 3.0") { alert("ボタンが２度押されましたので、再度実行してください。"); }
	else { alert("送信中ですのでお待ちください。"); }
}
function Kakunin() {

	if(SubmitCheck==false){ Submit(); }
	else { bottonAlert(); }
}
//-->
</SCRIPT>
</head>
EOF
	print "$body\n";
	print "<center>\n";
	print "<h1>$title<hr></h1>\n";

	$zeibetsu_goukei = 0;

	foreach $j (1 .. $#GOODS + 1) {

		if ($GOODS[$j] =~ /^removed/i || $GOODS[$j] eq '') { next; }
		if (!$sonzai) { 

			print "<h3>現在買い物かごには、次の商品が入っています.</h3>\n";
			print "<table border=1>\n";
			print "<tr><th bgcolor=\"#ffaaaa\">商品名</th><th bgcolor=\"#ffaaaa\">単価</th><th bgcolor=\"#ffaaaa\">数量</th><th bgcolor=\"#ffaaaa\">備考</th><th bgcolor=\"#ffaaaa\">小計</th><th></th><th bgcolor=\"#ffaaaa\">削除</th></tr>\n";
			$sonzai = 1;
		}

		@pairs = split(/,/,$GOODS[$j]);
		foreach $pair (@pairs) {

			($name, $value) = split(/:/,$pair);
			$COOKIE{$name} = $value;
		}

		$unit = $COOKIE{'unit'};
		1 while $unit =~ s/(.*\d)(\d\d\d)/$1,$2/g; #桁カンマを入れる処理

		$shoukei = $shoukei2 = $COOKIE{'unit'} * $COOKIE{'amount'};
		1 while $shoukei2 =~ s/(.*\d)(\d\d\d)/$1,$2/g;
		$zeibetsu_goukei = $zeibetsu_goukei2 = $zeibetsu_goukei + $shoukei;

		print "<tr>\n";
		print "<th nowrap>$COOKIE{'goods'}</th>\n";
		print "<th nowrap align=right>$COOKIE{'unit'}円</th>\n";
		print "<th nowrap align=right>$COOKIE{'amount'}</th>\n";
		print "<th>\&nbsp;$COOKIE{'rem'}</th>\n";
		print "<th align=right>\&nbsp;$shoukei2円</th>\n";

		print "<th><form method=POST action=\"cargo.cgi\">\n";
		print "<input type=hidden name=\"action\" value=\"remove\">\n";
		print "<input type=hidden name=\"goods_num\" value=\"$j\"></th>\n";

		print "<th><input type=submit value=\"削除\" title=\"かごから出す\"></th></tr></form>\n";

		push(@MAIL,"$COOKIE{'goods'}:$COOKIE{'amount'}:$COOKIE{'rem'}:$COOKIE{'unit'}:$shoukei2");
	}

	if (!$sonzai) {

		print "<h3>現在買い物かごには何も入っていません.</h3>\n";
		print "<h3>お買い物をする場合は<a href=\"$modoru\">商品選択画面</a>へお越しください.</h3>\n";

	}
	else {

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

		if ($taxrate != 0) {

			$tax = int($zeibetsu_goukei * ($taxrate / 100));
			$sougoukei = $zeibetsu_goukei + $tax;
			1 while $sougoukei =~ s/(.*\d)(\d\d\d)/$1,$2/g;
			$zei = '税別';
		}
		else {
			$sougoukei = $zeibetsu_goukei + $tax;
			1 while $sougoukei =~ s/(.*\d)(\d\d\d)/$1,$2/g;
			$zei = '';
		}

		print "<tr><th bgcolor=\"#ffaaaa\" colspan=4 align=right>$zei商品合計</th><th bgcolor=\"#ffaaaa\" align=right>$zeibetsu_goukei2円</th><th></th></tr>\n";
		if ($taxrate != 0) {

			print "<tr><th bgcolor=\"#ffaaaa\" colspan=4 align=right>消費税$taxrate\%</th><th bgcolor=\"#ffaaaa\" align=right>$tax円</th><th></th></tr>\n";
			print "<tr><th bgcolor=\"#ffaaaa\" colspan=4 align=right>商品合計</th><th bgcolor=\"#ffaaaa\" align=right>$sougoukei円</th><th></th></tr>\n";
		}

		print "</table><p>\n";

		print "<h3>さらにお買い物を続ける場合は<a href=\"$modoru\">商品選択画面</a>へ、<br>\n";
		print "またはブラウザの[戻る]ボタンを押して前の画面に移動してください.<p>\n";
		print "<u>この他に送料等がかかる場合がありますので、<br>下記の特商法による表\示をご覧ください.</u></h3>\n";
		print "※かごへの出し入れは延べ２０回までになります.\n";

		print "<br>\n";
		print "<h2><hr width=80%>ご注文が決まりましたら下記にご記入ください<hr width=80%></h2>\n";

		print "<table width=70% align=center><tr><td>\n";

		print "<form><b>特定商取引に関する法律(特商法)による表\示</b><br>\n";
		print "<textarea cols=70 rows=10>$tokushoho</textarea></form>\n";

		print "<form method=POST action=\"$webform\" name=\"Order\">\n";
		print "<input type=hidden name=\"location\" value=\"$location\">\n";
		print "<input type=hidden name=\"subject\" value=\"$title(注文)\">\n";

		foreach $mail (@MAIL) {

			($A,$B,$C,$D,$E) = split(/:/,$mail,5);
			print "<input type=hidden name=\"注文\" value=\"$A($C) $D円 x $B = $E円\">\n";
		}

		if ($taxrate != 0) { print "<input type=hidden name=\"消費税\" value=\"$tax円\">\n"; }
		print "<input type=hidden name=\"商品合計\" value=\"$sougoukei円\">\n";

		print "<input type=checkbox name=\"confirm\" value=\"1\"> 特商法による表\示を読んで承諾後に左枠にチェックを入れてください<p>\n";
		print "申\込者氏名 <input type=text name=\"申\込者氏名\" size=60 style=\"ime-mode: active\"><br>\n";
		print "申\込者住所 <input type=text name=\"申\込者住所\" size=80 style=\"ime-mode: active\" value=\"〒\"><br>\n";
		print "申\込者電話番号 <input type=text name=\"申\込者電話番号\" size=20 style=\"ime-mode: inactive\"><br>\n";
		print "申\込者Ｅメール <input type=text name=\"EMAIL\" size=50 style=\"ime-mode: inactive\"><br>\n"; # ラベル名は EMAIL または E-MAIL のみ
		print "届け先氏名 <input type=text name=\"届け先氏名\" size=60 style=\"ime-mode: active\"><br>\n";
		print "届け先住所 <input type=text name=\"届け先住所\" size=80 style=\"ime-mode: active\" value=\"〒\"><br>\n";
		print "届け先電話番号 <input type=text name=\"届け先電話番号\" size=20 style=\"ime-mode: inactive\"><p>\n";
		print "備考などがあれば<br><textarea name=\"備考\" rows=5 cols=70 wrap=hard></textarea><p>\n";

		print "<input type=hidden name=\"c_copy\" value=\"on\">\n"; # 写し表示は必須

		print <<"EOF";
<SCRIPT>
<!--
document.write("<input type=button value='    → 最終確認へ進む    ' onClick='Kakunin()'> <input type=reset value='× 書き直し'></form><p><br>\\n");
// -->
</SCRIPT>
<NOSCRIPT>
<b>ご利用には、JavaScriptを有効にした対応ブラウザが必要です。</b><p>
○ Internet Explorer 5.0 の例<br> 
[ツール]→[インターネットオプション]→[セキュリティ] でゾーンを選択後 [レベルのカスタマイズ]→[スクリプト]→[アクティブスクリプト] を[有効]に設定。<br>
○ Netscape Navigator 4.73 の例<br> 
[編集]→[設定]→[詳細]→[JavaScript を有効にする]<br>
○ その他のブラウザは発売元にお問い合わせください。
</NOSCRIPT>
</td></tr></table>
EOF
	}

	print "<h3>[<a href=\"$homepage\">×注文しない</a>]</h3>\n";
	print "</center><p><div align=right><hr size=1>\n";

	# ●著作表示(これを削除すると利用規定違反となります)
	# ●フリーソフト(無償)でご利用いただく代わりに、当サイトの紹介リンクを入れさせていただきます. ↓
	print "<font size=-1><a href=\"http://www.rescue.ne.jp/\" target=\"_top\" title=\"買い物かごシステム導入はこちらへ\">MiniCARGO</a></font></div><p></body></html>\n";
	exit;
}

sub regist {

	if ($FORM{'amount'} =~ /\D/ || $FORM{'amount'} == 0) { &error('入力エラー','数量を入力してください.'); }

	$sales = "goods:$FORM{'goods'},amount:$FORM{'amount'},unit:$FORM{'unit'},rem:$FORM{'rem'},";
	push(@REG,$sales);

	if ($goods_next == 0) { $goods_next = 1; }
	if ($goods_next == 20) { &error('バスケット満杯','メモリがありません.<br>注文内容を削除しても復活はできません.<br>一旦ブラウザを閉じればメモリ復活することができます.'); }

	foreach $reg (@REG) {

		$cookie_name = "CARGO_$goods_next";

		$GOODS[$goods_next] = $reg;
		print "Set-Cookie: $cookie_name=$GOODS[$goods_next];\n";
		$goods_next++;
	}

	print "Location: $reload" . '?' . "\n\n";
	exit;
}

sub remove {

	if ($FORM{'goods_num'} eq '') { &error('処理エラー','削除処理に失敗しました.<br>ブラウザを閉じれば選択したすべての商品を一旦空にすることができます.'); }
	$cookie_name = "CARGO_$FORM{'goods_num'}";
	$GOODS[$FORM{'goods_num'}] = "removed";
	print "Set-Cookie: $cookie_name=$GOODS[$FORM{'goods_num'}];\n";
	print "Location: $reload" . '?' . "\n\n";
	exit;
}

sub error {

	print "Content-type: text/html; charset=Shift_JIS\n\n";
	print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";
        print "<html><head><title>$title</title>\n";
	print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=x-sjis\"></head>\n";
        print "$body\n";
        print "<h1>$_[0]</h1>\n";
	print "<h3>$_[1]</h3>\n";
	print "ブラウザの[戻る]ボタンを押して前の画面に移動してください.\n";
        print "</body></html>\n";
        exit;
}
