#!/usr/bin/perl -w
#------------------------------------------------------------------------------
# $Id$
#------------------------------------------------------------------------------
# TeamFile Top page CGI
#
# Copyright (c) BAYBITS LLC. All rights reserved.
#------------------------------------------------------------------------------

use strict;
use utf8;
use TF::CommonUtils;
use TF::SysMsgx;
use HTML::Template;

binmode(STDOUT, ":utf8");

# global
my $LOCATION      = $ENV{'TF_LOCATION'} || '';
my $BRAND         = $ENV{'TF_BRANDNAME'};
my $TF_VERSION    = $ENV{'TF_VERSION'}  || '';
my $USERID        = $ENV{'REMOTE_USER'} || '';
my $PASSWD        = $ENV{'TF_USERPLAINPASSWORD'} || '';
my $USERTYPE      = $ENV{'TF_USERTYPE'} || 'normal';
my $LANGPARAM     = TF::CommonUtils::getLangPriority();
my ($SCHEMA,$SERVER_PORT,$URI_PREFIX) = TF::CommonUtils::getCgiConnectInfo();
my $URL           = $URI_PREFIX . $LOCATION;
my $TEMPLATE_BASE = './tmpl';
my $TEMPLATE_FILE = './tmpl/mainmenu.tmpl.' . $LANGPARAM;
my $PORTAL_FILE   = 'portal.' . $LANGPARAM;
my $HEADER_FILE   = 'header.'. $LANGPARAM;
my $FOOTER_FILE   = 'footer.'. $LANGPARAM;
my $RESULTSTATE   = $ENV{'TF_RESULTSTATE'};
my $IS_EXTENDSYSMSG = ($ENV{'TF_EXTENDSYSMSG'} eq 'on') ? 1 : 0;
my $TF_TOKEN      = $ENV{'TF_TOKEN'} || '';

my $MSGLANG_ja = {
					"  "  => "**",
					"all" => "**",
					"ja"  => "日",
					"en"  => "英",
				  };

my $MSGLANG_en = {
					"  "  => "**",
					"all" => "**",
					"ja"  => "JP",
					"en"  => "EN",
				  };

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


if (!$LOCATION) {
	TF::CommonUtils::showAccessDeny();
	die '';
}

my $LOCATION_NAME = $LOCATION;
$LOCATION_NAME =~ s/\///g;

main();

#
# main 
#
sub main {
	&printHTML();
}

