#!/usr/bin/perl

#デバック
#BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); }

###############################################################################
#  FormMail CGI                                                                
#                                                                              
#  [Release]                                                                   
#   Ver1.00  2004.05.18  NAKSYSTEM <nak@suita.net>                             
#   Ver1.10  2004.08.04  NAKSYSTEM 送信元名の'NONE'に対応                      
#   Ver1.20  2005.02.01  NAKSYSTEM 自動返信メール機能追加                      
#
#                                                                              
#                                     Copyright(C)2004 AIA Service Corporation.
###############################################################################

 
use lib qw|./extlib|; 
use Jcode;              
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use Data::Dumper qw(Dumper);
use HTML::Template;
use HTML::FillInForm::Lite;

require 'config.pl'; 

#==============================================================================
# Main Routine
#==============================================================================
my $cgi = new CGI;
$cgi->charset('utf8');
*FORM = &parseInput();


if($FORM{'back'}){
	$FORM{conf} = 0;
	&HTMLinput();
}

#============================================================================

# 確認画面出力

# データ項目の抜粋
	@DATA = grep { /^\d+\./ } sort keys %FORM;
	
	&HTMLinput() unless $FORM{mode};
	
	# 確認画面出力
	HTMLConfirm() unless $FORM{conf};
	
	# メール送信
	&SendMail(@DATA);
	
	# 自動返信メール
	&SendAutoResponse(@DATA) if $IS_AUTO_RES;
	
	# 戻りURLへのジャンプ
	print "Location: $BACKURL\n\n";



#------------------------------------------------------------------------------
# HTML入力
#------------------------------------------------------------------------------
sub HTMLinput {
## エラーデータの引継ぎ
	my @err_msg = ();
	@err_msg = @_;
## フォームデータの引継ぎ	
	my $fdat = {};
	while ( ($key, $value) = each(%FORM) ) { 	  
		$fdat->{$key} = $value;
	}

## オブジェクト作成
	my $template_d = HTML::Template->new(
						die_on_bad_params => 0,
						filename => $HTML->{'input'}
	);
	
	
## パラメータ作成	
	$template_d->param(CAR_ID => $FORM{'CAR_id'},);
	$template_d->param(ERR_FLG => 0);
	my $err_flg = 0;
	my $i = 0;
##エラーパラメータ作成
	foreach my $err_data (@err_msg){	
		if($err_data){
			if(!$err_flg){$err_flg = 1;}
			$err_msg->[$i]{'err'} = $err_data;
			$i++;
		}	
	}
	
	if($err_flg){
		$template_d->param(ERR_FLG => 1);
		$template_d->param(ERR_MSG => $err_msg,);	
	}


## HTMLデータの変数への格納
	$template_str = $template_d->output;
	

## データ出力
	print $cgi->header(-charset=>"utf-8");
	print HTML::FillInForm::Lite->new->fill(
        \$template_str,$fdat
    );

	exit;	
}

#------------------------------------------------------------------------------
# 確認画面出力//HTML::TEMPLATE
#------------------------------------------------------------------------------
sub HTMLConfirm {
## 	

## 各種項目のチェック
	 foreach $check ( @CHECK ) {
		unless ( $FORM{$check} ) {
			$check =~ s/^\d+\.//;
			$check =~ s/\_z1\_(.+)/$1\(前\)/g;
			$check =~ s/\_z2\_(.+)/$1\(後\)/g;
			push( @ErrStr, qq|[ $check ] を入力して下さい。| );
		}
	 }
	&HTMLinput(@ErrStr) if @ErrStr;
	@adrr_msg = &validate(\%FORM);
	&HTMLinput( @adrr_msg ) if @adrr_msg;

##確認画面	
## オブジェクト作成
	my $template_d = HTML::Template->new(
						die_on_bad_params => 0,
						filename => $HTML->{'confirm'}
	);
	
	
## 継承フォームデータ
	$hidden_flg = 0;
	$i = 0;
	foreach $key ( sort keys %FORM ) {
		next if ( $key eq 'CHECK' || $key eq 'submit' );
		foreach $data ( split( /\0/, $FORM{$key} ) ) {
			$hidden_flg = 1;
			$hdat->[$i] = {'KEY' => $key,'VAL' => $data};
			$i++;
		}
	}
	if($hidden_flg){
			$template_d->param(HIDDEN => $hdat,);	
	}
	

## データテーブル
	$i = 0;
	$j = 0;
	foreach $key ( @DATA ) {
		$data = "";
		$key =~ /(^\d+\.)(.*)/;
		$key_prefix = $1;
		$key_item = $2;

## 配列データのparth
## 住所
		if($key_item =~ m/\_z1\_/i or $key_item =~ m/\_z2\_/i){
				if($key_item =~ m/\_z1\_/i){$zip1 = $FORM{$key};delete $FORM{$key}; next;}
				if($key_item =~ m/\_z2\_/i){$zip2 = $FORM{$key};delete $FORM{$key};}
				if($zip1 and $zip2){
						$FORM{$ZIP} = $zip1 . '-' . $zip2;
						$key = $ZIP;
						$key_item = $ZIP;
				}
						
		}
			foreach $list ( split( /\0/, $FORM{$key} ) ) { 
				$check =~ s/\_z2\_(.+)/$1\(後\)/g;
				$data .= $list . qq|<br />\n|;
			}
			$tdat->[$i] = {'KEY' => $key_item,'VAL' => $data};
			$i++;
		
	}
	
	$template_d->param(CONFIRM_DATA => $tdat,);


## HTML出力
	print $cgi->header(-charset=>"utf-8");
	print $template_d->output;

	exit;
}



