#!/usr/bin/perl -w
#------------------------------------------------------------------------------
# $Id$
#------------------------------------------------------------------------------
# edit system message CGI
#
# Copyright (c) BAYBITS LLC. All rights reserved.
#------------------------------------------------------------------------------

use strict;
use utf8;
binmode STDOUT, ":utf8";    # 標準出力はUTF8

use HTTP::Request::Common qw(POST);
use XML::DOM;
use URI::Escape;
use CGI;
use HTML::Template;
use TF::SingleLock;
use TF::CommonUtils;
use TF::XMLUtils;
use TF::SysMsgx;
use Encode;

#
# global
#
my $BRAND         = $ENV{'TF_BRANDNAME'} || '';
my $USERID        = $ENV{'REMOTE_USER'} || '';
my $PASSWD        = $ENV{'TF_USERPLAINPASSWORD'} || '';
my $LOCATION      = $ENV{'TF_LOCATION'} || '';
my $PATH_INFO     = $ENV{'PATH_INFO'} || '';
my $USERTYPE      = $ENV{'TF_USERTYPE'} || 'normal';
my $LANGPARAM     = TF::CommonUtils::getLangPriority();
my $BACKURI       = $LOCATION . "/.cgi-bin/mainmenu";
my ($SCHEMA,$SERVER_PORT,$URI_PREFIX) = TF::CommonUtils::getCgiConnectInfo();
my $URL           = $URI_PREFIX . $LOCATION;
my $LOCATION_NAME = $LOCATION;
$LOCATION_NAME    =~ s/\///g;
my $pagetitle     = $ENV{'TF_FOLDER_M_SYSMSG'};
my $PAGETITLE     = TF::CommonUtils::decodeUTF8($pagetitle);
my $PAGEIMG       = $ENV{'TF_FOLDER_AUTODELETE_IMG'} || '';

my $TEMPLATE_FILE = './tmpl/editmsg.tmpl.' . $LANGPARAM;
my $ACTIONURI     = "editmsg";
my $USER_AGENT    = $ENV{'HTTP_USER_AGENT'} || '';
my $IS_EXTENDSYSMSG = ($ENV{'TF_EXTENDSYSMSG'} eq 'on') ? 1 : 0;
my $TF_TOKEN      = $ENV{'TF_TOKEN'} || '';

my $ERRORTABLE_ja = {
					CGIError => "CGIエラーです",
					templateError => "テンプレートオブジェクトが生成できません",
                    readTemplateError => "テンプレートファイルの読み込みに失敗しました",
					serverBusy => "サーバがビジーです。しばらく経ってからやり直してください",
					writeError => "設定の書き込みに失敗しました",
					notfound => "対象のメッセージはありません",
					mErrInvalidPrm => '値が不正です',
					};

my $ERRORTABLE_en = {
					CGIError => "CGI error found.",
					templateError => "Can not create template object.",
					readTemplateError => "Failed to read template file.",
					serverBusy => "The server is busy. Please retry this operation after a while.",
					writeError => "Failed to write setting.",
					notfound => "message not found.",
					mErrInvalidPrm => 'Invalid Paramater',
					};


my $MSGLANG_ja = {
					all => "全て",
					ja  => "日本語",
					en  => "英語",
				  };

my $MSGLANG_en = {
					all => "All",
					ja  => "Japanese",
					en  => "English",
				  };

my $ERRORTABLE    = ($LANGPARAM eq 'ja') ? $ERRORTABLE_ja : $ERRORTABLE_en;
my $MSGLANG  = ($LANGPARAM eq 'ja') ? $MSGLANG_ja : $MSGLANG_en;

if (!$LOCATION || !$USERTYPE || $IS_EXTENDSYSMSG ne '1') {
	TF::CommonUtils::showAccessDeny();
	die '';
}

main();

