#!/usr/bin/perl
#------------------------------------------------------------------------------
# $Id$
#------------------------------------------------------------------------------
# OperationLog list CGI
#
# Copyright (c) BAYBITS LLC. All rights reserved.
#------------------------------------------------------------------------------
use strict;
use utf8;
binmode STDOUT, ":utf8";    # 標準出力はUTF8

use URI::Escape;
use CGI;
use TF::GroupList;
use HTML::Template;
use TF::CommonUtils;
use Encode;

#
# global
#
my $BRAND         = $ENV{'TF_BRANDNAME'} || '';
my $USERID        = $ENV{'REMOTE_USER'} || '';
my $PASSWD        = $ENV{'TF_USERPLAINPASSWORD'} || '';
my $LOCATION      = $ENV{'TF_LOCATION'} || '';
my $USERTYPE      = $ENV{'TF_USERTYPE'} || 'normal';
my $USERPRIVILEGE = $ENV{'TF_USERPRIVILEGE'} || '';
my $LANGPARAM     = TF::CommonUtils::getLangPriority();
my ($SCHEMA,$SERVER_PORT,$URI_PREFIX) = TF::CommonUtils::getCgiConnectInfo();
my $URL           = $URI_PREFIX . $LOCATION;
my $TF_LOGOPERATION = $ENV{'TF_LOGOPERATION'} || 'off';
my $TF_GROUPLEADER  = $ENV{'TF_GROUPLEADER'} || 'off';
my $pagetitle     = $ENV{'TF_FOLDER_LOGOPERATION'} || '';
my $PAGETITLE     = TF::CommonUtils::decodeUTF8($pagetitle);
my $PAGEIMG       = $ENV{'TF_FOLDER_LOGOPERATION_IMG'} || '';
my $GRP_IMG       = $ENV{'TF_FOLDER_M_GROUP_IMG'} || '';
my $GRP_ALT       = $ENV{'TF_FOLDER_M_GROUP'} || '';
$GRP_ALT = TF::CommonUtils::decodeUTF8($GRP_ALT);

my $TEMPLATE_FILE = './tmpl/oploglist.tmpl.' . $LANGPARAM;
my $USER_AGENT    = $ENV{'HTTP_USER_AGENT'} || '';

my $ERRORTABLE_ja = {
					CGIError => "CGIエラーです",
					templateError => "テンプレートオブジェクトが生成できません",
                    readTemplateError => "テンプレートファイルの読み込みに失敗しました",
					};

my $ERRORTABLE_en = {
					CGIError => "CGI error found.",
					templateError => "Can not create template object.",
					readTemplateError => "Failed to read template file.",
					};

my $ERRORTABLE    = ($LANGPARAM eq 'ja') ? $ERRORTABLE_ja : $ERRORTABLE_en;
					
if (!$LOCATION || !$USERTYPE || $USERTYPE eq 'limited' || $TF_LOGOPERATION ne 'on') {
	TF::CommonUtils::showAccessDeny();
	die '';
}

main();

