#!/usr/bin/perl
#
# info_list.cgi
#
# create : 2006/04/26
#############################################################################################
# --> 外部PERLの読み込み
#
#--------------------------------------------------------------------------------------------
require './ap_env.pl';
require './admin/jcode.pl';
#############################################################################################
# --> 初期値設定
#
#--------------------------------------------------------------------------------------------
my $document = "";
my $html_document = "";
my $a_ret;
my $button;
my $return = "\r\n";
#--------------------------------------------------------------------------------------------
# --- data
my @m_template_inner;
my @m_template;
my @c_d1;
my @c_d2;
my @c_d3;
my @c_d4;
my @c_d5;
my @c_d6;
my @c_d7;
my @c_d8;
my @c_d9;
my @c_d10;
my @c_d11;
my @t_d1;
my @t_d2;
my @t_d3;
my @t_d4;
my @t_d5;
my @t_d6;
my @t_d7;
my @t_d8;
my @t_d9;
my @t_d10;
my @t_d11;
my @tmp_1;
my @tmp_2;
my @tmp_6;
my @tmp_7;
my @tmp_11;
#--------------------------------------------------------------------------------------------
# --- file
my $templatefilename  = $templates_folder.'info_list.tpl';			# テンプレートファイル
#my $templatefilename2 = $templates_folder.'inner.tpl';				# テンプレートファイル
my $csvfilename = './admin/info.d';									# 項目設定ファイル
#--------------------------------------------------------------------------------------------
# --- other
$conf{'log'} = $log_folder."log";									# ログ名称
$conf{'max_log_size'} = 500 * 1024;									# ログファイルサイズ
#############################################################################################
# --> function関数
#
#--------------------------------------------------------------------------------------------
sub get_input_data
{
	my $query_string;
	my (@parts, $part, $boundary, $header, $filename);
	my (@pairs, $name, $value);


	if ($ENV{'REQUEST_METHOD'} eq "GET") {
		$query_string = $ENV{'QUERY_STRING'};
	} elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
		read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
	}

	if ($ENV{'CONTENT_TYPE'} !~ /multipart/) {

		@pairs = split("&", $query_string);
		foreach (@pairs) {
			($name, $value) = split("=", $_);
			$name =~ s/%([0-9A-Fa-f]{2})/pack("C", hex($1))/eg;
			$_[1]->{$name} = $value if ($_[1]);
			$value =~ tr/+/ /;
			$value =~ s/%([0-9A-Fa-f]{2})/pack("C", hex($1))/eg;
			$_[0]->{$name} = $value;
		}
	} else {
		$boundary = $ENV{'CONTENT_TYPE'};
		$boundary =~ s/.*boundary=//;
		@parts = split($boundary, $query_string);

		foreach $part (@parts) {
			$part =~ s/^\r\n//;
			$part =~ s/\r\n--$//;
			if ($part =~ /^Content-Disposition: form-data;/) {
				($header) = split(/\r\n\r\n/, $part);
				$value = substr($part, length($header) + 4);

				($dummy, $name, $filename) = split(/; /, $header); 

				$name =~ s/^name="(.*)"$/$1/;

				$filename =~ s/\r\n.*//;
				$filename =~ s/^filename="(.*)"$/$1/;
				$_[0]->{$name. '_filename'} = $filename if ($filename ne '');
				$_[0]->{$name} = $value;
			}
		}
	}
}

