#!/usr/bin/perl
#--NetShopOwner-CGI-version:4.2.5.5--

;#
;# goods_search.cgi
;# [PC]商品検索結果画面
;# Copyright (c) 2004- Increment P Corp. All rights reserved.
;#
;# 2009/09/30 NSO4対応
;# last modified 2010/06/30 DVC3対応
;#

use strict;
use uselib;
use defnsopath_shop;
use NsoVersionPC 1.00;
use NsoPage;
use NsoSearch;
use Design::NsoPagingBar;
use Lib::SiteStatus;
use Design::NsoSearchTable;
use Lib::DbConnect;
use DB::NsoGoodsVariationDB;
use DB::NsoStockDB;
# 20100630 Y.Motai start
use DB::NsoDetailUrl;
# 20100630 Y.Motai end


&ReadParse();
my %in    = %main::in;
my %incfn = %main::incfn;
my %inct  = %main::inct;

# インスタンス定義
my $objConfigSystem = Config::NsoSystem->newShop();
my $objConfigMaster = Config::NsoMaster->new();

# コンフィグレーションのキャッシュ
my %ConfigSystem = $objConfigSystem->cache_config();
my %ConfigMaster = $objConfigMaster->cache_config();

my $NsoMisc         = NsoMisc->new();
my $NsoPage        = NsoPage->new();
my $NsoSearch      = NsoSearch->new();
# 20100630 Y.Motai start
my $DetailUrl       = NsoDetailUrl->new({ ConfigSystem=>\%ConfigSystem, ConfigMaster=>\%ConfigMaster});
# 20100630 Y.Motai end

my $DbConnect = Lib::DbConnect->new({ ConfigSystem=>\%ConfigSystem, ConfigMaster=>\%ConfigMaster});

my $GoodsVariationDB = NsoGoodsVariationDB->new({ ConfigSystem=>\%ConfigSystem, ConfigMaster=>\%ConfigMaster});
my $NsoStockDB       = NsoStockDB->new({ ConfigSystem=>\%ConfigSystem, ConfigMaster=>\%ConfigMaster });

my $status_err;
my $category_name;

FUNC:{
	my $func = $in{func} || 'main';
	my %function = (
		main       => \&main,
	);
	
	&check_closing();
	
	if ($function{$func}){
		$function{$func}->();
	}else{
		&main();
	}
}
exit();

;#
;# 開店・閉店状態検査
;#
sub check_closing {
	my $SiteStatus = Lib::SiteStatus->new({ ConfigSystem=>\%ConfigSystem });
	$SiteStatus->CheckClosing({ IgnoreFlag=>1 });
}

;#
;# メイン処理
;#
sub main {
	# 商品DB取得
	my %GdsDB = &get_goods_db();
	
	# テンプレート置換
	&replace_tmpl(\%GdsDB);
	
}

