#!/usr/bin/perl
require 'cgi-lib0303.pl';
require 'jcode.pl';
require 'sub-lib.pl';
#use Pg;
$|=1;

#===========================================================#
#	hotcake03.pl	商品一覧(サムネイル画像)表示(パッケージ版)
#	
#	2000/01/23 	By T.Murakami 初版
#	2000/02/19	By T.Murakami &GetViewCountルーチン追加(Shop.iniからサムネイル表示件数を取得する)
#	2000/05/12	By T.Murakami &SetTableItem()関数変更 バリエーションが無い商品もプルダウンに表示する 
#	2000/07/18	By T.Murakami HotcakeVer2(PostgreSQL)対応
#	2000/08/16	By T.Murakami サムネイルのPriority順表示対応
#	2001/01/20	By T.Murakami カート画面へのリンク対応
#
#===========================================================#

# サムネイル画像をクリックして詳細画面にリンクさせるかの設定
# 0:リンクさせない
# 1:リンクさせる
$LinkControl = 0;

#===========================================================#
# メイン処理
#===========================================================#
	
	# メンテナンスフラグチェック
	&CheckMaintenanceFlg();
	
	# データベースへ接続
	&DBConnect();

	# 2003/02/24 Cookieオン／オフチェック
	&WriteCookie();

	# ブラウザから入力されたデータ取得
	&ReadData();

	# Shop.iniからサムネイルの表示件数取得
	&GetViewCount();
	# Shop.iniから在庫管理フラグを取得
	&GetZaikoInfo();

	# ジャンルＨＴＭＬ表示
	&DisplayHTML();

#===========================================================#
# メイン終了
#===========================================================#


# サブルーチン
#-----------------------------------------------------------
# ブラウザから入力されたデータを取得サブルーチン
#
sub ReadData
{
	# データ読込み
	# 引数を&で分割
	@Recode = split( /&/,$ENV{'QUERY_STRING'} );	# ; で分割

	foreach $TMP1 ( @Recode ) {
		$TMP1 =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
		# １レコードづつ処理を行う
		( $Item, $Value ) = split( /=/,$TMP1 );		# & で項目を分割
		$ReadData{$Item} = $Value;
	}

	$CategoryName = $ReadData{'Category'};		# 大分類
	$GenreName = $ReadData{'Genre'};			# 小分類
	$ViewCnt = $ReadData{'ViewCnt'};			# 商品一覧表示件数
	
	$CategoryName_euc = $CategoryName;
	$GenreName_euc = $GenreName;
	&jcode::convert( *CategoryName_euc, 'euc' );
	&jcode::convert( *GenreName_euc, 'euc' );
}

#-----------------------------------------------------------
# Shop.iniからサムネイル表示件数を取得
#
sub GetViewCount
{
	&FileOpenShopINI();
	$ReadSection = "SendMail Section";
	@ShopINI = ();					# @ShopINI の初期化
	&ReadShopINI();

	foreach $TMP1 ( @ShopINI ) {				# hotcake.iniの情報を
		# １レコードづつ処理を行う
		( $Item, $Value ) = split( /=/,$TMP1 );	#  = で分割する
		
		if ( $Item eq "Count" ){
			$MaxViewCnt = $Value;	# サムネイル表示件数設定
			last;
		}
	}
}


#-----------------------------------------------------------
# Shop.iniから在庫管理フラグを取得
#
sub GetZaikoInfo
{
	&FileOpenShopINI();
	$ReadSection = "Zaiko Section";
	@ShopINI = ();					# @ShopINI の初期化
	&ReadShopINI();

	foreach $TMP1 ( @ShopINI ) {				# hotcake.iniの情報を
		# １レコードづつ処理を行う
		( $Item, $Value ) = split( /=/,$TMP1 );	#  = で分割する
		if ( $Item eq "Zaiko" ){
			$ZaikoKanriFlg = $Value;	# 在庫管理フラグ 0:在庫管理を行わない 1:在庫管理を行う
			last;
		}
	}
}


