#!/usr/bin/perl

use strict;
use warnings;

use CGI;
use Encode qw(from_to decode);

my $sendmail = '/usr/sbin/sendmail';

my $contentsbasepath = '';
my $contentsinnerbasepath = './_form_app/';
my $firsthtmlfile = $contentsinnerbasepath . 'contact.html';
my $conffilename  = $contentsinnerbasepath . 'contact_confirm.html';
my $compfilename  = $contentsinnerbasepath . 'contact_thanks.html';

my $contactadminmailfile = $contentsinnerbasepath . 'mailtemplate/contactadminmail.txt';
my $contactusermailfile = $contentsinnerbasepath . 'mailtemplate/contactusermail.txt';

my $mailfromaddr = 'inquiry_form@10fw.co.jp';

my $mailtoaddrs = [
  {'customertype' => '現在当社のサービスが導入されているマンション管理組合様', 'mailtoaddr' => 'sales@10fw.co.jp'},
  {'customertype' => '当社サービスの導入をご検討中のマンション管理組合様', 'mailtoaddr' => 'replace@ml.10fw.co.jp'},
  {'customertype' => '当社サービスの導入をご検討中の法人様', 'mailtoaddr' => 'sales@10fw.co.jp'},
  {'customertype' => '当社との協業をご検討中の法人様', 'mailtoaddr' => 'alliance@10fw.co.jp'},
  {'customertype' => '報道関係者様', 'mailtoaddr' => 'press@10fw.co.jp'},
  {'customertype' => '採用希望者様', 'mailtoaddr' => 'saiyo@ml.10fw.co.jp'},
  {'customertype' => 'その他', 'mailtoaddr' => 'etc@10fw.co.jp'}
];

my $params = [
  {'name' =>'customertype', 'multiple' => 0 , 'check' => ['require'], 'errorstr' => ['入力エラー：必須入力です。<br>'] },
  {'name' =>'subject', 'multiple' => 0 , 'check' => [], 'errorstr' => [] },
  {'name' =>'content', 'multiple' => 0 , 'check' => ['require'], 'errorstr' => ['入力エラー：必須入力です。<br>'] },
  {'name' =>'organization', 'multiple' => 0 , 'check' => ['require'], 'errorstr' => ['入力エラー：必須入力です。<br>'] },
  {'name' =>'division', 'multiple' => 0 , 'check' => [], 'errorstr' => [] },
  {'name' =>'customername', 'multiple' => 0 , 'check' => ['require'], 'errorstr' => ['入力エラー：必須入力です。<br>'] },
  {'name' =>'emailname', 'multiple' => 0 , 'check' => ['require', 'email'], 'errorstr' => ['入力エラー：必須入力です。<br>','入力エラー：半角英数で入力してください。<br>'] },
  {'name' =>'emaildomain', 'multiple' => 0 , 'check' => ['require', 'email','hasdot'], 'errorstr' => ['入力エラー：必須入力です。<br>','入力エラー：半角英数で入力してください。<br>','入力エラー：@以下が正しくありません。<br>'] },
  {'name' =>'emailnameconf', 'multiple' => 0 , 'check' => ['require','same'], 'errorstr' => ['入力エラー：必須入力です。<br>','入力エラー：同じメールアドレスを入力してください。<br>'] },
  {'name' =>'emaildomainconf', 'multiple' => 0 , 'check' => ['require','same'], 'errorstr' => ['入力エラー：必須入力です。<br>','入力エラー：同じメールアドレスを入力してください。<br>'] },
  {'name' =>'zip1', 'multiple' => 0 , 'check' => ['num','length3'], 'errorstr' => ['入力エラー：郵便番号前半部分を半角数字で入力してください。<br>','入力エラー：郵便番号前半部分を3ケタで入力してください。<br>'] },
  {'name' =>'zip2', 'multiple' => 0 , 'check' => ['num','length4'], 'errorstr' => ['入力エラー：郵便番号後半部分を半角数字で入力してください。<br>','入力エラー：郵便番号後半部分を4ケタで入力してください。<br>'] },
  {'name' =>'pref', 'multiple' => 0 , 'check' => [], 'errorstr' => [] },
  {'name' =>'address', 'multiple' => 0 , 'check' => [], 'errorstr' => [] },
  {'name' =>'tel1', 'multiple' => 0 , 'check' => ['require','num'], 'errorstr' => ['入力エラー：必須入力です。<br>','入力エラー：半角数字で入力してください。<br>'] },
  {'name' =>'tel2', 'multiple' => 0 , 'check' => ['require','num'], 'errorstr' => ['入力エラー：必須入力です。<br>','入力エラー：半角数字で入力してください。<br>'] },
  {'name' =>'tel3', 'multiple' => 0 , 'check' => ['require','num'], 'errorstr' => ['入力エラー：必須入力です。<br>','入力エラー：半角数字で入力してください。<br>'] },
  {'name' =>'fax1', 'multiple' => 0 , 'check' => ['num'], 'errorstr' => ['入力エラー：半角数字で入力してください。<br>'] },
  {'name' =>'fax2', 'multiple' => 0 , 'check' => ['num'], 'errorstr' => ['入力エラー：半角数字で入力してください。<br>'] },
  {'name' =>'fax3', 'multiple' => 0 , 'check' => ['num'], 'errorstr' => ['入力エラー：半角数字で入力してください。<br>'] },
  {'name' =>'howtoknow', 'multiple' => 1 , 'check' => [], 'errorstr' => [] },
  {'name' =>'howtoknowother', 'multiple' => 0 , 'check' => [], 'errorstr' => [] },
  {'name' =>'message', 'multiple' => 0 , 'check' => ['max1000'], 'errorstr' => ['入力エラー：1000文字まで入力してください。'] },
  {'name' =>'policy', 'multiple' => 0 , 'check' => ['require'], 'errorstr' => ['入力エラー：必須入力です。<br>'] }
];