#--------------------------------------------------------------------------------------------
sub logf
{
	my	@date;
	my	$string;

	return if ($conf{'log'} eq '');

	@date = localtime();
	$string = sprintf(
		"%04d/%02d/%02d %02d:%02d:%02d [%05d] ",
		$date[5] + 1900, $date[4] + 1, $date[3],
		$date[2], $date[1], $date[0],
		$$
	);
	foreach (@_) { $string .= $_; }

	if (!open(FP_LOG, ">>$conf{'log'}")) {
		print "Error: open($conf{'log'}) - $!\n";
		return;
	}
	flock(FP_LOG, 2);
	print FP_LOG $string;
	close(FP_LOG);

	if ($conf{'max_log_size'} > 0 && ((-s $conf{'log'}) > $conf{'max_log_size'})) {
		rename(
			$conf{'log'}, 
			sprintf(
				"%s_%04d_%02d%02d_%02d%02d%02d",
				$conf{'log'},
				$date[5] + 1900, $date[4] + 1, $date[3],
				$date[2], $date[1], $date[0]
			)
		);
	}
}
#--------------------------------------------------------------------------------------------
sub logf_access
{
	my	$str;

	logf("----- input data ----------------------\n");
	foreach (sort(keys(%input_data))) {
		logf("$_: '$input_data{$_}'\n");
	}

}
#--------------------------------------------------------------------------------------------
sub GetDataFromCSV
{
	my @a_ref_data= @_;
	my $m_CSVFileName=$_[0];
	my @m_CSVData;
	my $m_line;
	local @m_div_data;
	my $m_cd;
	my @m_buf_line;
	my $m_tmpbuf_data;
	my $m_q_count;
	my $m_column;

	if ((-e $m_CSVFileName)) {
		if (!open(CSVDATA,"<$m_CSVFileName")){
			print "cannot open ${m_CSVFileName} file.\n";
			return 1;
		}
		@m_CSVData = <CSVDATA>;
		close(CSVDATA);
		for($m_lc=$a_ref_data[1];$m_lc<=$#m_CSVData;$m_lc++) {
			$#m_div_data=-1;
			$m_column=1;
			$m_line = $m_CSVData[$m_lc];
			@m_buf_line = split(/,/, $m_line);					# カンマ(,)で分割
			foreach $m_buf_line(@m_buf_line) {
				$m_buf_line =~ s/$return//g;
#				chomp $m_buf_line;
				$_ = $m_buf_line;
				$m_q_count = tr/\"/\"/;							# 分割内容のチェック(double quoteの数を取得)
				if ($m_duble_quote==0 && ($m_q_count%2)==1) {
					if (substr($m_buf_line,0,1) eq '"') {		# 先頭に(")がある場合、データ先頭
						$m_duble_quote = 1;						# quotedデータ開始
						$m_buf_line = substr($m_buf_line,1);	# 先頭quote削除
					} else {
						return "${m_lc}_${m_column}";			# パターンエラー  [line]_[column]
					}
				} elsif ($m_duble_quote==1 && ($m_q_count%2) == 1){
					if (substr($m_buf_line,-1,1) eq '"') {		# 最後部に(")がある場合、最終データ
						$m_duble_quote = 0;						# quotedデータ終了
						$m_tmpbuf_data .= $m_buf_line;			# データ結合（分割されている場合ありの為）
						chop $m_tmpbuf_data;					# 最後部(")削除
						$m_tmpbuf_data =~ s/\"\"/\"/g;			# ("") -> (")
					} else {
						return "${m_lc}_${m_column}";			# パターンエラー  [line]_[column]
					}
				}
				$m_tmpbuf_data .= $m_buf_line . ',' if $m_duble_quote; # データ結合（分割されている場合ありの為）
				if ($m_double_quote==0 && $m_q_count>0 && ($m_q_count%2)==0) {
					if ((substr($m_buf_line,0,1) eq '"') && (substr($m_buf_line,-1,1) eq '"')) {
						$m_buf_line = substr($m_buf_line,1);	# 先頭quote削除
						chop $m_buf_line;						# 最後部(")削除
						$m_buf_line =~ s/\"\"/\"/g;				# ("") -> (")
					} else {
						return "${m_lc}_${m_column}";			# パターンエラー  [line]_[column]
					}
				}
				if ($m_duble_quote == 0) {
					if ($m_tmpbuf_data ne "") {
						push(@m_div_data,$m_tmpbuf_data);
						$m_tmpbuf_data = '';
						$m_column++;
					} else {
						push(@m_div_data,$m_buf_line);
						$m_column++;
					}
				}
			}
			if ($m_duble_quote != 0) {
				return "${m_lc}_${m_column}";					# パターンエラー  [line]_[column]
			}
			for ($m_cd=0; $m_cd < $a_ref_data[2]; $m_cd++) {
				&jcode::convert(\$m_div_data[$m_cd],"sjis");
				push(@{$a_ref_data[$m_cd+3]}, $m_div_data[$m_cd]);
			}
		}
	} else {
		return 1;
	}
	return 0;
}
#--------------------------------------------------------------------------------------------
sub url_encode
{
	my ($string, @chara, $len);

	for ($i = 0;; $i++) {
		last if (($chara = substr($_[0], $i, 1)) eq ''); 
		$chara =~ s/([^0-9a-zA-Z_ ])/"%". unpack("H2", $1)/ge;
		if ($chara =~ /^%[0-9a-f][0-9a-f]$/) {
			$chara =~ tr/[a-f]/[A-F]/;
		}
		$chara =~ tr/ /+/;
		$string .= $chara;
	}
	return $string;
}
#--------------------------------------------------------------------------------------------
sub html_text
{
	my	$string = shift();

	$string =~ s/&/&amp;/g;
	$string =~ s/ /&nbsp;/g;
	$string =~ s/</&lt;/g;
	$string =~ s/>/&gt;/g;
	$string =~ s/"/&quot;/g;
	$string =~ s/$return/<br>/g;

	return $string;
}
#--------------------------------------------------------------------------------------------
sub form_value
{
	my	$string = shift();

	$string =~ s/</&lt;/g;
	$string =~ s/>/&gt;/g;
	$string =~ s/"/&quot;/g;

	return $string;
}
#--------------------------------------------------------------------------------------------
sub output
{
	my	$html_document = shift();

	print "Content-Length: ". length($html_document). $return;
	print "Content-Type: text/html; charset=Shift_JIS".$return;
	print $return;
	print $html_document;
	exit;
}