#------------------------------------------------------------------------------
# メール送信
#------------------------------------------------------------------------------
sub SendMail {
	my @DATA = ();
	my @SEND_DATA = ();
	@DATA = @_;
	my %SENDFORM = %FORM;
	foreach $key ( @DATA ) {
				if($key =~ m/\_z1\_/i or $key =~ m/\_z2\_/i){
					if($key =~ m/\_z1\_/i){$zip1 = $SENDFORM{$key};delete $SENDFORM{$key}; next;}
					if($key =~ m/\_z2\_/i){$zip2 = $SENDFORM{$key};delete $SENDFORM{$key};}
					if($zip1 and $zip2){
							$SENDFORM{$ZIP} = $zip1 . '-' . $zip2;
							$key = $ZIP;
					}

				}
				push(@SEND_DATA,$key);
	}
	
	
	my ( $msg, $mailto );
	
	# 日時取得
	$ENV{'TZ'} = "JST-9";
	my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $dmy ) = localtime(time);
	my $date = sprintf( "%04d/%02d/%02d", $year+1900, $mon+1, $mday);
	my $time = sprintf( "%02d:%02d:%02d", $hour, $min, $sec );	

	# メール送信元の設定
	if ( $MAIL_FROM eq 'NONE' || $MAIL_FROM eq 'none' ) {
		$mailto = $SENDFORM{$MAIL_FROM};
	} else {
		$mailto  = $SENDFORM{$MAIL_FROM} || 'FormMailCGI';
		$mailto .= " <$SENDFORM{$MAIL_EMAIL}>" if $SENDFORM{$MAIL_EMAIL};
	}
	$mailto   =~ s/\r|\n//g;
  	$MAIL_TO  =~ s/\r|\n//g;
  	$MAIL_SUB =~ s/\r|\n//g;
	# メールヘッダ作成
	
	$msg .= "From: "   . jis( $mailto )  . "\n";
	$msg .= "To: "     . jis( $MAIL_TO ) . "\n";
	$msg .= "Cc: "     . jis( join( ",", @MAIL_CC ) )  . "\n" if @MAIL_CC;
	$msg .= "Bcc: "    . jis( join( ",", @MAIL_BCC ) ) . "\n" if @MAIL_BCC;
	$msg .= "Subject:" . jis( "$MAIL_SUB" )  . "\n";
	$msg .= "Content-Transfer-Encoding: 7bit\n";
	$msg .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n\n";
	$msg .= "Date: $date $time\n";
	$msg .= "From: $ENV{'REMOTE_ADDR'}($ENV{'REMOTE_HOST'})\n\n";

	$sendmsg = jis2("■お問合せ内容\n+------------------------------------------------------\n\n");
	map { $sendmsg .=  jis2("【$_】\n" . join(',', split(/\0/, $SENDFORM{$_})) . "\n\n\n")  } @SEND_DATA;
	
	
	
	$sendmsg =~ s/\<BR\>/\r\n/g;
	$sendmsg =~ s/\&lt\;BR\&gt\;/\r\n/g;
	$sendmsg =~ s/\d\d\.//g;
	$sendmsg .= jis2("+--------------------------------------------------------\n\n");	
	$msg .= $sendmsg;
	
	# for Debug
	#$msg =~ s/\n/\<BR\>/g;
	#$msg =~ s/\n/\&lt\;BR\&gt\;/g;
	
	
	#print "Content-Type: text/html\n\n";
	#print "### Form Data ### \n\n";
	#print "$msg\n$mailto\n\n";
	#exit;
 	open ( MAIL, "| $MAIL -t" );
	print MAIL $msg;
	close MAIL;
}