# 
# main
#
sub main {
	my $status = "";

	my $cgi = new CGI;
	if( ! $cgi ) {
		TF::CommonUtils::showErrorPage($ERRORTABLE->{CGIError}, $LANGPARAM);
		print STDERR "CGI Object error";
		return;
	}

	if( $cgi->cgi_error ) {
		TF::CommonUtils::showErrorPage($ERRORTABLE->{CGIError} . '(' . $cgi->cgi_error . ')', $LANGPARAM);
		print STDERR "CGI Error (" . $cgi->cgi->error . ")";
		return;
	}

	my $mode   = $cgi->param('hidCmd');
	my $msgid  = $cgi->param('hidMsgid');
	my $msg    = $cgi->param('msg');
	my $subject= $cgi->param('subject');
	my $active = $cgi->param('active');
	my $lang   = $cgi->param('lang');
	my $scope  = $cgi->param('scope');
	my $csrftoken = $cgi->param('hidcsrftoken') || undef;
	my $updatedt = "";

	if ($lang && $lang eq "all") { $lang = undef; };

	if (!defined $csrftoken) {
		TF::CommonUtils::showErrorPage($ERRORTABLE->{mErrInvalidPrm}, $LANGPARAM);
		return;
	}
	if ($csrftoken !~ /$TF_TOKEN/) {
		TF::CommonUtils::showErrorPage($ERRORTABLE->{mErrInvalidPrm}, $LANGPARAM);
		return;
	}

	if ($mode eq 'UPDATE')
	{
		my $sysmsg = TF::SysMsgx->new();
		my $httpstat = $sysmsg->updateSysMsg($URL, $USERID, $PASSWD, $msgid, $msg, $lang, $scope, $subject, $active);
		if ($httpstat == 200) {
			TF::CommonUtils::redirectPage($BACKURI, $LANGPARAM);
			return;
		}
		else {
			# fail
		}
	}
	elsif ($mode eq 'EDIT' || $mode eq 'VIEW') {
		if ($mode eq 'UPDATE') { $mode = 'UPDATE'; }

		my $found = 0;
		my $sysmsg = TF::SysMsgx->new();
		my $httpstat = $sysmsg->querySysMsg($URL, $USERID, $PASSWD, "content", $msgid);
		if ($httpstat == '207') {
			foreach ( $sysmsg->getIDList() ) {
				if ( $sysmsg->isExists($_) && $msgid eq $_) {
					$found = 1; # found message 
					$subject = $sysmsg->getSubject($_);
					$msg = $sysmsg->getMsg($_);
					if ($mode eq 'VIEW' && $msg) {
						$msg = &replacebody($msg);
					}
					$active = $sysmsg->isActive($_);
					$lang = $sysmsg->getLang($_);
					$updatedt = TF::CommonUtils::formatTime($sysmsg->getUpdatedt($_), $LANGPARAM, 1);

					last;	# 見つかったから止める
				}
			}
		}

		# 見つからなかった
		if (!$found) {
				$status = TF::CommonUtils::showErrorPage($ERRORTABLE->{notfound} .
														'(' . $msgid . ')', $LANGPARAM);
				return;
		}

	}
	elsif ($mode eq 'INSERT') {
		# INSERT
		my $sysmsg = TF::SysMsgx->new();
		my $ret = $sysmsg->insertSysMsg($URL, $USERID, $PASSWD, $msg, $lang, $scope, $subject, $active);

		if ($ret == '201') {
			TF::CommonUtils::redirectPage($BACKURI, $LANGPARAM);
			return;
		}
		else {
			$status = "failed";	
		}

	}
	elsif ($mode eq 'DELETE') {
		my $sysmsg = TF::SysMsgx->new();
		my $ret = $sysmsg->deleteSysmsg($URL, $USERID, $PASSWD, $msgid);
		if ($ret == 204) {
			TF::CommonUtils::redirectPage($BACKURI, $LANGPARAM);
			return;
		}
		else {
			$status = TF::CommonUtils::showErrorPage($ERRORTABLE->{notfound} .
													'(' . $msgid . ')', $LANGPARAM);
			return;
		}
	}
	elsif ($mode eq 'NEW' && $msgid eq '') {
		# 新規処理は何もしない
	}
	else {
		# 表示用としてutf8をデコードする(文字化け対応）
		if ($msg) {
			$msg     = TF::CommonUtils::decodeUTF8($msg);
		}
	
		if ($subject) {
			$subject = TF::CommonUtils::decodeUTF8($subject);
		}
		$status = TF::CommonUtils::showErrorPage($ERRORTABLE->{notfound} .
												'(' . $msgid . ')', $LANGPARAM);
		return;
	}

	$mode = TF::CommonUtils::escapeHTML(TF::CommonUtils::escapeJSParam($mode), 0);
	$msgid = TF::CommonUtils::escapeHTML(TF::CommonUtils::escapeJSParam($msgid), 0);

	showResponse(	$cgi,
					$status,
					$active,
					$msgid,
					$msg,
					$lang,
					$mode,
					$subject,
					$updatedt,
				);
}