;# 商品DBリファレンス取得
;#
sub get_goods_db {
	# カテゴリID
	my $CategoryID = $in{CategoryID};

	# キーワード解析
	my %HashKeyword  = $NsoSearch->analyze_keyword($in{Keyword}, 'sjis');
	my %HashPriceMin = $NsoSearch->analyze_keyword($in{PriceMin}, 'sjis');
	my %HashPriceMax = $NsoSearch->analyze_keyword($in{PriceMax}, 'sjis');
	
	my @Keywords = @{$HashKeyword{keywords}};
	my $PriceMin = $in{PriceMin};
	my $PriceMax = $in{PriceMax};

	if ( $PriceMin =~ m/[^0-9０１２３４５６７８９]/ig || $PriceMax =~ m/[^0-9０１２３４５６７８９]/g){
		$status_err = $status_err . "<br>" . "価格設定に不正がありました。" if($status_err ne "");
		$status_err = "価格設定に不正がありました。" if($status_err eq "");
		$PriceMin = "";
		$PriceMax = "";
	}
	# 全角数字を半角数字に直す
	$PriceMin = $NsoMisc->e_zenshan($PriceMin);
	$PriceMax = $NsoMisc->e_zenshan($PriceMax);
	
	# キーワード個数
	my $Keycnt = @Keywords;
	if ( ($ConfigSystem{SearchList}{pc}{KeyCount}) and $ConfigSystem{SearchList}{pc}{KeyCount} < $Keycnt ) {
		$status_err = $status_err . "<br>" . "キーワード数が多すぎます。" if($status_err ne "");
		$status_err = $status_err . "キーワード数が多すぎます。" if($status_err eq "");
		return ( RecordCount => 0 );
		return;
	}
	
	# 価格設定、キーワードが全ての未入力の場合には検索結果0件とする
	if ( $PriceMin eq "" && $PriceMax eq "" && $Keycnt eq 0){
		return ( RecordCount => 0 );
	}

	# DB接続
	my $connectError = $DbConnect->DbConnect();
	if ( $connectError ne "" ){
		$status_err = $status_err . "<br>" . $connectError if($status_err ne "");
		$status_err = $status_err . $connectError if($status_err eq "");
		return ( RecordCount => 0 );
	}

	# キーワードのエスケープ＆成形
	my $i = 0; 
	foreach my $str (@Keywords){
		# キーワード解析時にすでにsjisにデコードされているので、sjis→eucデコード
		$str = $NsoMisc->j_decode_sjis2euc($str);
		# \が入力された場合、エスケープ(\\)する
		$str =~ s/\\/\\\\/g;
		# すでにeucにデコードされているので、デコードなしエスケープ
		$str = $DbConnect->Sql_Escape_non_decode($str);
		# LIKE句のワイルドカードをエスケープ
		$str =~ s/\%/\\\%/g;
		$str =~ s/\_/\\\_/g;
		# LIKE句で使用するため前後にワイルドカード付加
		$str =~ s/^'/'%/g;
		$str =~ s/'$/%'/g;
		$Keywords[$i] = $str;
		$i++;
	}
	
	# クエリ作成
	my $SQL_query = $NsoSearch->make_searchQuery({ keywords=>\@Keywords, priceMin=>$PriceMin, priceMax=>$PriceMax, target=>0} );

	# クエリ発行
	my %db = $DbConnect->DbSelect($SQL_query);
	
	# SQL 結果取得
	my $RecordList = %db->{RecordList};
	my $queryError = %db->{status_err};
	if ( $queryError ne "" ){
		$status_err = $status_err . "<br>" . $queryError if($status_err ne "");
		$status_err = $status_err . $queryError if($status_err eq "");
		return ( RecordCount => 0 );
	}
	my $RecordCount = scalar @$RecordList;

	my $StartLine   = 0;
	my $EndLine     = $RecordCount;

	return (
		RecordList  => $RecordList,
		RecordCount => $RecordCount,
	);
}

;#
;# ページング情報取得
;#
sub get_paging_info {
	my ($db) = @_;
	my $RecordCount = $db->{RecordCount};
	
	my $CategoryID = $in{CategoryID};
	my $pn = ($in{pn} eq "" ? 0 : $in{pn});
	my $sl = $ConfigSystem{SearchList}{pc}{SplitLine} || 20;
	my %query_hash = (
		Keyword    => $NsoMisc->html_encode($in{Keyword}),
		PriceMin   => $NsoMisc->html_encode($in{PriceMin}),
		PriceMax   => $NsoMisc->html_encode($in{PriceMax}),
	);
	
	# 検索CGIのURL
	my $GoodsSearchURL = $ConfigSystem{base_href}{cgishop}.$ConfigSystem{shop_script_name}{goods_search};
	# SSL状況に応じてURLを置換する
	$GoodsSearchURL = $NsoMisc->getChangedURL({url=>$GoodsSearchURL, key=>'OtherCgi'});
	
	my %paging_args = (
		sum    => $RecordCount,
		pn     => $pn,
		sl     => $sl,
		action => $GoodsSearchURL,
		method => "get",
		query  => \%query_hash,
	);
	return $NsoPage->make_page_button(\%paging_args);
}

