#!/usr/local/bin/perl

require "./setup.pl";

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
if ($ENV{'QUERY_STRING'} ne '') { $buffer .= "\&$ENV{'QUERY_STRING'}"; }

if ($center) { $center1 = '<center>'; $center2 = '</center>'; }
if ($buffer eq "") { &error('エラー','使用する商品ファイルが指定されていません.',"Usage http://URI/search.cgi\?_file=商品設定ファイル名(拡張子は不要)"); }

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

	($name,$value) = split(/=/,$pair);

	if ($name eq '') { next; }
	if ($name ne 'FF' && $name ne 'IDX') { push(@Buf,"$name=$value"); }

	$value =~ tr/+/ /;
	$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
	&jcode'convert(*value,'euc');

	$value =~ s/<//g;
	$value =~ s/>//g;
	$value =~ s/\n//g;
	$value =~ s/\r//g;
	$value =~ s/\f//g;
	$value =~ s/\t//g;

	$FORM{$name} = $value;
}

$strings_sjis = $FORM{'strings'};
&jcode'convert(*strings_sjis,'sjis');

if ($FORM{'_file'} eq '') { &error('アクセスエラー','使用する商品ファイルが指定されていません.',"Usage http://URI/search.cgi\?_file=商品設定ファイル名(拡張子は不要)"); }
if (!-e "$base_dir$FORM{'_file'}\.csv") { &error('設定エラー',"商品設定ファイル$FORM{'_file'}が見つかりません."); }

&lock;

#商品設定ファイルを開く
if (!open(FILE,"$base_dir$FORM{'_file'}\.csv")) { &error('エラー','商品ファイルが読み出せません.'); }
while (<FILE>) { push(@BASE,$_); }
close(FILE);