#-----------------------------------------------------------
# ジャンルＨＴＭＬ表示サブルーチン
#
sub DisplayHTML
{
	# MIMEヘッダー出力
	print &PrintHeader;

	# ファイルオープン
	&FielExistCheck();

	# 表示件数を求める
	$RegistMaxCount = 0;		# 初期化
	$RegistMaxCount = &GetRegistCount();		# 登録件数を求める

	# 登録データ表示(前の20件/次の20件)コントロールに使用する変数
	$NextViewCnt = $ViewCnt + 1;
	$BackViewCnt = $ViewCnt - 1;

	$EndCnt = $MaxViewCnt * $ViewCnt;  		# 表示件数 End
	$StartCnt = $EndCnt - $MaxViewCnt;		# 表示件数 Start

	# 最終表示件数を求める
	$NextCnt = $EndCnt + $MaxViewCnt;
	$WkNextCnt = $MaxViewCnt;
	if ( $RegistMaxCount < $NextCnt ) {

		$WkNextCnt = $RegistMaxCount - $EndCnt;
	}

	# 表示コントロール設定
	&SetViewControl();

    open ListHTML, "<$ListHTML";			# 商品一覧(サムネイル)ＨＴＭＬオープン
	while ( <ListHTML> ) {
		&jcode::convert( *_, 'sjis' );

		# 大分類 表示
		if (/#CategoryName#/) {
			s/#CategoryName#/$CategoryName/g;
		}
		# 小分類 表示
		if (/#GenreName#/) {
			s/#GenreName#/$GenreName/;
		}
		# エンコード済大分類名 表示
		if (/#CategoryName-Enc#/) {
			my $EncCategoryName = &url_encode($CategoryName);
			s/#CategoryName-Enc#/$EncCategoryName/g;
		}
		# 登録件数を表示
		if ( /#EntryCount#/ ) {
			s/#EntryCount#/$RegistMaxCount/;
		}
		# 表示コントロール
		if ( /#ViewControl#/ ) {
			s/#ViewControl#/$SetBack $View $SetNext/;
		}
		# 商品テーブル内容表示
		if ( /#TableDetail#/ ) {
			s/#TableDetail#//;
			# 商品情報をセット/表示する
			&SetTableItem();
		}

		print $_;
	}
	close ListHTML;							# ジャンルＨＴＭＬクローズ

}

#-----------------------------------------------------------
# ジャンルＨＴＭＬ表示サブルーチン
#
sub FielExistCheck
{
	# ジャンルＨＴＭＬ存在チェック
	if( !(-e $ListHTML) ){
		&CgiDie( "\$ListHTML not found. ");
	}
}

#-----------------------------------------------------------
# 登録件数取得サブルーチン
#
sub GetRegistCount
{
	$RegistCount = 0;
	
	# SQL文発行
	$strSQL_Sel = "select shohinname from hanyo_tbl where bunrui1 = '$CategoryName_euc' and bunrui2 = '$GenreName_euc' order by priority,shohinname";

	my $sth = $conn->prepare("$strSQL_Sel");
	$sth->execute();

=pod
	$result = $conn->exec("$strSQL_Sel");
	$tmpCount = $result->ntuples;
=cut

	$ID = "";
	$RegistCount = 0;
	while ( @row = $sth->fetchrow_array ) {
#	for($i=0;$i<$tmpCount;$i++){
#		$db_ID = $result->getvalue($i,0);
		$db_ID = $row[0];
		if ( $db_ID ne $ID ) {
			$ID = $db_ID;
			$RegistCount++;
		}
	}

	return $RegistCount;
}