my @errors = ();

my $q = new CGI;
$q->charset('utf-8');

main();

sub main {
  if($q->param('proc') eq 'conf' && checkdata()){
    confirmation();
    exit;
  }
  if($q->param('proc') eq 'comp' && checkdata()){
    complete();
    exit;
  }
  toppage();
}

sub toppage {
  my $buf = readhtml($firsthtmlfile);
  foreach my $error (@errors){
    my $orgstr = sprintf('<!--%s-->', uc($error->{'errorname'}));
    my $value = $error->{'errorstr'};
    $buf =~ s/$orgstr/$value/g;
    my @ea = split(/\-/, $error->{'errorname'});
    $ea[0] = 'zip' if ($ea[0] =~ /zip.+/g);
    my $orgstr = sprintf('<td id="td-%s" class=".+?">', $ea[0]);
    my $newstr = sprintf('<td id="td-%s" class="rd">', $ea[0]);
    $buf =~ s/$orgstr/$newstr/g;
    my $orgstr = sprintf('<span class="ttl-%s">', $ea[0]);
    my $newstr = sprintf('<span class="ttl-%s fcRed">', $ea[0]);
    $buf =~ s/$orgstr/$newstr/g;
  }
  foreach my $prm (@$params){
    my $orgstr = sprintf('<!--%s-->', uc($prm->{'name'}));
    my $value = $q->param('proc')? $q->param($prm->{'name'}): '';
    my $value = $q->escapeHTML($value);
    $buf =~ s/$orgstr/$value/g;
  }
  
  if($q->param('proc')){
    #topmessage
    my $orgstr = '<p id="topmessage">.+?</p>';
    my $newstr = '<p id="topmessage">入力された内容に不備がございます。<br />赤字部分を再度ご確認いただき『入力内容確認』ボタンをクリックしてください。</p>';
    $buf =~ s/$orgstr/$newstr/g;
    #topmessage2
    my $orgstr = '<h3 id="top-ttl-kaki">.+?</h3>';
    my $newstr = '';
    $buf =~ s/$orgstr/$newstr/g;
    #customertype
    my $orgstr = sprintf('<option>%s</option>', $q->param('customertype'));
    my $newstr = sprintf('<option selected="selected">%s</option>', $q->param('customertype'));
    $buf =~ s/$orgstr/$newstr/g;
    #pref
    my $orgstr = sprintf('<option label="%s">%s</option>', $q->param('pref'), $q->param('pref'));
    my $newstr = sprintf('<option label="%s" selected="selected">%s</option>', $q->param('pref'), $q->param('pref'));
    $buf =~ s/$orgstr/$newstr/g;
    #howtoknow
    my @howtoknows = $q->param('howtoknow');
    foreach(@howtoknows){
      my $orgstr = sprintf('<input name="howtoknow" type="checkbox" value="%s" />', $_);
      my $newstr = sprintf('<input name="howtoknow" type="checkbox" value="%s" checked />', $_);
      $buf =~ s/$orgstr/$newstr/g;
    }
  }
  show($buf);
}

