#!/usr/bin/perl

use lib './lib';
require 'util.pl';
require 'jcode.pl';
use CGI;

#定数
$main_url = "https://m1.mail-do.com/sv10/s10a8586/";		#基準となるURL（ドメイン）
$thanks_page_file = "order/thanks.html";		#この値と「基準となるURL」を合わせたアドレスがサンクスページのアドレス

$top_page_file = "index.html";
$confirm_page_file = "kakunin.html";
#$mailer = "/var/qmail/bin/sendmail";		#sendmailのパス
$mailer = "/usr/sbin/sendmail";		#sendmailのパス
$param_file = "./lib/param.cgi";		#パラメータファイル
$temp_dir = "./html_template/";		#テンプレートファイル格納ディレクトリ
$csv_dir = "./csv/";		#CSV格納ディレクトリ
$mail_file = "./lib/mail.cgi";		#メールテンプレートファイル
$mail_addr = 'info@ordermade-station.com';

$form = new CGI;

#パラメータファイルを読み込み
open( FH, "<" . $param_file ) or
	exitError("パラメータファイルがオープンできません。");
@j_name = ();
@e_name = ();
@d_type = ();
@notnull = ();
@f_type = ();
@choice = ();
@size = ();
while ( $tmp = <FH> ) {
	@tmp = split( /\t/, $tmp );
	push( @j_name, $tmp[0] );
	push( @e_name, $tmp[1] );
	push( @d_type, $tmp[2] );
	push( @notnull, $tmp[3] );
	push( @f_type, $tmp[4] );
	push( @choice, $tmp[5] );
	$tmp[6] =~ s/\s*$//;
	push( @size, $tmp[6] );
}
close( FH, $loadFile );

#パラメータを取得
$mode = $form->param('mode');

#ポストデータを格納
$i = 0;
foreach $tmp ( @j_name ) {
	if ( $i > 0 ) {
		if ( @f_type[$i] eq 'text' || @f_type[$i] eq 'select' || @f_type[$i] eq 'radio' ) {
			#テキストフィールド、ラジオボタン、セレクトの場合
			${@e_name[$i]} = $form->param( @e_name[$i] );
			&jcode::convert(\${@e_name[$i]}, "euc" );
			${@e_name[$i]} = &EditText( ${@e_name[$i]}, "no_tag" );
		} elsif ( @f_type[$i] eq 'check' ) {
			#チェックボックスの場合
			@tmp = $form->param( @e_name[$i] );
			foreach $xxx ( @tmp ) {
				&jcode::convert(\$xxx, "euc" );
				$xxx = &EditText( $xxx, "no_tag" );
				push @{@e_name[$i]}, $xxx;
			}
		}
	}
	$i++;
}

$err = "";