#-----------------------------------------------------------
# ジャンルＨＴＭＬ表示サブルーチン
#
sub SetTableItem
{
	$ID = "";
	$Cnt = 0;
	# テーブルから情報取得
##	$strSQL_Sel = "select distinct han.*, cat.* from hanyo_tbl as han, catchcopy_tbl as cat where han.bunrui1 = '$CategoryName_euc' and han.bunrui2 = '$GenreName_euc' and han.shohinname = cat.shohinname order by han.priority desc, han.shohinname, han.hanyoid desc";
	$strSQL_Sel = "select distinct han.*, cat.* from hanyo_tbl han, catchcopy_tbl cat where han.bunrui1 = '$CategoryName_euc' and han.bunrui2 = '$GenreName_euc' and han.shohinname = cat.shohinname order by han.priority desc, han.shohinname, han.hanyoid desc";


	my $sth = $conn->prepare("$strSQL_Sel");
	$sth->execute();


=pod
	$result = $conn->exec("$strSQL_Sel");
	$tmpCount = $result->ntuples;
=cut

	$ID = "";
	$RegistCount = 0;
	while ( @row = $sth->fetchrow_array ) {
#	for($i=0;$i<$tmpCount;$i++){
=pod
		$db_ID = $result->getvalue($i,0);		# 商品名
		$db_Stock = $result->getvalue($i,2);	# 在庫数
		$db_Kakaku = $result->getvalue($i,3);	# 価格
		$db_Vari1 = $result->getvalue($i,4);	# バリエーション１
		$db_Vari2 = $result->getvalue($i,5);	# バリエーション２
		$db_Gif = $result->getvalue($i,10);		# Gifファイル名
		$db_GifPath = $result->getvalue($i,11);	# Gifファイルパス
		$db_HanyoID = $result->getvalue($i,14);	# 汎用ID
		$db_Priority = $result->getvalue($i,15);	# 優先度
		$db_Catcopy = $result->getvalue($i,17);	# キャッチコピー
=cut
		$db_ID = $row[0];		# 商品名
		$db_Stock = $row[2];	# 在庫数
		$db_Kakaku = $row[3];	# 価格
		$db_Vari1 = $row[4];	# バリエーション１
		$db_Vari2 = $row[5];	# バリエーション２
		$db_Gif = $row[10];	    # Gifファイル名
		$db_GifPath = $row[11];	# Gifファイルパス
		$db_HanyoID = $row[14];	# 汎用ID
		$db_Priority = $row[15];	# 優先度
		$db_Catcopy = $row[17];	# キャッチコピー
		

		$db_ID_euc = $db_ID;
		&jcode::convert( *db_ID, 'sjis' );
		&jcode::convert( *db_Stock, 'sjis' );
		&jcode::convert( *db_Kakaku, 'sjis' );
		&jcode::convert( *db_Vari1, 'sjis' );
		&jcode::convert( *db_Vari2, 'sjis' );
		&jcode::convert( *db_Gif, 'sjis' );
		&jcode::convert( *db_GifPath, 'sjis' );
		&jcode::convert( *db_HanyoID, 'sjis' );
		&jcode::convert( *db_Catcopy, 'sjis' );
		

		# 重複(バリエーションがある場合)する商品名から最初の１件を表示------------------
		if ( $ID ne $db_ID ) {

			# 商品テーブル表示
			$Cnt++;
			if ( $Cnt > $EndCnt ) {
				$_ = "";
				last;
			}

			# $NextViewCntの件数だけ表示する
			if ( $StartCnt < $Cnt and $Cnt <= $EndCnt ) {

				# サムネイルのパス
				$SamuneilPath = sprintf("%s%s",$db_GifPath, $db_Gif);
				if ( !(-e $SamuneilPath) || $db_Gif eq "" ) {			# サムネイル画像が無い場合Default画像設定
					$SamuneilPath = "$DefaultIMGS";
				}
				$SamuneilPath = "../seihininfo/image-s/$db_Gif";
				# キャッチコピー取得
				@CatchCopyStr = split( /,/,$db_Catcopy ); # , で分割
				# 製品名取得
				$SeihinName = $db_ID;
				# 商品名、キャッチコピー、サムネイル表示
				&PrintTableDetail1();
				# 詳細ボタン表示
				&PrintTableDetail2();
			}
		}
		$ID = $db_ID;
	}
}

#-----------------------------------------------------------
# 商品名、キャッチコピー、サムネイル表示
#
sub PrintTableDetail1
{
	print "<form  method=\"post\" action=\"./hotcake04.pl\">","\n";
	print "<TR>","\n";
	print "<TD vAlign=top width=110>\n";
	# サムネイルから詳細へリンクさせない
	if( $LinkControl == 0 ){
		print "<IMG src=\"$SamuneilPath\" border=0>\n";
		
	}
	# サムネイルから詳細へリンクさせる
	if( $LinkControl == 1 ){
		print "<input type=\"image\" border=0 src=\"$SamuneilPath\">\n"; 
	}
	print "</TD>\n";
	
	print "<TD vAlign=top width=420><B><a href=\"./hotcake04.pl?SeihinName=" . &url_encode($SeihinName) . "\">$SeihinName</a></B><BR>","\n";
	print "<FONT size=-1>","\n";

	# キャッチコピー表示
	foreach $Str ( @CatchCopyStr ) {
		print "$Str";
	}
	print "</FONT><BR>","\n";
	print "<SELECT name=\"HanyoID\">","\n";
	# バリエーション設定

	&GetVariation();

	# バリエーションのプルダウン設定終了
	print "</OPTION></SELECT>","\n";

}

#-----------------------------------------------------------
# バリエーションプルダウン表示
#
sub PrintTableDetail2
{
#	カート画面への対応のため詳細ボタンは削除
#	print "<input type=\"submit\" value=\"詳細\">","\n";
	print "<input type=\"text\" name=\"Kosuu\" size=\"5\"><input type=\"submit\" name=\"GotoCart\" value=\"カートに入れる\"><input type=\"submit\" name=\"ItemDetail\" value=\"詳細を見る\">\n";
	print "</TD>","\n";
	print "</TR>","\n";
	print "<TR>","\n";
	print "<TD colSpan=2 vAlign=top>","\n";
	print "<HR>","\n";
	print "</TD></TR>","\n";

	# 商品情報をセット/表示する
	&SetHiddenItem();
	
	print "</form>","\n";
}