#
# main 
#
sub main {
	my @paramarray = ();

	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;
	}

	# Cross-site Scripting 対策
	# cgroupidはレスポンスでjavascriptの引数として利用されます。
	# その為に$cgiによりURLエンコードされている文字を一旦戻して
	# javascriptのエスケープを施してからHTMLエスケープの処理を行います
	my $ecgid_raw = TF::CommonUtils::decodeUTF8(scalar $cgi->param('cgroupid')) || '';
	my $ecgid = TF::CommonUtils::escapeHTML(TF::CommonUtils::escapeJSParam($ecgid_raw), 0);

	my $cgid     = '';
	if ($ecgid) {
		$cgid = TF::CommonUtils::decipherNumericValue($ecgid);
	}

	# グループ制約適用の有無
	my $use_grpconstraints = 1;
	if ($USERPRIVILEGE =~ /group-constraints-ignore/) {
		$use_grpconstraints = 0;
	}

	#
	# グループ一覧の取得
	#
	my $glist  = TF::GroupList->new();
	my $glist2 = undef;
	my $queryGroupStatus  = undef;
	my $queryGroupStatus2 = undef;
	my $isAdmin = 0;
	my $isLeader = 0;
	
	if ($USERTYPE eq 'admin') {
		$queryGroupStatus = $glist->queryGroupList($URL,$USERID,$PASSWD,$cgid);
		$isAdmin = 1;
	}
	elsif ($USERTYPE eq 'groupleader') {
		# トップフォルダの場合
		if (!$cgid) {
			$glist2 = TF::GroupList->new();
			# トップフォルダに見えるグループを取得
			$queryGroupStatus = $glist->queryGroupList($URL,$USERID,$PASSWD,'');

			# 所属グループを取得
			$queryGroupStatus2 = $glist2->queryAvailableGroupList($URL,$USERID,$PASSWD);
		}
		# 2階層目以降の場合
		else {
			$queryGroupStatus = $glist->queryGroupList($URL,$USERID,$PASSWD,$cgid);
		}
		$isLeader = 1;
	}
	else {
		$queryGroupStatus = $glist->queryAvailableGroupList($URL,$USERID,$PASSWD);
	}

	my $enc_cgid;
	my $isShowLog = undef;
	my $gid;
	my %grouph;
	if ($queryGroupStatus == 207) {
		foreach ($glist->getIDList()) {
			$gid = $_;

			# カレントのグループと同じグループは除外(親フォルダなので)
			if ($gid eq $cgid) {
				next;
			}
			$enc_cgid = TF::CommonUtils::encipherNumericValue($gid);
			$isShowLog = 0;

			if ($isAdmin || $isLeader) {
				$isShowLog = 1;	# 常にログ表示可能
			}
			else {
				# 非アクティブグループは表示しない (一般ユーザの場合)
				if (!$glist->isActive($gid)) {
					next;
				}
				$isShowLog = ($glist->hasOplogConstraints($gid) && $use_grpconstraints) ? 0 : 1;
			}
			$grouph{$gid} = 1;	# ハッシュに記録
			push( @paramarray, {	id => $enc_cgid,
									name => $glist->getName($gid),
									isShowLog => $isShowLog,
									isOwner => ($isAdmin || $isLeader) ? 1 : 0,
									epgid  => $ecgid,
									grpimg => $GRP_IMG,
									grpalt => $GRP_ALT,
									pagetitle => $PAGETITLE,
									groupleader => ($TF_GROUPLEADER eq 'on') ? 1 : 0,
									ownername => $glist->getOwnerName($gid),
								}
				);

		}
	}

	my $ownerid;
	if ($queryGroupStatus2 == 207 && $isLeader) {
		foreach ($glist2->getIDList()) {
			$gid = $_;

			# 既にparamarray に追加されているグループは除外する
			if (%grouph && $grouph{$gid}) {
				next;
			}
			$enc_cgid = TF::CommonUtils::encipherNumericValue($gid);
			$isShowLog = 0;

			# 自身が管理するグループは既にリスティング済みなので除外
			$ownerid = $glist2->getOwnerId($gid);
			if ($ownerid && $ownerid eq $USERID) {
				next;
			}

			# 非アクティブグループは表示しない
			if (!$glist2->isActive($gid)) {
				next;
			}

			# 単なる所属グループであれば、制約に従うこと.
			if (!($glist2->hasOplogConstraints($gid) && $use_grpconstraints)) {
				$isShowLog = 1;
			}
			push( @paramarray, {	id => $enc_cgid,
									name => $glist2->getName($gid),
									isShowLog => $isShowLog,
									isOwner => 0,
									epgid  => $ecgid,
									grpimg => $GRP_IMG,
									grpalt => $GRP_ALT,
									pagetitle => $PAGETITLE,
									groupleader => ($TF_GROUPLEADER eq 'on') ? 1 : 0,
									ownername => $glist->getOwnerName($gid),
								}
				);

		}
	}
	my $REC_FLAG = 0;
	if ($USERTYPE eq 'admin' || $USERTYPE eq 'groupleader') {
		$REC_FLAG = 1;	
	}

	#
	# 画面表示
	#
	showResponse($cgi, $ecgid, $REC_FLAG, \@paramarray);
}

#
# Output response
#
sub showResponse {
    my @emptyarray;

    my $cgi   = shift || undef;
	my $ecgid = shift || '';
	my $REC_FLAG = shift || 0;
    my $paramarray_ref = shift || \@emptyarray;

	my $rec = $cgi->param('recursive') || '';
	my $status = '';
    my $succeeded = 0;

	# Opera はソートできないものとします
	my $isSort = 1;
	if ($USER_AGENT && $USER_AGENT =~ /^Opera\//) {
		$isSort = 0;
	}

	my $logRange =	{
						TODAY     => "selected",
						YESTERDAY => "",
						LASTWEEK  => "",
						THISMONTH => "",
						LASTMONTH => "",
					};
	my $hidLogRange = $cgi->param('hidLogRange');
	if ($hidLogRange) {
		$logRange->{$hidLogRange} = "selected";
	}

    if( $cgi ) {
        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(	grouploop => $paramarray_ref,
									brandname => $BRAND,
									pagetitle => $PAGETITLE,
									pageimg   => $PAGEIMG,
									grpname   => $GRP_ALT,
									isSort    => $isSort,
									epgid     => $ecgid,
									REC		  => $rec,
									REC_FLAG  => $REC_FLAG,
									lgTodaySelected     => $logRange->{TODAY},
									lgYesderdaySelected => $logRange->{YESTERDAY},
									lgLastWeekSelected  => $logRange->{LASTWEEK},
									lgThisMonthSelected => $logRange->{THISMONTH},
									lgLastMonthSelected => $logRange->{LASTMONTH},
									groupleader => ($TF_GROUPLEADER eq 'on') ? 1 : 0,
								);
				print $cgi->header( -charset => 'utf-8' );
				print $htmltmpl->output;
				$succeeded = 1;
			}
			else {
				$status = $ERRORTABLE->{templateError} . '<br/>';
			}
			close TEMPLATE;
		}
		else {
			$status = $ERRORTABLE->{readTemplateError} . '<br/>';
		}
	}
	else {
		$status = $ERRORTABLE->{CGIError} . '<br/>';
	}

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