#------------------------------------------------------------------------------
# 自動返信メール
#------------------------------------------------------------------------------
sub SendAutoResponse {
	my @DATA = ();
	my @SEND_DATA = ();
	@DATA = @_;
	foreach $key ( @DATA ) {
				if($key =~ m/\_z1\_/i or $key =~ m/\_z2\_/i){
					if($key =~ m/\_z1\_/i){$zip1 = $FORM{$key};delete $FORM{$key}; next;}
					if($key =~ m/\_z2\_/i){$zip2 = $FORM{$key};delete $FORM{$key};}
					if($zip1 and $zip2){
							$FORM{$ZIP} = $zip1 . '-' . $zip2;
							$key = $ZIP;
							
					}
					
				}
				push(@SEND_DATA,$key);
	}
	
	my $msg;
	$FORM{$MAIL_FROM} =~ s/\r|\n//g;
	$FORM{$MAIL_EMAIL} =~ s/\r|\n//g;

	# メールヘッダ作成
	$msg .= "From: "   . jis( $AUTO_FROM )  . "\n";
	$msg .= "To: "     . jis( $FORM{$MAIL_EMAIL} ) . "\n";
	$msg .= "Subject:" . jis( $AUTO_SUB ) ."\n";
	$msg .= "Content-Transfer-Encoding: 7bit\n";
	$msg .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n\n";
	
	map { $resmsg .=  ("【$_】\n" . join(',', split(/\0/, $FORM{$_})) . "\n\n")  } @SEND_DATA;
	$resmsg =~ s/\<BR\>/\r\n/g;
	$resmsg =~ s/\&lt\;BR\&gt\;/\r\n/g;
	$resmsg =~ s/\d\d\.//g;
	$AUTO_MSG =~ s/\[\%name\%\]/$FORM{$MAIL_FROM}/g;
	$AUTO_MSG =~ s/\[\%inner\%\]/$resmsg/;
		
	$msg .= jis2($AUTO_MSG);
	
	#for Debug
=pod
	$msg =~ s/\n/\<BR\>/g;
	$msg =~ s/\n/\&lt\;BR\&gt\;/g;
	print "### Auto Response ###\n\n";
	print #"$msg\n$mailto";
	print $resmsg;
	print $msg;
	exit;
=cut
	open ( MAIL, "| $MAIL -t" );
	print MAIL $msg;
	close MAIL;
}
#----------------------------------------------------------------------------------------------
#■Base64Encode//
#----------------------------------------------------------------------------------------------

#ヘッダ部jis化
sub jis {
	local($msg) = @_;
	$msg =~ s/\xef\xbc\x8d/\xe2\x88\x92/go;
	$msg =~ s/\xEF\xBD\x9E/\xE3\x80\x9C/go; 
	$msg = Jcode->new($msg)->jis;
	$msg = Jcode->new($msg)->mime_encode;
	return $msg;
}

#本文部jis化
sub jis2 {
	local($msg) = @_;
	$msg =~ s/\xef\xbc\x8d/\xe2\x88\x92/go;
	$msg =~ s/\xEF\xBD\x9E/\xE3\x80\x9C/go;
	$msg = Jcode->new($msg,'utf8')->jis;
	return $msg;
}

#----------------------------------------------------------------------------------------------
#■Validator
#----------------------------------------------------------------------------------------------
sub validate {
	my $FORM = shift;
	my @adderr_msg = ();
## メールアドレスのチェック	
	if($FORM->{$chk->{'chkMail'}}) {
		
		if($FORM->{$chk->{'chkMail'}} !~ /^([^\n\(\)\\\'\"\~\`:,;@<>]+)\@([^\n\(\)\\\'\"\~\`:,;@<>]+)\.([^\n\(\)\\\'\"\~\`:,;@<>]+)$/){
			push(@adderr_msg, $ERR_MSG_LIST->{'MAIL'});
		}
	}
	
	
## エラーのリターン	
	return @adderr_msg;
}
#------------------------------------------------------------------------------
# データ受信//CGI.pm
#------------------------------------------------------------------------------
sub parseInput
{

	my %pairs = $cgi->Vars;
	
	%in = ();
	while ( my ($key, $val) = each(%pairs) ){
			# 不要コード排除
			$val =~ s/&/&amp;/g;
			$val =~ s/"/&quot;/g;
			$val =~ s/</&lt;/g;
			$val =~ s/>/&gt;/g;
			$val =~ s/'/&#39;/g;
			
			$in{$key} .= defined $in{$key} ? "\0$pairs{$key}" : "$pairs{$key}";
	}
	return *in;
}