#
# sub
#
sub printHTML {

	my $isPassPolicyError = ($RESULTSTATE) ? 1 : 0;
	my $isPwChangeNow     = 0;
	my $isPwFstProbation  = 0;
	my $isPwProbation     = 0;
	my $isPwLocked        = 0;
	my @head      = ();
	my @potal     = ();
	my @copyright = ();
	my $fname;
	my $hasmsg = undef;
	my $today = &getToday;
	my @msgloop = ();

	if ($RESULTSTATE) {
		if ($RESULTSTATE =~ /^password-changenow/) {
			$isPwChangeNow = 1;
		}
		elsif ($RESULTSTATE =~ /^password-probation; firstlogin=1/) {
			$isPwFstProbation = 1;
		}
		elsif ($RESULTSTATE =~ /^password-probation; firstlogin=0/) {
			$isPwProbation = 1;
		}
		elsif ($RESULTSTATE =~ /^password-expired/) {
			$isPwLocked = 1;
		}
	}

	my $line;
	# header
	$fname = getPage($HEADER_FILE);
	if (open(HTML, "<$fname")) {
		binmode(HTML, ":utf8");
		while ($line = <HTML>) {
			push(@head, { line => &replaceParam($line) });
		}
		close(HTML);
	}

	if ($IS_EXTENDSYSMSG) {
		my $sysmsg = TF::SysMsgx->new();
		my $reqtype = ($USERTYPE eq 'admin') ? 'detaillist' : 'currentmsg';
		my $status = $sysmsg->querySysMsg($URL, $USERID, $PASSWD, $reqtype, undef, $LANGPARAM);
		if ($status == '207') {

			$hasmsg = 1; # found sysmsg
			foreach ( $sysmsg->getIDList() ) {
				if ( $sysmsg->isExists($_)) {
					# 旧システム対応 題名が無い場合は本文を使う
					# FIXME 本文は長すぎる為適当なところで切り捨ててください
					my $subject = $sysmsg->getSubject($_);
					my $msg     = $sysmsg->getMsg($_);
					my $lang    = $sysmsg->getLang($_);
					push( @msgloop, {	id     =>  $_,
										msg    => ($subject && $subject ne '') ? $subject : $msg,
										hasbody=> ($msg) ? 1 : 0,
										date   => &formatTime($sysmsg->getCreationdt($_)),
										location => $LOCATION,
										isEdit => ($USERTYPE eq 'admin') ? 1:0,
										active => $sysmsg->isActive($_),
										lang   => &getDisplayLANG($lang),
									}
						);
				}
			}
		}
	}

	# body
	$fname = getPage($PORTAL_FILE);
	if (open(HTML, "<$fname")) {
		binmode(HTML, ":utf8");
		while ($line = <HTML>) {
			push(@potal, { line => &replaceParam($line) });
		}
		close(HTML);
	}

	# footer
	$fname = getPage($FOOTER_FILE);
	if (open(HTML, "<$fname")) {
		binmode(HTML, ":utf8");
		while ($line = <HTML>) {
			push(@copyright, { line => &replaceParam($line) });
		}
		close(HTML);
	}

	if (open(TEMPLATE, "<$TEMPLATE_FILE")) {
		binmode(TEMPLATE, ":utf8");
		my $htmltmpl = HTML::Template->new(	filehandle => *TEMPLATE,
											case_sensitive => 1,
											die_on_bad_params => 0);
		if ($htmltmpl) {
			$htmltmpl->param(	brandname => $BRAND,
								tfversion => $TF_VERSION,
								location => $LOCATION,
								head => \@head,
								potal => \@potal,
								copyright => \@copyright,
								isPassPolicyError => $isPassPolicyError,
								isPwChangeNow => $isPwChangeNow,
								isPwFstProbation => $isPwFstProbation,
								isPwProbation => $isPwProbation,
								isPwLocked => $isPwLocked,
								isExtendSysMsg => $IS_EXTENDSYSMSG,
								hasmsg => $hasmsg,
								msgloop => \@msgloop,
								today => $today,
								isEdit => ($USERTYPE eq 'admin') ? 1 : 0,
								token => $TF_TOKEN,
								);
			print "Content-type: text/html; charset=UTF-8\n\n";
			print $htmltmpl->output;
		}
		close(TEMPLATE);
	}
	else {
		TF::CommonUtils::showTemplateOpenErr($LANGPARAM);
		return;
	}
}

sub replaceParam {
	my $str = shift || undef;
	if (!$str) {
		return '';
	}

	$str =~ s/\@tfversion\@/$TF_VERSION/g;
	$str =~ s/\@brandname\@/$BRAND/g;
	$str =~ s/\@location\@/$LOCATION/g;
	$str =~ s/\@serversettings_cgi\@/$LOCATION\/.cgi-bin\/getsrvicon/g;
	$str =~ s/\@downloadclient_cgi\@/$LOCATION\/.cgi-bin\/downloadclient/g;

	return $str;
}

sub getPage {
	my $name = shift || '';
	my $fname;

	# (1) (location).$name
	$fname = $TEMPLATE_BASE . "/" . $LOCATION_NAME . "." . $name;
	if (-f $fname) {
		return $fname;
	}

	# (2) $name
	$fname = $TEMPLATE_BASE . "/" . $name;

	return $fname;
}

sub formatTime {
	my $epoch = shift || die;

	my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($epoch);
	$year += 1900;
	$mon += 1;
	my @wdays = ();
	if ($LANGPARAM eq 'ja') {
		@wdays = ("日", "月", "火", "水", "木", "金", "土");
	}
	else {
		@wdays = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
	}

	my $ret = sprintf("%04d/%02d/%02d(%s)", $year, $mon, $mday, $wdays[$wday]);

	return $ret;
}

sub getToday {
	return &formatTime(time);
}

sub getDisplayLANG {
	my $lang = shift || undef;
	if (!$lang) { $lang = 'all'; }

	return $MSGLANG->{$lang};
}