if ($FORM{'FF'} eq '') { $FF = 0; } else { $FF = $FORM{'FF'}; }
$TO = $FF + $page - 1;
if ($TO > $#BASE) { $TO = $#BASE; }
$hit = 0;
$next_num = '';

foreach $num ($FF .. $#BASE) {

	$BASE[$num] =~ s/\n//g;
	$data = $data2 = $BASE[$num];
	if ($data eq '') { next; }

	&jcode'convert(*data,'euc');
	($code,$name,$tanka,$rem,$rem2,$rem3,$url,$type) = &DecodeCSV($data);
	if ($code =~ /^#/ || $code =~ /^$/ || $tanka =~ /\D/) { next; }

	$search_strings = "$code $name $rem $rem2 $rem3";

	if ($FORM{'strings'} ne '') {

		if ($search_strings =~ /^([\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*$FORM{'strings'}/i) { ; } else { next; }
	}

	if ($FORM{'tanka'} ne '') {

		$tanka =~ s/\\//g;
		if ($tanka == 0) { next; }

		($min,$max) = split(/\,/,$FORM{'tanka'});

		if ($min eq '-') { if ($tanka >= $max) { next; }}
		elsif ($max eq '-') { if ($tanka < $min) { next; }}
		else { if ($tanka < $min || $tanka >= $max) { next; }}
	}

	if ($FORM{'FF'} ne '') {

		$allhits = $FORM{'allhits'};
		if ($hit == $page) { last; }
		else { push(@NEW,$data2); $hit++; }
	}
	else {
		if ($allhits % $page == 0) { push(@Index,$num); }
		if ($hit < $page) { $hit++; push(@NEW,$data2); }
		$allhits++;

		if (defined($code{$code})) { push(@ERR,$code); }
		else { $code{$code} = $code; }
	}
}

if ($FORM{'allhits'} eq '') { push(@Buf,"allhits=$allhits"); $FORM{'allhits'} = $allhits; }
if ($FORM{'FF'} ne '') { @Index = split(/\s/,$FORM{'IDX'}); }

if (!@NEW) { &error('検索結果','ご指定の条件では抽出されませんでした.'); }
$count_new = @NEW;

if ($backreset) { $body =~ s/<body/<body onLoad="document.Items.reset();"/i; }

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>
$center1
$body
$goods_name<p>
<table><tr><td>$msg_top1</td></tr></table><p>
EOF

if (@ERR) { print "<font color=#ff0000>Error 商品コードが重複しているデータ &gt;</font> @ERR<p>\n"; }

print <<"EOF";
<form method=POST action="search.cgi?_file=$FORM{'_file'}">
<table border=0 cellpadding=5><tr><td bgcolor=#eeedec><font color=#003333>タイトル・名前など</font> <input type=text name="strings" value="$strings_sjis" size=20>
<select name="tanka" size="1">
<option value="">価格帯を選択しない</option>
EOF

$selected{$FORM{'tanka'}} = "selected";

foreach $key (sort { $a <=> $b } keys %tanka_option) {

	$key2 = $key;
	$val2 = $tanka_option{$key};

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

	if ($key eq "-") { $i = "$val2円未満"; }
	elsif ($tanka_option{$key} eq "-") { $i = "$key2円以上"; }
	else { $i = "$key2円以上$val2円未満"; }

	$j = "$key,$tanka_option{$key}";
	print "<option value=\"$key,$tanka_option{$key}\" $selected{$j}>$i</option>\n";
}

print <<"EOF";
</select>
<input type=submit value="検索する"><input type=reset value="書き直す"></td></tr></table>
</form>
<p>
検索結果 $FORM{'allhits'} 件 [ 
EOF

$buf = join('&',@Buf);
$idx = join('+',@Index);

foreach (0 .. $#Index) {

	$view_page = $_ + 1;
	if ($FF == $Index[$_] || ($FORM{'FF'} eq '' && $_ == 0)) { print " <b>$view_page</b>"; $page_now = $view_page; }
	else { print " <a href=\"search.cgi?$buf&IDX=$idx&FF=$Index[$_]\">$view_page</a>"; }
}

$FROM = $page_now * $page - ($page - 1);
$LAST = $FROM + $count_new - 1;

print <<"EOF";
 ] [<A HREF="search.cgi\?_file=$FORM{'_file'}">更新</A>]<hr size=2 noshade>
ページ <b>$page_now</b> ($FROM〜$LAST)<p>
<form method=POST action="cargo.cgi" name="Items" target="down">
<input type=hidden name="_mode" value="under">
<table border=$border cellpadding=1 cellspacing=2>
<tr>
<th bgcolor=#ffac00><font color=#003333>番号</font></th>
<th bgcolor=#ffac00><font color=#003333>タイトル</font></th>
<th bgcolor=#ffac00><font color=#003333>売価</font></th>
<th bgcolor=#ffac00><font color=#003333>$rem_name</font></th>
<th bgcolor=#ffac00><font color=#003333>$rem_name2</font></th>
<th bgcolor=#ffac00><font color=#003333>$rem_name3</font></th>
<th bgcolor=#ffac00><font color=#003333>かごへ</font></th>
</tr>
EOF

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

foreach (@NEW) {

	s/\t//g;
	s/\n//g;

	if (/^#/) { next; }
	if (/^$/) { next; }

	($code,$name,$tanka,$rem,$rem2,$rem3,$url,$type) = &DecodeCSV($_);

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

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

	#URLが記入されていればリンク処理
	if ($url ne '') { $name = "<a href=\"$url\" target=\"_blank\">$name</a>"; }

	$tanka =~ s/\\//g; # 円記号を除去
	1 while $tanka =~ s/(.*\d)(\d\d\d)/$1,$2/g; #単価にカンマ挿入

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

	print <<"EOF";
	<tr>
	<td bgcolor=$bg><b>$code</b></td>
	<td bgcolor=$bg>$name</td>
	<td bgcolor=$bg align=right>$tanka</td>
	<td bgcolor=$bg>$rem</td>
	<td bgcolor=$bg>$rem2</td>
	<td bgcolor=$bg>$rem3</td>
	<td bgcolor=$bg align=right>
EOF
	#数量入力タイプによって処理
	if ($type == 1) {

		#商品コードはセミコロンで挟む形式で項目名として渡す
		print "<input type=checkbox name=\";$code;\" value=\"1\">入れる";
	}
	elsif ($type == 2) {

	#商品コードはセミコロンで挟む形式で項目名として渡す
		print "<select size=1 name=\";$code;\">\n";

		print <<"EOF";
		<option value="0" selected>0</option>
EOF
		foreach (1 .. $select_to) { print "<option value=\"$_\">$_</option>\n"; }
		print "</select>";
	}
	else {
		#商品コードはセミコロンで挟む形式で項目名として渡す
		print "<input type=text size=5 name=\";$code;\" value=\"0\">個";
	}

	print "</td></tr>\n";
}

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

print <<"EOF";
</table>
<p>
検索結果 $FORM{'allhits'} 件 [ 
EOF

$buf = join('&',@Buf);
$idx = join('+',@Index);

foreach (0 .. $#Index) {

	$view_page = $_ + 1;
	if ($FF == $Index[$_] || ($FORM{'FF'} eq '' && $_ == 0)) { print " <b>$view_page</b>"; $page_now = $view_page; }
	else { print " <a href=\"search.cgi?$buf&IDX=$idx&FF=$Index[$_]\">$view_page</a>"; }
}

$FROM = $page_now * $page - ($page - 1);
$LAST = $FROM + $count_new - 1;

print <<"EOF";
 ] [<A HREF="search.cgi\?_file=$FORM{'_file'}">更新</A>]<p>
<input type=submit value="チェックした商品を買物かごに入れます（クリックは１回だけ！）"><br><font color="#FF0000">クリックした後、しばらく時間がかかります<br>下の欄の【現在のお買物０円】の金額が変わったら<br>その横に出てくる【ご注文へ】ボタンを押してください</font><br><input type=reset value="やり直し・もう一度検討してからにします">
</form>
EOF

if ($taxps == 1) { print "※ 別途消費税がかかります."; }
elsif ($taxps == -1) { print "※ 消費税は含まれています."; }
elsif ($taxps == 0) { print "※ 消費税はいただきません."; }

print <<"EOF";
<h3><hr size=2 noshade>[<A HREF="JavaScript:history.back()">前の画面</A>]
[<a href="cargo.cgi" target="_parent">かごの中を見る/ご注文へ</a>]
[<A HREF="$end" target="_top">$end_name</A>]<hr size=2 noshade></h3>
<table><tr><td>$msg_btm1</td></tr></table><p>
$center2</body></html>
EOF

exit;

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 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 error {

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

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

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

	print <<"EOF";
	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
	<HTML>
	<HEAD>
	<TITLE>ERROR</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>
EOF

	print "<ul>\n";
	foreach $i (1 .. $#msg) { print "<li>$msg[$i]\n"; }
	print "</ul>\n";

	print <<"EOF";
	<h3>[<A HREF="JavaScript:history.back()">戻る</A>]</h3>
	$center2</body></html>
EOF
	exit;
}