#-----------------------------------------------------------
# 表示コントロール設定サブルーチン
#
sub SetViewControl
{
	# 前の10点
	if ( 1 < $ViewCnt ) {
		$href = "hotcake03.pl?Category=" . &url_encode($CategoryName) . "&Genre=" . &url_encode($GenreName) . "&ViewCnt=$BackViewCnt";
		$SetBack =  "<a href=\"$href\">前の$MaxViewCnt点</a>";
	}

	# 11-20 ( 表示件数 Form To )
	$Tmp_StartCnt = $StartCnt +1 ;
	$Tmp_EndCnt = $EndCnt;
	if ( $RegistMaxCount < $EndCnt ) {
		$Tmp_EndCnt = $RegistMaxCount;
	}
	$View = "$Tmp_StartCnt-$Tmp_EndCnt";

	# 次の10点
	if ( $RegistMaxCount > $EndCnt ) {
		$href = "hotcake03.pl?Category=" . &url_encode($CategoryName) . "&Genre=" . &url_encode($GenreName) . "&ViewCnt=$NextViewCnt";
		$SetNext = "<a href=\"$href\">次の$WkNextCnt点</a>";
	}
}

#-----------------------------------------------------------
# バリエーション設定
#
sub GetVariation
{
	# テーブルから情報取得
$strSQL_Sel = "select variation1,variation2,kakaku,hanyoid,stock from hanyo_tbl where bunrui1 = '$CategoryName_euc' and bunrui2 = '$GenreName_euc' and shohinname = '$db_ID_euc' and priority = '$db_Priority' order by variation1,variation2";

	my $sth = $conn->prepare("$strSQL_Sel");
	$sth->execute();

=pod
	$Variation_Data = $conn->exec("$strSQL_Sel");
	$VariCount = $Variation_Data->ntuples;
=cut

	$j=0;
	while ( @row = $sth->fetchrow_array ) {

#	for($j=0;$j<$VariCount;$j++){
=pod
		$db_Vari1 = $Variation_Data->getvalue($j,0);	# バリエーション１
		$db_Vari2 = $Variation_Data->getvalue($j,1);	# バリエーション２
		$db_Kakaku = $Variation_Data->getvalue($j,2);	# 価格
		$db_HanyoID = $Variation_Data->getvalue($j,3);	# 汎用ID
		$db_Stock = $Variation_Data->getvalue($j,4);	# 在庫数
=cut

		$db_Vari1 = $row[0];	# バリエーション１
		$db_Vari2 = $row[1];	# バリエーション２
		$db_Kakaku = $row[2];	# 価格
		$db_HanyoID = $row[3];# 汎用ID
		$db_Stock = $row[4];  # 在庫数

		&jcode::convert( *db_Vari1, 'sjis' );
		&jcode::convert( *db_Vari2, 'sjis' );
		&jcode::convert( *db_Kakaku, 'sjis' );
		&jcode::convert( *db_Stock, 'sjis' );
		# 金額(桁区切り)
		$db_Kakaku = reverse(join(",",(reverse($db_Kakaku) =~ /(\d{1,3})/g)));


		# プルダウンに表示するバリエーション内容設定
		if( $db_Vari1 ne "" and $db_Vari2 ne "" ){
			$PullDownOption = "$db_Vari1：$db_Vari2：\\$db_Kakaku";
		}else{
			if( $db_Vari1 ne "" ){
				$PullDownOption = "$db_Vari1：\\$db_Kakaku";
			}
			if( $db_Vari2 ne "" ){
				$PullDownOption = "$db_Vari2：\\$db_Kakaku";
			}
			if( $db_Vari1 eq "" and $db_Vari2 eq "" ){
				$PullDownOption = "\\$db_Kakaku";
			}
		}
		# 在庫管理を行う かつ 在庫が0個未満の場合は【SOLD OUT】表示する
		if( $ZaikoKanriFlg == 1 and $db_Stock <= 0 ){
			$PullDownOption .= " 【SOLD OUT】";
		}
		# バリエーション表示
		if( $j == 0 ){
			print "<OPTION selected value=\"$db_HanyoID\">$PullDownOption\n";
		}else{
			print "<OPTION value=\"$db_HanyoID\">$PullDownOption\n";
		}
	$j++;
	}
}

#-----------------------------------------------------------
# HiddenItem設定
#
sub SetHiddenItem
{
	print "<input type=hidden name=Stock value=\"$db_Stock\">\n";				# 在庫数
	print "<input type=hidden name=CategoryName value=\"$CategoryName\">\n";	# 大分類
	print "<input type=hidden name=GenreName value=\"$GenreName\">\n";			# 小分類
	print "<input type=hidden name=ViewCnt value=\"$ViewCnt\">\n";				# ViewCount
}

__END__