if ( $mode eq 'check' || $mode eq 'send' ) {
	#データチェック
	$i = 0;
	foreach $tmp ( @e_name ) {
		if ( $i > 0 ) {
			$tmp_err = "";
			if ( @f_type[$i] eq 'text' ) {
				#型チェック
				if ( $tmp_err eq "" ) {
					if ( @d_type[$i] eq "E" ) {
						#英語のみ
						if ( ${@e_name[$i]} ne "" && ! ( ${@e_name[$i]} =~ /^[0-9a-zA-Z+,_\-\.#\[\]\\,\(\)\/;\"\$%&'`\?\!:@\{\}^H^X^O]+/ ) ) { $tmp_err = @j_name[$i] . "は英数字半角のみの入力となります。<br>"; }
					} elsif ( @d_type[$i] eq "Z" ) {
						#全角のみ
						if ( ${@e_name[$i]} ne "" && ! ( ${@e_name[$i]} =~ /[\x80-\xFF]/ ) ) { $tmp_err = @j_name[$i] . "は全角のみの入力となります。<br>"; }
					} elsif ( @d_type[$i] eq "N" ) {
						#数値のみ
						if ( ${@e_name[$i]} ne "" && ! ( ${@e_name[$i]} =~ /^[\d]+$/ ) ) { $tmp_err = @j_name[$i] . "は数値のみの入力となります。<br>"; }
					} elsif ( @d_type[$i] eq "M" ) {
						#E-mail
						if ( ${@e_name[$i]} ne "" && ! ( ${@e_name[$i]} =~ /^[^@]+@[^.]+\..+/ ) ) { $tmp_err = @j_name[$i] . "に正確にアドレスを入力してください。<br>"; }
					} elsif ( @d_type[$i] eq "U" ) {
						#URL
						if ( ${@e_name[$i]} ne "" && ! ( ${@e_name[$i]} =~ /https?:\/\/[\x23-\x2f\w!:;=?\@~]+/ ) ) { $tmp_err = @j_name[$i] . "に正確にURLを入力してください。<br>"; }
					} elsif ( @d_type[$i] eq "T" ) {
						#数値とハイフンのみ
						if ( ${@e_name[$i]} && ! ( ${@e_name[$i]} =~ /^[\d\-]+$/ ) ) { $tmp_err = @j_name[$i] . "は半角数値またはハイフンのみの入力となります。<br>"; }
					}
				}
			}
			#NOT NULL チェック
			if ( $tmp_err eq "" ) {
				if ( @notnull[$i] eq "y" ) {
					if ( @f_type[$i] eq 'text' || @f_type[$i] eq "select" || @f_type[$i] eq "radio" ) {
						if ( ${@e_name[$i]} eq "" ) { $tmp_err = @j_name[$i] . "は必須入力です。 <br>"; }
					} else {
						$chk = 1;
						foreach $tmp2 ( @{@e_name[$i]} ) {
							if ( $tmp2 ne "" ) {
								$chk = 0;
								break;
							}
						}
						if ( $chk == 1 ) { $tmp_err = @j_name[$i] . "は必須入力です。<br>"; }
					}
				}
			}
			#選択肢チェック
			if ( $tmp_err eq "" ) {
				@tmp2 = split( /,/, @choice[$i] );
				if ( @f_type eq "select" || @f_type eq "radio" ) {
					foreach $tmp3 ( @tmp2 ) {
						if ( ${e_name[$i]} ne "" && ${e_name[$i]} ne $tmp3 ) {
							$tmp_err = @j_name[$i] . "に不正な値が選択されています。<br>";
							break;
						}
					}
				} elsif ( @f_type eq "check" ) {
					foreach $tmp3 ( @tmp2 ) {
						foreach $tmp4 ( @{@e_name[$i]} ) {
							if ( $tmp4 ne "" && $tmp4 ne $tmp3 ) {
								$tmp_err = @j_name[$i] . "に不正な値が選択されています。<br>";
								break;
							}
						}
						if ( $tmp_err ne "" ) { break; }
					}
				}
			}
			#文字列長チェック
			if ( $tmp_err eq "" ) {
				if ( @size[$i] ne "" ) {
					if ( length( ${@e_name[$i]} ) > @size[$i] ) {
						$tmp_err = @j_name[$i] . "は全角" . ( @size[$i] / 2 ) . "文字以内で入力してください。<br>";
					}
				}
			}
			if ( $tmp_err ne "" ) { $err .= $tmp_err; }
		}
		$i++;
	}
	if ( $err ne '' ) {
		$err = '<font color="#FF0000">' . $err . '</font><br>';
	}
} else {
	#初期値設定
	if ( $hp_url eq "" ) { $hp_url = "http://"; }
}
if ( $mode eq 'check' && $err eq '' ) {
	#確認画面出力
	#HTMLテンプレートを読み込み
	open(FH, "<" . $temp_dir . $confirm_page_file) or
		exitError("確認ページのテンプレートファイルがオープンできません。");
	#文章を読み込む
	$html_txt = "";
	while (<FH>) {
		$html_txt .= $_;
	}
	close( FH, $temp_dir . $confirm_page_file );
	&jcode::convert(\$html_txt,"euc");
	#パラメータファイルの内容で置換
	$html_txt =~ s/<!--mc_mainurl-->/$main_url/g;
	$i = 0;
	foreach $tmp ( @j_name ) {
		if ( $i > 0 ) {
			if ( @f_type[$i] eq 'text' || @f_type[$i] eq 'select' || @f_type[$i] eq 'radio' ) {
				#テキストフィールド、セレクト、ラジオの場合
				if ( ${@e_name[$i]} ) {
					$display_{@e_name[$i]} = &EditText( ${@e_name[$i]}, "br" );
					$input = "<input type=\"hidden\" name=\"@e_name[$i]\" value=\"${@e_name[$i]}\">$display_{@e_name[$i]}";
				} else {
					$input = "&nbsp;";
				}
				$html_txt =~ s/\Q<!--mc_@e_name[$i]-->/$input/g;
			} elsif ( @f_type[$i] eq 'check' ) {
				#チェックボックスの場合
				$j=0;
				$input = "";
				foreach $tmp2 ( @{@e_name[$i]} ) {
					if ( $j > 0 ) { $input .= "、"; }
					$input .= "<input type=\"hidden\" name=\"@e_name[$i]\" value=\"$tmp2\">$tmp2";
					$j++;
				}
				if ( $input eq "" ) { $input = "&nbsp;"; }
				$html_txt =~ s/\Q<!--mc_@e_name[$i]-->/$input/g;
			}
		}
		$i++;
	}
	$input = "<input type=\"hidden\" name=\"email_kakunin\" value=\"$email_kakunin\">";
	$html_txt =~ s/<!--mc_email_kakunin-->/$input/g;
} elsif ( $mode eq 'send' && $err eq '' ) {
	#現在日付を作成
	($SEC,$MIN,$HOUR,$MDAY,$MON,$YEAR,$WDAY,$YDAY,$ISDST) = localtime(time);
	$now1 = sprintf("%04d/%02d/%02d %02d:%02d:%02d",$YEAR +1900,$MON +1,$MDAY,$HOUR,$MIN,$SEC);
	$now2 = sprintf("%04d%02d%02d",$YEAR +1900,$MON +1,$MDAY);
	#ファイル名を作成
	#$createFile = $csv_dir . "/" . $now2 . ".csv";
	$createFile = $csv_dir . "/data.cgi";
	#ホスト名等を取得
	$remote_host = $ENV{ 'REMOTE_HOST' };
	$remote_addr = $ENV{ 'REMOTE_ADDR' };
	if ($remote_host eq "" || $remote_host eq $remote_addr) {
		 $remote_host = gethostbyaddr(pack("C4", split(/\./, $remote_addr)), 2) || $remote_addr;
	}
	#出力文字列を構築
	$midashi = '"登録時刻","IPアドレス","ホスト名"';
	$moji = '"' . $now1 . '","' . $remote_addr . '","' . $remote_host . '"';
	$i=0;
	foreach $tmp ( @e_name ) {
		if ( $i > 0 ) {
			$midashi .= "," . ChangeCSV( @j_name[$i] );
			if ( @f_type[$i] eq 'text' || @f_type[$i] eq 'textarea' || @f_type[$i] eq 'select' || @f_type[$i] eq 'radio' ) {
				#テキストフィールドの場合
				$detail_txt = ${@e_name[$i]};
			} elsif ( @f_type[$i] eq 'checkbox' ) {
				#チェックボックスの場合
				$j=0;
				$input = "";
				foreach $tmp2 ( @{@e_name[$i]} ) {
					$j++;
					if ( $j > 1 ) { $input .= "、"; }
					$input .= $tmp2;
				}
				$detail_txt = $input;
			} else {
				$detail_txt = "";
			}
			$moji .= "," . ChangeCSV( $detail_txt );
		}
		$i++;
	}
	#CSV出力
	if ( -e $createFile ) {
		openLock(FH, "+<$createFile") or
			exitError("ファイルがオープンできません。");
		seek FH, 0, 2;
	} else {
		openLock(FH, ">$createFile") or
			exitError("ファイルが作成できません。");
		#見出しを出力
		&jcode::convert(\$midashi, "sjis", "euc" );
		print FH $midashi . "\r\n";
	}
	&jcode::convert(\$moji, "sjis", "euc" );
	print FH $moji . "\r\n";
	closeUnlock( FH, $createFile );
	#パーミッション変更
	chmod ( 0666, $createFile );
	#メールテンプレートを読み込み
	open(FH, "<" . $mail_file) or
		exitError("メールのテンプレートファイルがオープンできません。");
	#文章を読み込む
	$mail_txt = "";
	$mail_title = "";
	$i = 0;
	while (<FH>) {
		$i++;
		if ( $i == 1 ) {
			$mail_title .= $_;
		} else {
			$mail_txt .= $_;
		}
	}
	close( FH, $mail_file );
	#メール送信
	$mlfr = $mail_addr;
	$mlto = $email;
	$mlsb = $mail_title;
	$mlms = $mail_txt;
	$jcph = '.';
	
	#メール送信
	jcode::convert(*mlsb, "jis");
	jcode::convert(*mlms, "jis");
	$mlhd = "From: $mlfr" . "\n" . "To: $mlto" . "\n" . "Subject: $mlsb" . "\n\n";
	$err = 0;
	open(MAIL, "| $mailer -t -f'$mlfr'") or $err = 1;
	if ($err == 0) {
		print MAIL $mlhd;
		print MAIL $mlms;
		print MAIL "\n";
		print MAIL "\n\n" . "." . "\n";
		close(MAIL);
	} else {
		exitError("メールの送信に失敗しました。");
	}
	#リダイレクト
	print "location: " . $main_url . $thanks_page_file . "\n\n";
	exit (0);
	
} else {
	#入力フォーム出力
	#HTMLテンプレートを読み込み
	open(FH, "<" . $temp_dir . $top_page_file) or
		exitError("トップページのテンプレートファイルがオープンできません。");
	#文章を読み込む
	$html_txt = "";
	while (<FH>) {
		$html_txt .= $_;
	}
	close( FH, $temp_dir . $top_page_file );
	&jcode::convert(\$html_txt,"euc");
	#パラメータファイルの内容で置換
	$html_txt =~ s/<!--mc_mainurl-->/$main_url/g;
	if ( $err ne '' ) {
		$html_txt =~ s/<!--mc_error_message-->/$err/g;
	} else {
		$err = "";
		$html_txt =~ s/<!--mc_error_message-->/$err/g;
	}
	$i = 0;
	foreach $tmp ( @j_name ) {
		if ( $i > 0 ) {
			if ( @f_type[$i] eq 'text' ) {
				#テキストフィールドの場合
				$html_txt =~ s/\Q<!--mc_@e_name[$i]-->/${@e_name[$i]}/g;
			} elsif ( @f_type[$i] eq 'check' ) {
				#チェックボックスの場合
				@tmp2 = split( /,/, @choice[$i] );
				foreach $tmp3 ( @tmp2 ) {
					$chk = 0;
					foreach $tmp4 ( @{@e_name[$i]} ) {
						if ( $tmp3 eq $tmp4 ) {
							$chk = 1;
							break;
						}
					}
					if ( $chk == 1 ) {
						$html_txt =~ s/\Q<!--mc_@e_name[$i]_$tmp3-->/ checked/g;
					} else {
						$html_txt =~ s/\Q<!--mc_@e_name[$i]_$tmp3-->//g;
					}
				}
			} elsif ( @f_type[$i] eq 'select' ) {
				#セレクトの場合
				@tmp2 = split( /,/, @choice[$i] );
				foreach $tmp3 ( @tmp2 ) {
					if ( $tmp3 eq ${@e_name[$i]} ) {
						$html_txt =~ s/\Q<!--mc_@e_name[$i]_$tmp3-->/ selected/g;
					} else {
						$html_txt =~ s/\Q<!--mc_@e_name[$i]_$tmp3-->//g;
					}
				}
			} elsif ( @f_type[$i] eq 'radio' ) {
				#ラジオボタンの場合
				@tmp2 = split( /,/, @choice[$i] );
				foreach $tmp3 ( @tmp2 ) {
					if ( $tmp3 eq ${@e_name[$i]} ) {
						$html_txt =~ s/\Q<!--mc_@e_name[$i]_$tmp3-->/ checked/g;
					} else {
						$html_txt =~ s/\Q<!--mc_@e_name[$i]_$tmp3-->//g;
					}
				}
			}
		}
		$i++;
	}
}

&jcode::convert(\$html_txt, "sjis", "euc" );

print <<ENDOFHTML;
Content-type: text/html

$html_txt
ENDOFHTML