sub checkdata{
  my $ans = 1;
  foreach my $prm (@$params){
    my $val = $q->param($prm->{'name'});
    my $checks = $prm->{'check'};
    for(my $i = 0; $i < @$checks; $i++){
      my $tmpval = '';
      $tmpval = $q->param('emailname') if($prm->{'name'} eq 'emailnameconf');
      $tmpval = $q->param('emaildomain') if($prm->{'name'} eq 'emaildomainconf');
      if(!checkdatum($prm->{'check'}->[$i], $val, $tmpval)){
        my $tmpname = $prm->{'name'};
        $tmpname =~ s/[0-9]+//g if($tmpname !~ /zip/);
        $tmpname =~ s/email.+/email/g;
        push(@errors, {'errorname' => $tmpname . '-' . $prm->{'check'}->[$i] , 'errorstr' => $prm->{errorstr}->[$i]});
        $ans = 0;
      }
    }
  }
  return $ans;
}

sub checkdatum{
  my $type = shift(@_);
  my $value = shift(@_);
  my $tmpvalue = shift(@_);
  return length($value) if($type eq 'require');
  return 1 if($type eq 'num' && length($value) == 0);
  return $value =~ /^[0-9]+$/ if($type eq 'num');
  return 1 if($type eq 'email' && length($value) == 0);
  return $value =~ /^[0-9,a-z,A-Z,\+,\-,\.,\_]+$/ if($type eq 'email');
  return $value eq $tmpvalue if($type eq 'same');
  return 1 if($type eq 'hasdot' && length($value) == 0);
  return $value =~ /\.+/ if($type eq 'hasdot');
  return (length(decode('utf8', $value)) <= 1000) if ($type eq 'max1000');
  return (length(decode('utf8', $value)) <= 2) if ($type eq 'max2');
  return 1 if($type eq 'length3' && length($value) == 0);
  return (length(decode('utf8', $value)) == 3) if ($type eq 'length3');
  return 1 if($type eq 'length4' && length($value) == 0);
  return (length(decode('utf8', $value)) == 4) if ($type eq 'length4');
}

sub confirmation{
  my $buf = readhtml($conffilename);
  my $hiddenbuf = '';
  foreach my $prm (@$params){
    my $orgstr = sprintf("<!--%s-->", uc($prm->{'name'}));
    my $value = '';
    if($prm->{'multiple'}){
      my @tmpvalue = $q->param($prm->{'name'});
      $value = join(" / ", @tmpvalue);
    } else {
      $value = $q->param($prm->{'name'});
    }
    
    my $value = $q->escapeHTML($value); #mzdakr add on 2011/08/21
    
    
    $buf =~ s/$orgstr/$value/g;
    $hiddenbuf .= sprintf('<input type="hidden" name="%s" value="%s">', $prm->{'name'}, $value);
    $hiddenbuf .= "\n";
  }
  $buf =~ s/<!--HIDDENVALUE-->/$hiddenbuf/g;
  show($buf);
}

sub complete(){
  sendmailtoadmin();
  sendmailtocustomer();
  my $buf = readhtml($compfilename);
  show($buf);
}