#############################################################################################
# --> 初期処理
#
get_input_data(\%input_data, \%input_data_raw);
#--------------------------------------------------------------------------------------------
logf("===== $ENV{'SCRIPT_NAME'} ========================================================\n") if ($log_write eq 'ON');
logf_access() if ($log_write eq 'ON');

#############################################################################################
# --> データファイルの読み込み
#
#--------------------------------------------------------------------------------------------
$a_ret = &GetDataFromCSV($csvfilename,0,11,\@c_d1,\@c_d2,\@c_d3,\@c_d4,\@c_d5,\@c_d6,\@c_d7,\@c_d8,\@c_d9,\@c_d10,\@c_d11);
if ($a_ret){
	$html_document = "設定エラー<br>$csvfilenameを確認してください。";
	output($html_document);
}

#############################################################################################
# --> 入力チェック
#
#--------------------------------------------------------------------------------------------


#############################################################################################
# --> フォームの作成
#
#--------------------------------------------------------------------------------------------
# --> 各モード別
logf("[ p_mode ] : $input_data{'p_mode'} \n") if ($log_write eq 'ON');
#logf("[ templatefilename2 ] : $templatefilename2 \n") if ($log_write eq 'ON');

$document="";
$data_count = 0;

# ---> 有効データの取得
$j = 0;
for ($i=0;$i<int(@c_d1);$i++){
	if ($c_d8[$i] ne '1'){
		$t_d1[$j] = $c_d1[$i];
		$t_d2[$j] = $c_d2[$i];
		$t_d3[$j] = $c_d3[$i];
		$t_d4[$j] = $c_d4[$i];
		$t_d5[$j] = $c_d5[$i];
		$t_d6[$j] = $c_d6[$i];
		$t_d7[$j] = $c_d7[$i];
		$t_d8[$j] = $c_d8[$i];
		$t_d9[$j] = $c_d9[$i];
		$t_d10[$j] = $c_d10[$i];
		$t_d11[$j] = 1 if (($c_d11[$i] eq '')||(!defined(@category)));
		$t_d11[$j] = $c_d11[$i] if (($c_d11[$i] ne '')&&(defined(@category)));
		$j++;
		$data_count++;
	}
}

# ---> sort処理
$c=0;
if (defined(@category)){
	for ($j=0;$j<int(@category);$j++){
		for ($i=0;$i<int(@t_d1);$i++){
			if (($j+1) == int($t_d11[$i])){
				$tmp_1[$c] = $t_d1[$i];
				$tmp_2[$c] = $t_d2[$i];
				$tmp_6[$c] = $t_d6[$i];
				$tmp_7[$c] = $t_d7[$i];
				$tmp_11[$c] = $t_d11[$i];
				$c++;
			}
		}
	}
}else{
	for ($i=0;$i<int(@t_d1);$i++){
		$tmp_1[$c] = $t_d1[$i];
		$tmp_2[$c] = $t_d2[$i];
		$tmp_6[$c] = $t_d6[$i];
		$tmp_7[$c] = $t_d7[$i];
		$tmp_11[$c] = $t_d11[$i];
		$c++;
	}
}
# ---> 改ページ
$input_data{'ct'} = 1 if ($input_data{'ct'} eq '');

#logf("[ start page no ] : $start_pg \n") if ($log_write eq 'ON');
#logf("[  end  page no ] : $end_pg \n")   if ($log_write eq 'ON');

