#!/usr/bin/perl
#
# support.cgi
#
# create : 2005/11/07
#############################################################################################
# --> 外部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;
#--------------------------------------------------------------------------------------------
# --- file
my $templatefilename  = $templates_folder.'infomation.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,10,\@c_d1,\@c_d2,\@c_d3,\@c_d4,\@c_d5,\@c_d6,\@c_d7,\@c_d8,\@c_d9,\@c_d10);
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];
		$j++;
		$data_count++;
	}
}
for ($i=0;$i<int(@t_d1);$i++){
	$t_data_count[$i] = $data_count;
	$data_count--;
}

$input_data{'pg'} = 0 if ($input_data{'pg'} eq '');
$start_pg = $input_data{'pg'};
$end_pg = $input_data{'pg'} + $page_count;
if ($end_pg >= int(@t_d1)){
	$end_pg = int(@t_d1);
}
#logf("[ start page no ] : $start_pg \n") if ($log_write eq 'ON');
#logf("[  end  page no ] : $end_pg \n")   if ($log_write eq 'ON');

$button  = "";
$button .= "<a href=\"infomation.cgi?pg=$end_pg\">".$page_next."</a>&nbsp;" if ($end_pg < int(@t_d1));
$button .= "<a href=\"infomation.cgi?pg=".($start_pg-$page_count)."\">".$page_back."</a>" if ($input_data{'pg'} ne '0');

# ---> HTML生成
for ($i=$start_pg;$i<$end_pg;$i++){
	if ((-e $templatefilename2)) {
		if (!open(TEMPLATE,"<$templatefilename2")){
			$html_document = "設定エラー<br>$templatefilename2を確認してください。";
			output($html_document);
		}
		@m_template_inner = <TEMPLATE>;
		close(TEMPLATE);
	}else{
		$html_document = "設定エラー<br>$templatefilename2が存在しません。";
		output($html_document);
	}

	for ($j=0; $j<=$#m_template_inner; $j++){
		$image_url1 = $image_url.$t_d6[$i];
		$image_url2 = $image_url.$t_d7[$i];
		$image_dir1 = $image_folder2.$t_d6[$i];
		$image_dir2 = $image_folder2.$t_d7[$i];
		if (($t_d6[$i] ne '')&&(-e $image_dir1)){
			$html_image1_1 = $html_image1;
			$html_image1_1 =~ s/TPL_IMAGE1/$image_url1/g;
		}else{
			$html_image1_1 = "";
		}
		if (($t_d7[$i] ne '')&&(-e $image_dir1)){
			$html_image2_1 = $html_image2;
			$html_image2_1 =~ s/TPL_IMAGE2/$image_url2/g;
		}else{
			$html_image2_1 = "";
		}

		$t_d4[$i] =~ s/&coln;/,/g;
		$t_d5[$i] =~ s/&coln;/,/g;
		$t_d9[$i] =~ s/&coln;/,/g;
		$t_d10[$i] =~ s/&coln;/,/g;
		$m_template_inner[$j] =~ s/TPL_NO/$t_data_count[$i]/g;
		$m_template_inner[$j] =~ s/TPL_TITLE/$t_d2[$i]/g;
		$m_template_inner[$j] =~ s/TPL_DATE/$t_d3[$i]/g;
		$m_template_inner[$j] =~ s/TPL_COMMENT1/$t_d4[$i]/g;
		$m_template_inner[$j] =~ s/TPL_COMMENT2/$t_d5[$i]/g;
		$m_template_inner[$j] =~ s/TPL_IMAGE1_URL/$image_url1/g;
		$m_template_inner[$j] =~ s/TPL_IMAGE2_URL/$image_url2/g;
		$m_template_inner[$j] =~ s/TPL_IMAGE1/$html_image1_1/g;
		$m_template_inner[$j] =~ s/TPL_IMAGE2/$html_image2_1/g;
		$m_template_inner[$j] =~ s/TPL_COMMENT3/$t_d9[$i]/g;
		$m_template_inner[$j] =~ s/TPL_COMMENT4/$t_d10[$i]/g;
		$document.=$m_template_inner[$j];
	}
}

#############################################################################################
# --> テンプレートファイルの読み込み
#
#--------------------------------------------------------------------------------------------
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');