sub sendmailtoadmin{
  my $mailtoaddr = '';
  my $body = '';
  foreach(@$mailtoaddrs){
    $mailtoaddr = $_->{'mailtoaddr'} if($q->param('customertype') eq $_->{'customertype'});
  }
  $body = readfile($contactadminmailfile);
  foreach(@$params){
    my $orgstr = sprintf('<!--%s-->', uc($_->{'name'}));
    my $value = $q->param($_->{'name'});
    $value =~ s/－/-/g;
    $value =~ tr/[\x{ff5e}\x{2225}\x{ff0d}\x{ffe0}\x{ffe1}\x{ffe2}]/[\x{301c}\x{2016}\x{2212}\x{00a2}\x{00a3}\x{00ac}]/;
    $body =~ s/$orgstr/$value/g;
  }
  sendmail($mailfromaddr, $mailtoaddr, '', '', '10fw「お問合せ」フォームより連絡', $body);
}

sub sendmailtocustomer{
  my $mailtoaddr = $q->param('emailname') . '@' . $q->param('emaildomain');
  my $body = readfile($contactusermailfile);
  foreach(@$params){
    my $orgstr = sprintf('<!--%s-->', uc($_->{'name'}));
    my $value = $q->param($_->{'name'});
    $value =~ s/－/-/g;
    $value =~ tr/[\x{ff5e}\x{2225}\x{ff0d}\x{ffe0}\x{ffe1}\x{ffe2}]/[\x{301c}\x{2016}\x{2212}\x{00a2}\x{00a3}\x{00ac}]/;
    $body =~ s/$orgstr/$value/g;
  }
  my @youbi = ('日', '月', '火', '水', '木', '金', '土');
  (my $sec, my $min, my $hour, my $mday, my $mon, my $year, my $wday, my $yday, my $isdst) = localtime(time);
  $year += 1900;
  $mon += 1;
  $wday = $youbi[$wday];
  $body =~ s/<!--YEAR-->/$year/g;
  $body =~ s/<!--MONTH-->/$mon/g;
  $body =~ s/<!--DAY-->/$mday/g;
  $body =~ s/<!--WDAY-->/$wday/g;
  $body =~ s/<!--HOUR-->/$hour/g;
  $body =~ s/<!--MINUTE-->/$min/g;
    
  sendmail($mailfromaddr, $mailtoaddr, '', '', 'お問合せありがとうございました／テンフィートライト', $body);
}

sub sendmail{
  my $from = shift(@_);
  my $to = shift(@_);
  my $cc = shift(@_);
  my $bcc = shift(@_);
  my $subject = shift(@_);
  my $body = shift(@_);
  from_to($subject, 'utf8', 'MIME-Header-ISO_2022_JP');
  from_to($body, 'utf8', 'iso-2022-jp');
  open(MAIL, "|$sendmail -t -i") || die 'sendmail error';
  print MAIL "From: $from\n";
  print MAIL "To: $to\n";
  print MAIL "Cc: $cc\n";
  print MAIL "Bcc: $bcc\n";
  print MAIL "Subject: $subject\n";
  print MAIL "Content-Transfer-Encoding: 7bit\n";
  print MAIL "Content-Type: text/plain;charset=\"ISO-2022-JP\"\n\n";
  print MAIL $body;
  close(MAIL);
}

sub show {
  my $buf = $_[0];
  print "Content-Type:text/html\n\n";
  print $buf;
}

sub readhtml {
  my $buf = '';
  my $filename = $_[0];
  $buf = readfile($filename);
  
  while($buf =~ /<!--\#include\svirtual=\"(.+?)\" -->/g){
    my $ssiorg = $&;
    my $ssifn = $1;
    my $ssicnt = readfile($contentsbasepath.$ssifn);
    $buf =~ s/$ssiorg/$ssicnt/g;
  }

  $buf =~ s/<!--CONTENTSBASEPATH-->/$contentsbasepath/g;

  return $buf;
}

sub readfile {
  my $filename = $_[0];
  open(FILE, $filename);
  my @data = <FILE>;
  close(FILE);
  return join('', @data);
}