if ($list_page_change){
	$button  = "";
	$button .= "<a href=\"info_list.cgi?ct=".($input_data{'ct'}-1)."\">".$page_back."</a>&nbsp;" if ($input_data{'ct'} ne '1');
	$button .= "<a href=\"info_list.cgi?ct=".($input_data{'ct'}+1)."\">".$page_next."</a>" if ($input_data{'ct'} < int(@category));
}

# ---> HTML生成
for ($i=0;$i<int(@t_d1);$i++){
	$t_cate = int($tmp_11[$i])-1;
	$count[$t_cate] = 1;
}
for ($i=0;$i<int(@t_d1);$i++){
	$t_cate = int($tmp_11[$i])-1;

	$image_url1 = $image_url.$tmp_6[$i];
	$image_url2 = $image_url.$tmp_7[$i];
	$image_dir1 = $image_folder2.$tmp_6[$i];
	$image_dir2 = $image_folder2.$tmp_7[$i];
	if (($tmp_6[$i] ne '')&&(-e $image_dir1)){
		$html_image1_1 = $list_html_image;
		$html_image1_1 =~ s/TPL_IMAGE/$image_url1/g;
	}else{
		$html_image1_1 = "";
	}
	if (($tmp_7[$i] ne '')&&(-e $image_dir1)){
		$html_image2_1 = $list_html_image;
		$html_image2_1 =~ s/TPL_IMAGE/$image_url2/g;
	}else{
		$html_image2_1 = "";
	}

	if ($list_page_cols > 1){
		$c_document[$t_cate].=$html_tr_start."\n" if (($count[$t_cate] % $list_page_cols) == 1);
	}else{
		$c_document[$t_cate].=$html_tr_start."\n";
	}

	$c_document[$t_cate].=$html_td_start."<a href=\"info.cgi?id=".$tmp_1[$i]."\">".$html_image1_1."</a>\n";
	$c_document[$t_cate].="</td>"."\n";
	$c_document[$t_cate].=$html_th_start."<a href=\"info.cgi?id=".$tmp_1[$i]."\">".$tmp_2[$i]."</a>\n";
	$c_document[$t_cate].="</td>"."\n";

	if ($list_page_cols > 1){
		$c_document[$t_cate].="</tr>"."\n" if (($count[$t_cate] % $list_page_cols) == 0);
	}else{
		$c_document[$t_cate].="</tr>"."\n";
	}

	$count[$t_cate]++;
}

if ($list_page_cols > 1){
	for ($i=0;$i<int(@c_document);$i++){
		if (($count[$i] % $list_page_cols) == 0){
			$c_document[$i].=$html_td_start."　\n";
			$c_document[$i].="</td>"."\n";
			$c_document[$i].=$html_th_start."　\n";
			$c_document[$i].="</td>"."\n";

			$c_document[$i].="</tr>";
		}
	}
}

for ($i=0;$i<int(@c_document);$i++){
	if ((($list_page_change)&&(($i+1) == $input_data{'ct'}))||(!$list_page_change)){
		if ($c_document[$i] ne ''){
			$document.=$html_table_start."\n";
			$document.="<caption align=left>".$category[$i]."</caption>"."\n";
			$document.=$c_document[$i]."\n";
			$document.=$html_table_end."\n";
			$document.="<br>"."\n";
		}
	}
}

#############################################################################################
# --> テンプレートファイルの読み込み
#
#--------------------------------------------------------------------------------------------
logf("[ templatefilename ] : $templatefilename \n") if ($log_write eq 'ON');
#--------------------------------------------------------------------------------------------
if ((-e $templatefilename)) {
	if (!open(TEMPLATE,"<$templatefilename")){
		$html_document = "設定エラー<br>$templatefilenameを確認してください。";
		output($html_document);
	}
	@m_template = <TEMPLATE>;
	close(TEMPLATE);
}else{
	$html_document = "設定エラー<br>$templatefilenameが存在しません。";
	output($html_document);
}

#############################################################################################
# --> メインHTMLの作成
#
#--------------------------------------------------------------------------------------------
for ($i=0; $i<$#m_template; $i++){
	$m_template[$i] =~ s/TPL_CHANGE/$document/g;
	$m_template[$i] =~ s/TPL_BUTTON/$button/g;
	$html_document.=$m_template[$i];
}

#############################################################################################
# --> フォームの吐き出し
#
#--------------------------------------------------------------------------------------------
logf("--- output -----------------------------------------\n") if ($log_write eq 'ON');
output($html_document);
logf("end.\n") if ($log_write eq 'ON');