sub showResponse {
    my @emptyarray;

    my $cgi = shift || undef;
    my $status = shift || '';
	my $active = shift || undef;
	my $msgid = shift || '';
	my $msg = shift || undef;
	my $lang = shift || 'all';
	my $mode = shift || 'NEW';
	my $subject = shift || "";
	my $updatedt = shift || "";

    my $succeeded = 0;

    if( $cgi ) {
		# viewモードの場合はテンプレートを変更
		if ($mode eq 'VIEW') { $TEMPLATE_FILE = "./tmpl/viewmsg.tmpl." . $LANGPARAM; }
        if( open TEMPLATE, "<", $TEMPLATE_FILE ) {
	        binmode TEMPLATE, ":utf8";	#utf-8での出力

			my $htmltmpl = HTML::Template->new( filehandle => *TEMPLATE,
												case_sensitive => 1,
												die_on_bad_params => 0);
			
			if( $htmltmpl ) {
				$htmltmpl->param(   status => $status,
									active => $active,
									msgid  => $msgid,
									msg => $msg,
									lang_all => ($lang eq 'all') ? 'selected' : undef ,
									lang_ja  => ($lang eq 'ja')  ? 'selected' : undef ,
									lang_en  => ($lang eq 'en')  ? 'selected' : undef ,
									backuri  => $BACKURI,
									brandname => $BRAND,
									pagetitle => $PAGETITLE,
									pageimg   => $PAGEIMG,
									mode      => $mode,
									subject   => $subject,
									default_btn=>($mode eq 'NEW') ? 'true' : 'false',
									updatedt  => $updatedt,
									token     => $TF_TOKEN,
								);
				print $cgi->header( -charset => 'utf-8' );
				print $htmltmpl->output;
				$succeeded = 1;
			}
			else {
				$status = $status . $ERRORTABLE->{templateError} . '<br/>';
			}
			close TEMPLATE;
		}
		else {
			$status = $status . $ERRORTABLE->{readTemplateError} . '<br/>';
		}
	}
	else {
		$status = $status . $ERRORTABLE->{CGIError} . '<br/>';
	}

	if( ! $succeeded ){
		TF::CommonUtils::showErrorPage($status, $LANGPARAM);
		return;
	}
}

sub replacebody {
	my $body = shift;

	# 順番が重要です
	$body = TF::CommonUtils::escapeHTML($body,0);
	$body =~ s/ /&nbsp;/g;
	$body =~ s/\[[uU][rR][lL]\]([hH][tT][tT][pP][sS]?:\/\/.*)\[\/[uU][rR][lL]\]/<a href="$1" class="toplink">$1<\/a>/g;
	$body =~ s/\[[mM][aA][iI][lL]\](.*)\[\/[mM][aA][iI][lL]\]/<a href="mailto:$1" class="toplink" >$1<\/a>/g;
	$body =~ s/\x0D\x0A/<br\ \/>/g;
	$body =~ s/\x0D/<br\ \/>/g;
	$body =~ s/\x0A/<br\ \/>/g;

	return $body;
}


