#! /usr/bin/perl --

use CGI;
use CGI::Session;
use Jcode;
use MIME::Lite;

$cgi = CGI->new;

require "config.pl";            # コンフィグファイル
require "globals.pl";           # グローバル変数の定義
require "input_validation.pl";  # 入力チェック
require "session.pl";           # セッション関連
require "convert_string.pl";    # 文字列変換ユーティリティ
require "ip.pl";                # ip抜き出し
require "limitation.pl";        # 送信制限
require "log.pl";               # ログファイル
require "send.pl";              # メール送信
require "id.pl";                # 問合せid作成

# 以下はview
require "print_helper.pl";
require "print_form.pl";
require "print_check.pl";
require "print_success.pl";
require "print_error.pl";
require "print_header.pl";
require "print_footer.pl";
require "print_helper.pl";

&main();
return 0;

####  main関数ここから　 ####
sub main {
  my $req_type = $cgi->request_method();
  my @pram_name;
  my $action;
  my $sid;
  if( $req_type eq 'GET'){
    &action_get();
    return;
  }
  # POSTの場合
  # 登録情報の読み出しと前の画面がどこかを決定
  $action = $cgi->param($hidden);
  if($action eq "input"){
      &load_inquiry_data('FORM');
  }else{
      &load_inquiry_data('COOKIE');
  }
  # session idをチェック
  # sessionが不正ならgetへ飛ばす
  my $tmp = &validate_session_ID($inquiry_data{$session_id});
  if(&validate_session_ID($inquiry_data{$session_id}) != 0){
    &action_get();
    return;
  }

  #### アクションへの(頭の悪い)ルーティング
  # $action に画面遷移を決定する情報が入っている
  if($action eq 'mod'){
    # "修正"が押された場合
    &print_form();
    return;
  }

  if($action eq 'error_back'){
     #送信失敗から戻った場合:確認画面を表示する
    &print_check();
    return;
  }

  # フォームから入力
  if($action eq 'input'){
    &action_input();
    return;
  }

  # メール送信
  if($action eq 'sendmail'){
    &action_send_mail();
    return;
  }

  &action_get();
  return;
}

## actionの実装
sub action_get{
  my $sid = $inquiry_data{$session_id};
  if($sid){
    &remove_session($sid);
  }
  # セッション作成
  $sid = &init_session();
  # formを出して終わり
  &print_form($sid);
  return;
}

# フォームからの入力
sub action_input{
  &validate_form();
  $err_num = @errors;
  if( $err_num > 0){
    # 登録情報にエラーがある
    # セッションIDをチェックしてなかったら作ったほうがいいかも
    &print_form($inquiry_data{"session_ID"});
  }else{
    &print_check();
    &write_session_data($inquiry_data{"session_ID"}, %inquiry_data);
  }
  return;
}

# メール送信
sub action_send_mail{
  # メール送信
  # 再投稿のチェック
  if( $limitation and (!&check_send_limitation()) ){
    # 送信制限にかかった
    &print_send_limitation();
    my $tmp=$cgi->remote_host;
	  &write_log( $inquiry_data{$client_ip}, $tmp, "1", "送信制限");
    return;
  }

  my $ret;
  if( &make_inquiry_ID() ne "OK"){
    # 問い合わせID作成失敗
    &print_abort("ID_FAIL");
    &delete_send_limitation();
    return;
  }
  # 問い合わせIDの作成成功
  $ret = &send();
  if( $ret eq "OK"){
    # アルファに送信成功
    &print_success();
    &remove_session();
    return;
  }else{
    &print_abort($ret);
    return;
  }
}

# データ読み出し関数
# 関数 load_inquiry_data
# 連想配列 inquiry_dataを設定する
sub load_inquiry_data {
  my $request = $cgi;
  my $sid = $request->cookie('CGISESSID')||undef;
  if ($_[0] eq 'FORM' ){
    # formからデータを設定
    $inquiry_data{$session_id}  = $sid;
    foreach $elem (@elements){
      $inquiry_data{$elem} = $request->param($elem);
    }
#   my @checks1;
#   my @checks2;
#		@checks1                 = $request->param($device);
#		$inquiry_data{$device}   = \@checks1;
#		@checks2                 = $request->param($solution);
#		$inquiry_data{$solution} = \@checks2;
  }else{
    # セッション情報からデータを設定
    my $session;
    if($sid ne "" ){
      $session = CGI::Session->load(undef,$sid,{Directory=>"$session_path"});
      if($session){
        foreach $key (keys %inquiry_data){
           my $str = $session->param($key);
           $inquiry_data{$key} = $str;
        }
      }
    }
  }
  $inquiry_data{$client_ip}   = &get_ip();
}

# validate関数
# 各validate_xxxを呼び出してチェックをしていく
sub validate_form {
	if( &validate_session_ID($inquiry_data{"session_ID"}) == 1){
		$inquiry_data{"session_ID"} = &init_session();
    push(@errors,"セッションが無効になりました。お手数ですが再度ご入力をお願いいたします。\n");
  }
  # 全角のチェック
  my $sp = '(?:\xA1\xA1)';                      # 全角スペース
  my $katakana = '(?:\xA5[\xA1-\xF6])';         # 全角カタカナ
  my $hiragana = '(?:\xA4[\xA1-\xF3])';         # 全角ひらがな
  my $kanji = '(?:[\xB0-\xF4][\x00-\xFF])';     # 漢字
  my $bar ='(?:\xA1\xBC)';                      # 全角ー
  my $regex_name = "($katakana|$hiragana|$kanji|$sp|$bar)*";
  my $regex_kana = "($katakana|$sp|$bar|' ')*"; # 半角スペースを追加
  my $text = $inquiry_data{$detail};
  $text =~ s/\r\n/\r/g;
  $text =~ s/\r/\n/g;
  $text =~ s/\n//g;
  # 全角カナのチェック
  &validate_textbox($inquiry_data{$name}, "お名前", undef, $name_length);
  &validate_textbox($inquiry_data{$name_kana}, "お名前(フリガナ)", $regex_kana, $name_length);
  &validate_textbox($inquiry_data{$company}, "御社名", undef, $company_length);
  &validate_tel($inquiry_data{$tel}, "ご連絡先電話番号");
	&validate_mail_address($inquiry_data{$mail}, $inquiry_data{$mail_conf}, "メールアドレス", "メールアドレス（確認）");
	&validate_radio($inquiry_data{$class}, "ご質問内容", %class_options);
	&validate_textbox($text, "ご質問内容", undef, $detail_length);
	&validate_radio($inquiry_data{$inform}, "カスタマイズサービスに関する情報", %inform_options);
}

sub debug_print {
	print "Content-type: text/html; charset=euc-jp\n";
	print "\n";
	print <<"END_OF_HEADER";
<?xml version="1.0" encoding="EUC"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<title>debug message</title>
</head>
<body>
<h1>debug print</h1>
<p> $_ </p>
</body>
END_OF_HEADER
  exit();
}