;#
;# ページングバー取得
;#
sub get_paging_bar {
	my ($db) = @_;
	my %paging = &get_paging_info($db);
	
	my $NsoPagingBar = Design::NsoPagingBar->new({ ConfigSystem=>\%ConfigSystem });
	return (
		PagingBarUpper => $NsoPagingBar->GetPagingBar({ paging=>\%paging, key=>'GoodsSearch', kind=>'PagingBarUpper' }),
		PagingBarLower => $NsoPagingBar->GetPagingBar({ paging=>\%paging, key=>'GoodsSearch', kind=>'PagingBarLower' }),
	);
}

;#
;# テンプレート置換処理
;#
sub replace_tmpl {
	my ($db) = @_;
	my %paging = &get_paging_bar($db);
	my $RecordList  = $db->{RecordList};
	my $RecordCount = $db->{RecordCount};
	my $pn = ($in{pn} eq "" ? 0 : $in{pn});
	my $sl = $ConfigSystem{SearchList}{pc}{SplitLine} || 20;

	my $NsoSearchTable = Design::NsoSearchTable->new({ ConfigSystem=>\%ConfigSystem, ConfigMaster=>\%ConfigMaster});

	my $system_templ_dir   = $main::nsoDB_path ."/";
	my $system_templ_kind  = "templ";
	my $system_templ_head  = "goods_search_head.htmp";
	my $system_templ_body1 = "goods_search_body1.htmp";
	my $system_templ_body2 = "goods_search_body2.htmp";
	my $system_templ_foot  = "goods_search_foot.htmp";
	
	my $contents_head;
	my $contents_body1;
	my $contents_body2;
	my $contents_foot;
	my %htmls = ();
	
	$htmls{status_err} = "検索結果はありません " if ( $RecordCount == 0 );
	$htmls{status_err} = $status_err if ( $status_err ne "" );
	
	# システムテンプレート(ヘッタ部)置換
	TemplHead:{
		# テンプレート置換
		my $NsoTempl = NsoTempl->new({ DataDir=>$system_templ_dir, DirKind=>$system_templ_kind, Data=>$system_templ_head });
		my %Text = ();
		# 検索内容の画面への設定
		$Text{Keyword} = $in{Keyword};
		$Text{PriceMin} = $in{PriceMin};
		$Text{PriceMax} = $in{PriceMax};
		my %replace_templ = ( 
				htmls  => \%htmls ,
				Text   => \%Text
				);
		$contents_head = $NsoTempl->replace_templ(\%replace_templ);
	};

	# システムテンプレート(フッタ部)置換
	TemplFoot:{
		# テンプレート置換
		my $NsoTempl = NsoTempl->new({ DataDir=>$system_templ_dir, DirKind=>$system_templ_kind, Data=>$system_templ_foot });
		my %replace_templ = ( paging => \%paging );
		$contents_foot = $NsoTempl->replace_templ(\%replace_templ);
	};
	
	# 該当商品がない場合はヘッダ、フッタのみ出力し終了
	if ( $RecordCount == 0 ) {
		print $NsoMisc->print_header();
		print $contents_head.$contents_foot;
		return;
	}
	
	# システムテンプレート(ボディ部1)置換
	TemplBody1:{
		# テンプレート置換
		my $NsoTempl = NsoTempl->new({ DataDir=>$system_templ_dir, DirKind=>$system_templ_kind, Data=>$system_templ_body1 });
		my %replace_templ = ();
		$contents_body1 = $NsoTempl->replace_templ(\%replace_templ);
	};

	# システムテンプレート(ボディ部2)置換
	TemplBody2:{
		my $i = -1;
		foreach my $Record (@{$RecordList}){
			$i++;
			# 開始位置まで飛ばす
			next if ( $i < $pn * $sl);
			
			# 終了位置
			last if ( $i > ($pn * $sl) + $sl - 1 );

			my $cnt = 0;
			my %RecordHash = (
				ArticleID             => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 01 商品ID
				ArticleNo             => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 02 商品番号
				ArticleName           => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 03 商品名
				ArticleNameMobile     => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 04 携帯用商品名
				ProductTypeName       => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 05 任意属性名
				ProductName           => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 06 任意属性値
				LabeledPriceName      => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 07 任意定価属性名
				LabeledPrice          => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 08 定価
				ExTaxPrice            => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 09 税別価格
				InTaxPrice            => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 10 税込価格
				SalePriceName         => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 11 任意売価属性名
				CarriageType          => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 12 送料区分
				DeliveryTypeID        => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 13 配送タイプ
				ShareRate             => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 14 重み付け
				MaxOrderCount         => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 15 1度の注文で購入できる数
				ShowAdditionalIcon1   => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 16 アイコン表示フラグ1
				ShowAdditionalIcon2   => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 17 アイコン表示フラグ2
				ShowAdditionalIcon3   => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 18 アイコン表示フラグ3
				ShowAdditionalIcon4   => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 19 アイコン表示フラグ4
				VariationTypeName1    => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 20 バリエーション1項目名
				VariationAvable1      => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 21 バリエーション1選択必須フラグ
				VariationTypeName2    => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 22 バリエーション2項目名
				VariationAvable2      => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 23 バリエーション2選択必須フラグ
				VariationTypeName3    => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 24 バリエーション3項目名
				VariationAvable3      => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 25 バリエーション3選択必須フラグ
				VariationTypeName4    => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 26 バリエーション4項目名
				VariationAvable4      => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 27 バリエーション4選択必須フラグ
				KeywordAndDescription => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 28 検索用キーワードと紹介文
				Show_PC               => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 29 表示設定（PC)
				Show_Mobile           => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 30 表示設定（携帯)
				Point                 => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 31 商品個別ポイント
				SearchShow            => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 32 商品検索対象
				StockType             => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 33 在庫管理タイプ
				ExplanationMobile     => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 34 携帯用説明文
				ArticleCategoryID     => $NsoMisc->j_decode_euc2sjis($$Record[$cnt++]),  # 35 カテゴリID
				);

			# 在庫数を取得、レコードに追加
			my $stock = $NsoStockDB->GetStockQuerySum($RecordHash{ArticleID});
			if($stock eq ""){
				# 在庫数無制限は-1を指定
				$RecordHash{StockSum} = -1;
			} else {
				$RecordHash{StockSum} = $stock;
			}

			# バリエーションが設定されている商品の場合、ArticleVariationテーブル情報を取得
			if ($RecordHash{VariationTypeName1} ne "" ||
			    $RecordHash{VariationTypeName2} ne "" ||
			    $RecordHash{VariationTypeName3} ne "" ||
			    $RecordHash{VariationTypeName4} ne ""){

				my %resultArticleVariation = $GoodsVariationDB->GetArticleVariationAll($RecordHash{ArticleID});
				my %resultArticleVariationHash = (
					RecordList  => $resultArticleVariation{RecordList},
					RecordCount => $resultArticleVariation{RecordCount},
					status_err  => $resultArticleVariation{status_err},
				);

				# DBエラー時
				if ($resultArticleVariationHash{status_err} ne ""){
					# DBエラー設定
					$htmls{status_err} = $resultArticleVariationHash{status_err};

					# ヘッダ再作成
					# テンプレート置換
					my $NsoTempl = NsoTempl->new({ DataDir=>$system_templ_dir, DirKind=>$system_templ_kind, Data=>$system_templ_head });
					my %Text = ();
					# 検索内容の画面への設定
					$Text{Keyword} = $in{Keyword};
					$Text{PriceMin} = $in{PriceMin};
					$Text{PriceMax} = $in{PriceMax};
					my %replace_templ = ( 
							htmls  => \%htmls ,
							Text   => \%Text
							);
					$contents_head = $NsoTempl->replace_templ(\%replace_templ);
					
					# ヘッダ、フッタを出力してエラー終了
					print $NsoMisc->print_header();
					print $contents_head.$contents_foot;
					return;
				}

				# レコードハッシュにこの商品のバリエーション配列を追加
				$RecordHash{VariationArray} = $resultArticleVariationHash{RecordList};
			}

			# 20100706 Y.Motai start
			# 検索対象となった商品のIDからURLデータハッシュを取得する
			my %UrlData = $DetailUrl->make_GetUrlQuery({ ArticleID => $RecordHash{ArticleID} });

			my %resultUrlDataHash = (
				RecordList  => $UrlData{RecordList},
				RecordCount => $UrlData{RecordCount},
				status_err  => $UrlData{status_err},
			);

			# DBエラー時
			if ($resultUrlDataHash{status_err} ne ""){
				# DBエラー設定
				$htmls{status_err} = $resultUrlDataHash{status_err};
			}
			# 20100706 Y.Motai end

			my %InfoHash = $NsoSearchTable->GetInfoByGoods(\%RecordHash);
			my %Tag  = %{$InfoHash{Tag}};
			my %Text = %{$InfoHash{Text}};

			# 20100712 Y.Motai start
			# 商品詳細ページ用URLを置換対象に追加
			$Text{URL}    = $resultUrlDataHash{RecordList};
			# 20100712 Y.Motai end

			# テンプレート置換
			my $NsoTempl = NsoTempl->new({ DataDir=>$system_templ_dir, DirKind=>$system_templ_kind, Data=>$system_templ_body2 });
			my %replace_templ = (
				Tag  => \%Tag,
				Text => \%Text,
			);
			
			# 20100701 Y.motai start
			# URL設定の有無によってTag処理を行うため結合前に別変数に取得
			my $contents_body2_sub = $NsoTempl->replace_templ(\%replace_templ);
			
			# URLが存在しているならTagのみ削除、URLが存在していないならTagの中身をTagを含めて削除
			if ( $resultUrlDataHash{RecordList} eq "" ) {
				$contents_body2_sub =~ s/<!--\$\$Tag{ImageUrl_Front_Start}\$\$-->.*<!--\$\$Tag{ImageUrl_Front_End}\$\$-->//s;
				$contents_body2_sub =~ s/<!--\$\$Tag{ImageUrl_Back_Start}\$\$-->.*<!--\$\$Tag{ImageUrl_Back_End}\$\$-->//s;
				$contents_body2_sub =~ s/<!--\$\$Tag{NameUrl_Front_Start}\$\$-->.*<!--\$\$Tag{NameUrl_Front_End}\$\$-->//s;
				$contents_body2_sub =~ s/<!--\$\$Tag{NameUrl_Back_Start}\$\$-->.*<!--\$\$Tag{NameUrl_Back_End}\$\$-->//s;
				$contents_body2_sub =~ s/<!--\$\$Tag{ButtonUrl_Start}\$\$-->.*<!--\$\$Tag{ButtonUrl_End}\$\$-->//s;
			} else {
				$contents_body2_sub =~ s/<!--\$\$Tag{ImageUrl_Front_Start}\$\$-->//s;
				$contents_body2_sub =~ s/<!--\$\$Tag{ImageUrl_Front_End}\$\$-->//s;
				$contents_body2_sub =~ s/<!--\$\$Tag{ImageUrl_Back_Start}\$\$-->//s;
				$contents_body2_sub =~ s/<!--\$\$Tag{ImageUrl_Back_End}\$\$-->//s;
				$contents_body2_sub =~ s/<!--\$\$Tag{NameUrl_Front_Start}\$\$-->//s;
				$contents_body2_sub =~ s/<!--\$\$Tag{NameUrl_Front_End}\$\$-->//s;
				$contents_body2_sub =~ s/<!--\$\$Tag{NameUrl_Back_Start}\$\$-->//s;
				$contents_body2_sub =~ s/<!--\$\$Tag{NameUrl_Back_End}\$\$-->//s;
				$contents_body2_sub =~ s/<!--\$\$Tag{ButtonUrl_Start}\$\$-->//s;
				$contents_body2_sub =~ s/<!--\$\$Tag{ButtonUrl_End}\$\$-->//s;
			}
			
			# 削除処理した文字列を連結
			$contents_body2 .= $contents_body2_sub;
			# $contents_body2 .= $NsoTempl->replace_templ(\%replace_templ);
			# 20100701 Y.motai end
		}
	}
	
	print $NsoMisc->print_header();	
	print $contents_head.$contents_body1.$contents_body2.$contents_foot;

}












