﻿#!/usr/bin/perl

####                                             ####
####   画像転送量上限警告機能付imagemonitor.cgi  ####
####                                             ####

#### 07/01/24 [ver.1.00]  imagemonitor.cgi create
#### 07/06/11 [ver.1.10]  警告機能(画像転送量上限ほか)追加
#### 07/10/02 [ver.1.11]  月をまたがる時の警告表示不具合訂正
#### 07/10/18 [ver.1.12]  サーバ使用量表示追加
#### 07/11/28 [ver.1.13]  サーバ使用量表示精度向上および
####					  警告表示改良
#### 07/12/28 [ver.1.13a] 同一画面上に任意の画像を表示
#### 08/02/26 [ver.1.14]  警告機能(バッテリ状態)追加
#### 09/06/29 [ver.1.15]  画像撮影時間と撮影間隔の自動読込機能追加
#### 09/08/13 [ver.1.15a] 撮影情報の自動読込機能追加
#### 10/04/25 [ver.1.16]  警告機能(ステータス状態)追加および
####					  警告機能精度UP
#### 10/06/01 [ver.1.17]  カウント値表示機能追加
#### 11/01/27 [ver.1.18]  リロード用カウントダウンタイマー追加
#### 11/08/01 [ver.1.19]  警告機能(カメラ状態)追加
#### 11/08/03 [ver.2.00]  マルチユーザ対応
#### 11/09/28 [ver.2.01]  カメラ新機種対応
#### 12/01/13 [ver.2.02]  上下分割フレーム採用

#### Environment setup from here ####################

use CGI::Carp qw(fatalsToBrowser);
use File::Basename;
use Cwd qw(abs_path);
use Image::Info 'image_info';

# 日本語設定
require "jcode.pl";

# 設定ファイルの名前
require "config_moni.pl";

# ライブラリファイルの名前
require 'lib/library.pl';

# このスクリプトの名前
#$script = "imagemonitor.cgi";

# このスクリプトのバージョン
$script_ver = "[ver.2.02]";

#### Environment setup till here ####################
&get;

$mode  = $_GET{'mode'};

$mode2 = $_GET{'xxx'};
$debug = "xxx=".$mode2;
$debID = "3556";

#$resetcss = $domain . "style/reset-min.css";

$strHTML = getHtmlHeader();

initialArray();

userCheckMoni();
$script = basename($0) ."?u=".$_GET{'u'};

if($img_mag == ""){
	print "Content-Type: text/html \n\n\n\nNo User Data";
	exit;
}

$camera_flag = 0;
main();
if(grep(/new/,@camera_type)){$camera_flag++; }

if(!$mode){
	print<<"__HTML__";
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-#W3C#DTD HTML 4.01 Frameset#EN" "http:#www.w3.org/TR/html4/frameset.dtd">
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=EUC-JP">
<title>$title1</title>
</head>
<frameset rows="72,*">
<frame src="$script&mode=Headder" name="frame1" frameborder="0" scrolling="no">
<frame src="$script&mode=Display&$debug" name="frame2" frameborder="0">
<noframes>
	このページはフレームを使用しています。
</noframes>
</frameset>
</html>
__HTML__
}
elsif ( $mode eq "Headder" ) {
	$strHTML .= Headder();
}
elsif ( $mode eq "Display" ) {
	$strHTML .= Display(\@strNewImageName,\@strImageDate,\@img_cyc_x,\@img_cyc_x2,\@img_info_x,\@img_stat_x,\@stat_alart,\@alart,\@cntfile2);
}
$strHTML .= getHtmlFooter();

print $strHTML;

undefArray();
exit;

sub getHtmlHeader {
	my $title = shift;

	return <<"__HTML__";
Content-Type: text/html

<html lang="ja">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=EUC-JP">
    <title>
      $title1
    </title>
    <meta http-equiv="content-script-type" content="text/javascript">
    <meta http-equiv="content-style-type" content="text/css">
    <link rel="stylesheet" type="text/css" href="$reset_css">
    <link rel="stylesheet" type="text/css" href="$css">
  </head>
__HTML__
}

sub getHtmlFooter {
	return <<"__HTML__";
  </body>
</html>
__HTML__
}


sub main{

	(@$dir_img_x,@$dir_img_title_x,@$path_img_x,@$path_cgi_x,@$lnk_cgi_x,@$cntfile2) = setData($moni);
	($NowDateTime,$date_todays_files,$date_todays_logs,$date_yesterdays_files,$date_yesterdays_logs,$hour,$min,$sec,@$date_weeks_files) = getTimeData();

	# 最新画像の各要素の取得
	my($i);
	for ($i = 0 ; $i < $moni ; $i++ ) {

		@imglist = ();

		($strNewImageName[$i],$strImageDate[$i],$path_log[$i],$log[$i]) = getData($dir_img_x[$i]);

		if (-f $path_log[$i]){
		# ログファイルが存在する場合

#			# スケジュール表示フラグ又は情報表示フラグがonの場合
			if ($cyc_disp == 1 || $info_disp == 1 || $status_disp == 1){
			# スケジュール表示フラグ又は情報表示フラグ又は状態表示フラグがonの場合
				($img_cyc_x[$i],$img_cyc_x2[$i],$img_info_x[$i],$imgScheduleS[$i],$imgScheduleE[$i],$imgIntervals[$i],$stat_flag[$i],$sche_flag[$i],$camera_type[$i]) = getCycInfo($path_log[$i],$dir_img_x[$i]);
				($img_stat_x[$i],$stat_alart[$i]) = getStatusInfo($dir_img_x[$i],$imgScheduleS[$i],$imgScheduleE[$i],$imgIntervals[$i],$stat_flag[$i],$sche_flag[$i],$hour,$min,$sec,$date_todays_files,$date_yesterdays_files,\@date_weeks_files,$log_err_flag[$i]);
			}

			if ($alart_disp == 1){
			# バッテリ状態警告表示フラグがonの場合
				$alart[$i] = getAlartInfo($path_log[$i],$log[$i],$date_todays_logs,$date_yesterdays_logs);
			}

		}else{
			($img_cyc_x[$i],$img_cyc_x2[$i],$img_info_x[$i],$img_stat_x[$i],$stat_alart[$i],$alart[$i]) = blankInfo();
			$camera_type[$i] = "";
		}

	}

}

sub initialArray{

# 各配列の初期化
@dir_img_x = ();
@dir_img_title_x = ();
@path_img_x = ();
@path_cgi_x = ();
@cntfile = ();
@cntlogfile = ();
@cntfile2 = ();

@strNewImageName = ();
@strImageDate = ();
@path_log = ();
@log = ();

@img_cyc_x = ();
@img_cyc_x2 = ();
@img_info_x = ();
@img_stat_x = ();
@imgScheduleS = ();
@imgScheduleE = ();
@imgIntervals = ();
@img_stat_x = ();
@stat_alart = ();
@alart = ();

}

sub undefArray{

# 各配列の開放
undef(@dir_img_x);
undef(@dir_img_title_x);
undef(@path_img_x);
undef(@path_cgi_x);
undef(@cntfile);
undef(@cntlogfile);
undef(@cntfile2);

undef(@strNewImageName);
undef(@strImageDate);
undef(@path_log);
undef(@log);

undef(@img_cyc_x);
undef(@img_cyc_x2);
undef(@img_info_x);
undef(@img_stat_x);
undef(@imgScheduleS);
undef(@imgScheduleE);
undef(@imgIntervals);
undef(@img_stat_x);
undef(@stat_alart);
undef(@alart);

}

sub blankInfo{

	my($img_cyc_x,$img_cyc_x2,$img_info_x,$img_stat_x,$stat_alart,$alart);

	$img_cyc_x  = "00:00-00:00 [ 0min]";
	$img_cyc_x2 = "&nbsp;";
	$img_info_x = "&nbsp;" . "<br>" ."&nbsp;" ."<br>" ."&nbsp;";

	if($mode2 eq $debID){
		$img_stat_x = "&nbsp;" ."<br>" ."&nbsp;" ."<br>" ."&nbsp;" ."<br>" ."&nbsp;";
	}else{
		$img_stat_x = "&nbsp;";
	}

	$stat_alart = "status_norm";
	$alart = "log_alart4";

return ($img_cyc_x,$img_cyc_x2,$img_info_x,$img_stat_x,$stat_alart,$alart);

}

sub setData{
	my($moni) = @_;

	# 各配列のデータ取得
	for($m = 1 ; $m <= $moni ; $m++ ){
		push(@dir_img_x,${'dir_img_' . $m});
		push(@dir_img_title_x,${'dir_img_title_' . $m});
		push(@path_img_x,${'path_img_' . $m});
		push(@path_cgi_x,${'path_cgi_' . $m});
		push(@lnk_cgi_x,${'lnk_cgi_' .$m});
		push(@cntfile2,${'cnt_file_' . $m});

	}

	return (\@dir_img_x,\@dir_img_title_x,\@path_img_x,\@path_cgi_x,\@lnk_cgi_x,\@cntfile2);

}

sub getTimeData{

# 時間処理
$now = (time);

	# 現在の日付時間の取得
	my( $sec, $min, $hour, $mday, $mon, $year ) = (localtime($now));
		$year += 1900;	$mon += 1;

	$NowDateTime = sprintf("%02d/%02d/%02d  %02d:%02d:%02d", $year, $mon, $mday, $hour, $min, $sec );

	# スクリプト実行当日の画像ファイル用日付取得(Pic)
	$date_todays_files = sprintf("%02d%02d%02d", $year, $mon, $mday );

	# スクリプト実行当日の画像ファイル用日付取得(Log)
	$date_todays_logs = $date_todays_files;

	# スクリプト実行前日から実行一週間前の画像ファイル用日付取得(Pic)
	for ($day_cnt = 0; $day_cnt < 7; $day_cnt++){
		my($l_mday,$l_mon,$l_year) = (localtime($now - (86400 * ($day_cnt + 1))))[3..5];
			$l_year += 1900;	$l_mon += 1;

		$date_weeks_files[$day_cnt] = sprintf("%02d%02d%02d", $l_year, $l_mon, $l_mday );
	}

	# スクリプト実行前日の画像ファイル用日付取得(Pic)
	$date_yesterdays_files = $date_weeks_files[0] ;

	# スクリプト実行前日の画像ファイル用日付取得(Log)
	$date_yesterdays_logs = $date_weeks_files[0] ;

	return($NowDateTime,$date_todays_files,$date_todays_logs,$date_yesterdays_files,$date_yesterdays_logs,$hour,$min,$sec,\@date_weeks_files);
}

sub getSrvRatio{

	my($ChkRoot) = @_;

	# サーバ使用率の算出
	$b_path = abs_path($ChkRoot);
	$total = getDirSize($b_path);
	$UseFileSize = $total / 1048576;

	$UseSrvRatio = sprintf("%5.2f",($UseFileSize / $ServerSize)*100);

	return $UseSrvRatio;
}

sub getFileList{

	my($dir_target,$file_target) = @_;
	@file_list = ();

	# 指定したディレクトリの対象ファイル名一覧取得
	opendir( DH, $dir_target);
	while ( $_ = readdir(DH) ) {
		if ( /$file_target/ ) {
			push( @file_list, $_ );
		}
	}
	closedir DH;

	# 最新の対象ファイルが先頭になるようにソート
	@file_list = sort { $b cmp $a } (@file_list);

	return @file_list;
}

sub getLogList{

	my($path_log,$log_target) = @_;
	@loglist = ();

		# ログファイルを読み込む
		open(IN,($path_log));
		while(<IN>){
			$log_info = $_;
			chop $log_info;

			# ログ中にINFと$log_targetの内容がマッチしたら配列に書き込む
			if ($log_info =~/(INF)/ && $log_info =~/$log_target/){
				push(@loglist,$log_info);


				# 最新のログ情報を先頭にする
				@loglist = sort { $b cmp $a } (@loglist);
			}
		}
		close IN;

	return $loglist[0];

}

sub arrangeArray{

	my($files,$array) = @_;
	my $fileTarget = "";
	my(@tempArray1,@tempArray2,@resultArray) = ();
	
	$fileTarget = $files .'\d{6}.jpg';

	foreach(@$array){
		if ( /^$fileTarget/ ) {
			push( @tempArray1, $_ );
		}
	}

	@tempArray1 =  sort { $b cmp $a } (@tempArray1);
	push(@resultArray,@tempArray1); 

	foreach(@$array){
		if ( /^t$fileTarget/ ) {
			push( @tempArray2, $_ );
		}
	}

	@tempArray2 =  sort { $b cmp $a } (@tempArray2);
	push(@resultArray,@tempArray2); 

	return @resultArray;
}

sub getData{

	my($dir_img_x) = @_;
	my(@imglist,@loglist) = ();
	my($dir_log_x,$dir_log_0);
	my($strNewImageName,$strImageDate,$path_log,$log);

	# 最新画像ファイルの取得
	# 指定したディレクトリの画像ファイルリスト取得
	@imglist = getFileList($dir_img_x,'^\d{14}\.jpg');

		# [0]の最新画像を配列に格納
		$strNewImageName = $imglist[0];
		$strNewImageName =~ m/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2}).jpg/;
		$strImageDate = "$1/$2/$3 $4:$5:$6";

	# 最新ログファイルの取得
	# ログディレクトリの設定
	$dir_log_0 = $dir_img_x;
	$len = length($dir_img_x);
	substr($dir_log_0,$len-4) = "log/";
	$dir_log_x = $dir_log_0;

	# 指定したディレクトリのログファイルリスト取得
	@loglist = getFileList($dir_log_x,'\d{8}\.txt$');

		$log = $loglist[0];

		# ログファイルの設定
		$path_log = $dir_log_x . $log;

	return($strNewImageName,$strImageDate,$path_log,$log);

}

sub getCycInfo{

	my($path_log,$dir_img_x) = @_;
	my($img_cyc_x,$img_info_x,$imgScheduleS,$imgScheduleE,$imgIntervals,$stat_flag,$sche_flag);


		# 画像からのカメラ情報(Exif)取得
		%info = ();
		my @imglist = getFileList($dir_img_x,'^\d{14}\.jpg');
		my $info = image_info($dir_img_x . $imglist[0]);
		my $camera_info = $info->{'Model'};
		jcode::convert(\$camera_info, 'euc');

		# ログ情報のマッチングパターン定義
		$commonScheduleConfPattern = 'Start\((\d{2})\:(\d{2})\)\-End\((\d{2})\:(\d{2})\)\,\sPeriod\((\d{2}|\d{3})\)min';
		$oldScheduleConfPattern = 'min\,\s[\x8E][\xA6-\xDF].+?\:([\x8E\xA1-\xFE]+)\,\sSize\:(\w{3}|\w{4})\,\sZoom\:([\x8E\xA1-\xFE]+)\,\sBright\:([\xA1-\xFE][\xA1-\xFE]+[0-9\(\)\-\+]+)';
		$newScheduleConfPattern = 'min\,\sStop\((\d{2})\:(\d{2})\)\-Restart\((\d{2})\:(\d{2})\)\,\s[\x8E][\xA6-\xDF].+?\:([\x8E\xA1-\xFE]+)';
		$CameraConfPattern = 'Size\:(\w{3}|\w{4})\,\sQuality\:([\x8E\xA1-\xFE]+)\,\sZoom\:([\x8E\xA1-\xFE]+)\,\sBright\:([\xA1-\xFE][\xA1-\xFE]+[0-9\(\)\-\+]+)\,\sWB\:([\x8E\xA1-\xFE]+)';

		# ログ情報の自動読み込み処理(SCHEDULE_CONFIG)
		$ScheduleConf = getLogList($path_log,'SCHEDULE_CONFIG');
		jcode::convert(\$ScheduleConf, 'euc');

		$ScheduleConf =~ m/$commonScheduleConfPattern/;

		$img_cyc_x = "$1:$2-$3:$4 [$5" . "min]";

		# スケジュールを秒数に換算
		$timeCompareS = ($1 * 3600) + ($2 *60);
		$timeCompareE = ($3 * 3600) + ($4 *60);

		$sche_flag = 0;
		if( $timeCompareS > $timeCompareE ){$sche_flag = 1;}

		$imgScheduleS = sprintf("%02d%02d%02d", $1, $2);
		$imgScheduleE = sprintf("%02d%02d%02d", $3, $4);

		$imgIntervals = $5 * 60;
		if( $imgIntervals < 300 ){ $imgIntervals = 300 ;}

		$ScheduleConf =~ m/$oldScheduleConfPattern/;

		$camera_type = "";
		$effect_flag = 0;

		# ログがW32TまたはW53Tのものだった場合
		if(($1 eq "無効") || ($1 eq "有効")){ 

			# カメラ名にかかわらず
			$ScheduleConf =~ m/$oldScheduleConfPattern/;

			$img_cyc_x2= "停止**:**-再開**:**";
			$img_info_x = "$2$3" . "、$4";

			# 状態表示判定基準値
			$stat_flag = 0;
			if( $1 eq "無効" ){$stat_flag = 1;}

		# ログがW32T以外またはW53T以外のものだった場合
		}elsif(($1 ne "無効") || ($1 ne "有効")){

			$ScheduleConf =~ m/$newScheduleConfPattern/;

			$img_cyc_x2= "停止$1:$2-再開$3:$4";

			# 状態表示判定基準値
			$stat_flag = 0;
			if( $5 eq "無効" ){$stat_flag = 1;}

			# カメラ名がW32TまたはW53Tだった場合
			if(($camera_info eq "W32T") || ($camera_info eq "W53T")){

				$effect_flag = 1;

			# カメラ名がW32T以外またはW53T以外だった場合
			}elsif(($camera_info ne "W32T") || ($camera_info ne "W53T")){

				$camera_type = "new";
				$effect_flag = 1;

			}
		}


		# ログ情報の自動読み込み処理(CAMERA_CONFIG)
		$CameraConf = getLogList($path_log,'CAMERA_CONFIG');
		jcode::convert(\$CameraConf, 'euc');

		$CameraConf =~ m/$CameraConfPattern/;

		if($effect_flag == 1){
			$img_info_x = "$1$3" ."、$4" . "<br>" . "画質$2" . "、WB$5" . "、" . $camera_info;
		}else{
			$img_info_x = $img_info_x . "<br>" . "画質$2" . "、WB$5" . "、" . $camera_info;
		}


		# ログ情報の自動読み込み処理(UPLOAD_CONFIG)
		$UploadConf = getLogList($path_log,'UPLOAD_CONFIG');
		jcode::convert(\$UploadConf, 'euc');

		$UploadConf =~ m/TelNo\:(\d{11})/;

		$img_info_x = $img_info_x . "<br>" . "$1";

		

	return($img_cyc_x,$img_cyc_x2,$img_info_x,$imgScheduleS,$imgScheduleE,$imgIntervals,$stat_flag,$sche_flag,$camera_type);

}

sub getStatusInfo{

	my($dir_img_x,$imgScheduleS,$imgScheduleE,$imgIntervals,$stat_flag,$sche_flag,$hour,$min,$sec,$date_todays_files,$date_yesterdays_files,$date_weeks_files) = @_;

	my($result1,$result2,$result3,$result4) = "";
	my(@result1,@result2,@imglist) = ();
	my($img_stat_x,$stat_alart);

	@imglist = getFileList($dir_img_x,'\d{14}\.jpg$');

	@result1 = arrangeArray($date_todays_files,\@imglist);
	$result1= @result1;
	@result2 = arrangeArray($date_yesterdays_files,\@imglist);
	$result2= @result2;

	# スクリプト実行前日から実行一週間前の画像ファイル用日付取得(Pic)
	for ($day_cnt = 1; $day_cnt < 6; $day_cnt++){

		# スクリプト実行何日前に画像がアップしているか算出
		if(grep /^($$date_weeks_files[$day_cnt])([0-9]){6}.jpg/,@imglist){
			++$result3;
			$result4 = $day_cnt + 1;
			last;
		}
	}

# 状態表示ルーチン

	$numThisDayS  = 0;
	$numThisDayE  = 0;
	$numNewestImg = 0;
	$size_flag = 0;

	# 最新画像ファイル名から拡張子を除く
	my $timeNewestImg = substr($result1[0],-10,6);

	# スクリプト実行日のスケジュール開始時刻、スケジュール終了時刻、最新画像時刻、
	# スクリプト実行前日のスケジュール終了時刻からUNIX時を求める
	my($numThisDayS,$numThisDayE,$numNewestImg) = Time2UTime($imgScheduleS,$imgScheduleE,$timeNewestImg);

	# スクリプト実行時刻からUNIX時を求める
	my $numNow = ($hour * 3600) + ($min * 60) + $sec;

	# スケジュール内の最新画像までの撮影枚数($resultの要素数の半分(小数点以下切捨て))算出
	my $numThisDayNewestImg = int($result1 / 2);

	# 前日のスケジュール内の撮影枚数($result2の要素数の半分(小数点以下切捨て))算出
	my $numLastDayNewestImg = int($result2 / 2);

	# スケジュール内の撮影予定枚数(小数点以下切捨て)と撮影予定時間(UNIX時)の算出

	# スケジュールフラグ == 1の時
	if ($sche_flag == 1){
		# 撮影終了時刻 ≦ 現在時刻 ≦ 撮影開始時刻
		if ($numThisDayE <= $numNow && $numNow < $numThisDayS){
			$numProgImg = calcProgImg($numThisDayE,0,$imgIntervals);

		# 0(00:00:00) ≦ 現在時刻 ≦ 撮影終了時刻
		}
		elsif (0 <= $numNow && $numNow <= $numThisDayE){
			$numProgImg = calcProgImg($numNow,0,$imgIntervals);

		# 撮影開始時刻 ≦ 現在時刻 ≦ 86399(23:59:59)
		}
		elsif ($numThisDayS <= $numNow && $numNow <= 86399){
			$numProgImg = calcProgImg(($numNow - $numThisDayS),$numThisDayS,$imgIntervals);

		}

	}
	# スケジュールフラグ == 0の時
	elsif ($sche_flag == 0){

		# 撮影開始時刻 ≦ 現在時刻 ≦ 撮影終了時刻
		if ($numThisDayS <= $numNow && $numNow <= $numThisDayE){
			$numProgImg = calcProgImg(($numNow - $numThisDayS),$numThisDayS,$imgIntervals);

		# 0(00:00:00) ≦ 現在時刻 ≦ 撮影開始時刻
		}
		elsif (0 <= $numNow && $numNow <= $numThisDayS ){
			$numProgImg = calcProgImg(($numThisDayE  - $numThisDayS),$numThisDayS,$imgIntervals);

		# 撮影終了時刻 ≦ 現在時刻 ≦ 86399(23:59:59)
		}
		elsif ($numThisDayE <= $numNow && $numNow <= 86399){
			$numProgImg = calcProgImg(($numThisDayE  - $numThisDayS),$numThisDayS,$imgIntervals);
		}
	}

	if($mode2 eq $debID){
		$statusInfo = infoDebug($numProgImg,$numThisDayNewestImg,$imgEnable,$numNow,$numThisDayS,$numThisDayE,$imgIntervals,$result1);
	} else {
		$statusInfo = "";
	}

###-----------------------------------------------------------------------------
	# ログが不正だった時
#	if ($log_err_flag == 1){
#
#		my($img_cyc_x,$img_info_x,$img_stat_x,$stat_alart,$alart) = blankInfo();
#
	# スケジュール無効だった時
#	} elsif ($stat_flag == 1){
	if ($stat_flag == 1){
			$statusSymbol = "<br>" ." F";
			$img_stat_x = "　スケジュール無効　";
			$stat_alart = "status_alart8";

	# スクリプト実行日に画像がアップされていたら
	} elsif ($result1 >= 1 && $stat_flag == 0){

		# 画像ファイルサイズ合計が設定値(1日の伝送可能最大量×安全係数)内に
		# 収まっているか判定

		# 現時点での伝送容量を算出
		foreach $imgname (@result1){
			$d_size = (-s "$dir_img_x/$imgname");
			$totalsize += $d_size;
		}

		# 設定値を設定
		# 伝送量上限接近警告
		$size_limit_max  = int(($size_limit * 1048576 * 0.8) + 0.5);
		# 伝送量オーバー警告
		$size_limit_max2 = int(($size_limit * 1048576 * 0.95) + 0.5);

		# 画像ファイル合計が設定値を超えているか
			if (($size_limit_max < $totalsize) && ($totalsize <= $size_limit_max2) ){
				$statusSymbol = "<br>" ." X";
				$img_stat_x = "伝送量上限80%";
				$stat_alart = "status_alart4";
				$size_flag = 1;
			} elsif ($size_limit_max2 < $totalsize){
				$statusSymbol = "<br>" ." X";
				$img_stat_x = "伝送量オーバー";
				$stat_alart = "status_alart7";
				$size_flag = 1;
			}

		$totalsize = 0;

		# サイズ警告フラグ == 0の場合
		if ($size_flag == 0 ){

			# 《スクリプト実行日の各条件判断の前提条件1》

			# 撮影開始時刻 ≦ 最新画像時刻 ≦ 撮影終了時刻かつ撮影開始時刻 ≦ 現在時刻 ≦ 撮影終了時刻
			# かつスケジュールフラグ == 0

			# または

			# 撮影開始時刻 ≦ 最新画像時刻 ≦ 86399(23:59:59)かつ撮影開始時刻 ≦ 現在時刻 ≦ 86399(23:59:59)
			# または0(00:00:00) ≦ 最新画像時刻 ≦ 撮影終了時刻かつ0(00:00:00) ≦ 現在時刻 ≦ 撮影終了時刻
			# かつスケジュールフラグ == 1
			if (((($numNewestImg >= $numThisDayS && $numNewestImg <= $numThisDayE ) && ($numNow >= $numThisDayS && $numNow <= $numThisDayE )) && ($sche_flag == 0)) || (((($numNewestImg >= $numThisDayS && $numNewestImg <= 86399) && ($numNow >= $numThisDayS && $numNow <= 86399)) || (($numNewestImg >= 0 && $numNewestImg <= $numThisDayE ) && ($numNow >= 0 && $numNow <= $numThisDayE ))) && ($sche_flag == 1))){

				# 《稼働中の判断条件》
				# 最新画像の撮影時間(UNIX時) ≧ 撮影予定時間(UNIX時)の3分前
				if ($numNewestImg >= ($numProgImg - 180)){
					$statusSymbol = "<br>" ." A";
					$img_stat_x = "稼動中";
					$stat_alart = "status_norm";

				# 《稼動情報取得中の判断条件》
				# 最新画像の撮影時間(UNIX時) ＜ 撮影予定時間(UNIX時)かつ
				# 撮影予定時間(UNIX時)から 5min経過していない
				} elsif (($numNewestImg < ($numProgImg)) && ($numNow <= ($numProgImg + 300))) {
					$statusSymbol = "<br>" ." A";
					$img_stat_x = "稼動情報取得中";
					$stat_alart = "status_alart3";

				# 《画像遅延の判断条件》
				# 最新画像の撮影時間(UNIX時) ＜ 2回前の撮影予定時間(UNIX時)
				} elsif (($numNewestImg < ($numProgImg)) && (($numProgImg - ($imgIntervals * 2)) < $numNewestImg)) {
					$statusSymbol = "<br>" ." A";
					$img_stat_x = "画像伝送遅延の可能性";
					$stat_alart = "status_alart1";

				# 《停止中の判断条件1》
				# スケジュール時間内に停止(最新画像の撮影時間(UNIX時) ≦ 撮影予定時間(UNIX時) ＋ 5min)
				} else {
					$statusSymbol = "<br>" ." A";
					$img_stat_x = "画像伝送停止中(原因調査中)";
					$stat_alart = "status_alart1";
				}


			# 《スケジュール休止中の判断条件1》
			# 当日の撮影終了時刻 ≦ 現在時刻または現在時刻 ≦ 当日の撮影開始時刻
			# かつ最新画像の撮影時間(UNIX時) ≦ 撮影予定時間(UNIX時)
			# または当日の撮影終了時刻 ≦ 最新画像の撮影時間(UNIX時)または最新画像の撮影時間(UNIX時) ≦ 当日の撮影開始時刻
			} elsif ((($numThisDayE <= $numNow ) || ($numThisDayS >= $numNow)) || (($numThisDayE <= $numNewestImg ) || ($numThisDayS >= $numNewestImg))){
				$statusSymbol = "<br>" ." B";
				$img_stat_x = "スケジュール休止中";
				$stat_alart = "status_alart2";

#			# サイズ警告フラグ == 0 本日の撮影枚数 ≦ 撮影予定枚数の場合
#			} elsif ((($numThisDayE <= $numNow ) || ($numThisDayS >= $numNow)) || (($numThisDayE <= $numNewestImg ) || ($numThisDayS >= $numNewestImg)) && ($numThisDayNewestImg <= $imgEnable)){
#				$statusSymbol = "<br>" ." B";
#				# 《スケジュール休止中の判断条件2》
#				# スクリプト実行当日に画像がアップされていない時
#				$img_stat_x = "スケジュール外撮影";
#				$stat_alart = "status_alart2";
			}

		}

	} elsif ((($result1 == 0 && $result2 >= 1) && $result3 >= 1) && (($numThisDayS <= $numNow) && $stat_flag == 0)){
	# スクリプト実行日に画像がアップされていない時
			$statusSymbol = "<br>" ." B";

			# 《画像遅延の判断条件2》
			# 撮影予定枚数 ≦ 2枚の時
			if ($imgEnable <= 2) {
				$statusSymbol = "<br>" ." B";
				$img_stat_x = "画像伝送遅延の可能性";
				$stat_alart = "status_alart1";
			} else {
			# 《停止中の判断条件2》
			# スクリプト実行当日に画像がアップされていない時
				$statusSymbol = "<br>" ." B";
				$img_stat_x = "本日停止中(原因調査中)";
				$stat_alart = "status_alart1";
			}

	} elsif ($result2 >= 1 && $stat_flag == 0){
	# スクリプト実行前日に画像がアップされていた時

		# 《スクリプト実行前日の各条件判断の前提条件》

			# 《スケジュール休止中の判断条件2》
			# 撮影終了時刻 ＜ 現在時刻または、現在時刻 ＜ 撮影開始時刻
			# かつ前日の撮影枚数 ≧ 撮影予定枚数
			if (((($numNow > $numThisDayE) || ($numNow < $numThisDayS))) && ($numLastDayNewestImg >= $imgEnable)){
				$statusSymbol = "<br>" ." C";
				$img_stat_x = "スケジュール休止中";
				$stat_alart = "status_alart2";

			# 《停止中の判断条件3》
			# スクリプト実行当日に画像がアップされていない時
			} else {
				$statusSymbol = "<br>" ." B";
				$img_stat_x = "前日から停止中(原因調査中)";
				$stat_alart = "status_alart1";
			}

	} elsif ($result3 >= 1 && $stat_flag == 0){
	# スクリプト実行２日前から実行一週間前までに画像がアップされていた時

			# 《停止中の判断条件3》
			# スクリプト実行何日前から画像がアップされていないか
			$statusSymbol = "<br>" ." E";
			$img_stat_x = $result4 . "日前から停止中(原因調査中)";
			$stat_alart = "status_alart6";

	} else {
	# スクリプト実行一週間前までに画像がアップされていなかった時
			$statusSymbol = "<br>" ." F";
			$img_stat_x = "稼動情報未取得";
			$stat_alart = "status_alart5";
	}

	if($statusInfo eq ""){ $statusSymbol = "";}

	$img_stat_x = $img_stat_x . $statusSymbol . $statusInfo;

	return($img_stat_x,$stat_alart);
}

sub infoDebug{

	my($numProgImg,$numThisDayNewestImg,$imgEnable,$numNow,$numThisDayS,$numThisDayE,$imgIntervals,$result1) = @_;

		$numProgImg_x = $numProgImg;
		$x_hour = int($numProgImg_x / 3600);
		$numProgImg_x %= 3600;
		$x_min = ($numProgImg_x / 60);
		$numProgImg_x %= 60;
		$x_sec = ($numProgImg_x);

		$x_time = sprintf("%02d:%02d:%02d", $x_hour, $x_min, $x_sec );

		$statusInfo = $numThisDayNewestImg ."X" .$imgEnable ." ".$x_time ."<br>" ." n".$numNow ." s".$numThisDayS ." e".$numThisDayE ."<br>" ." i".$imgIntervals ." r".$result1;

	return $statusInfo;
}

sub calcProgImg{
	my($numTime1,$numTime2,$imgIntervals) = @_;

		# 撮影予定枚数を算出
		$imgEnable = int(abs($numTime1)/($imgIntervals));
		# 撮影予定枚数から撮影予定時間(UNIX時)を算出
		$numProgImg = $numTime2 + (($imgIntervals)* $imgEnable );

	return $numProgImg;
}

sub getAlartInfo{
# バッテリ状態警告表示モード時
	my($path_log,$log,$date_todays_logs,$date_yesterdays_logs) = @_;
	my($logData,@logDataSel);

	# 画像枠の設定
	$img_border = "5";

	my $resultTime = (stat($path_log))[9];
	my($r_mday,$r_mon,$r_year) = (localtime($resultTime))[3..5];
		$r_year += 1900;    $r_mon += 1;

	my $resultDayLog = sprintf("%02d%02d%02d",$r_year,$r_mon,$r_mday);

		# スクリプト実行日又は前日にログファイルがアップされていたら
		if ($log ne "" && ($date_todays_logs == $resultDayLog || $date_yesterdays_logs == $resultDayLog)){
			$alart = "log_norm";

			$BattLevel = getLogList($path_log,'POWER_SUPPLY');

			# バッテリ状態判定(バッテリレベルが2の場合)
			if ($BattLevel =~/(\(2\))/ ){
				$alart = "log_alart2";
			# バッテリ状態判定(バッテリレベルが0又は1の場合)
			} elsif ($BattLevel =~/(\(1\))/ || $BattLevel =~/(\(0\))/){
				$alart = "log_alart1";
			# バッテリ状態判定(バッテリレベルが3又は128の場合)
			} else {
				$alart = "log_alart3";
			}

		} else {
		# スクリプト実行日又は前日にログファイルがアップされていなかった時
			$alart = "log_alart4";
		}

	return ($alart);
}

sub Headder{

# 最新画像にリダイレクト

$strHTML1 = <<"__HTML__";
  <body onLoad="myFunc()" id="Headder">
    <script language="JavaScript" type="text/javascript">
<!--
function open_imagerounder(){
    window.open("$imagerounder_url");
    }
function open_imagecompare(){
    window.open("$imagecompare_url");
    }


// var lefttime で 秒数を指定してください
var lefttime = $refresh_time;

var date2 = new Date();
var xtime = date2.getTime()/1000 + (lefttime);

function myFunc(){

	myD   = new Date();                              // 現在時刻 取得
	myMsec     = (xtime*1000)-myD.getTime();
	myNextDay  = Math.floor(myMsec/(1000*60*60*24)); // カウントダウン用 '日' 取得
	myMsec     -= (myNextDay*(1000*60*60*24));       // 経過秒から'日'を引く
	myNextHour = Math.floor(myMsec/(1000*60*60));    // カウントダウン用 '時' 取得
	myMsec     -= (myNextHour*(1000*60*60));         // 経過秒から'時'を引く
	myNextMin  = Math.floor(myMsec/(1000*60));       // カウントダウン用 '分' 取得
	myMsec     -= (myNextMin*(1000*60));             // 経過秒から'分'を引く
	myNextSec  = Math.floor(myMsec/1000);            // カウントダウン用 '秒' 取得

	if(myNextMin<10){myNextMin2 = "" +  "0" + myNextMin;}
	if(myNextSec<10){myNextSec = "" +  "0" + myNextSec;}

	if((xtime*1000 - myD.getTime()) > 0){
		document.myForm.myFormDate.value = +myNextMin2+"分"+myNextSec+"秒";       // 時間をセット(表示)
		setTimeout("myFunc()",1000);                     // 1秒単位で動かす

	} else {
		location.reload();
		top.frame2.location.href = top.frame2.location.href;
	}

}

// -->
    </script>
    <table width="100%" border="0" cellspacing="0" cellpadding="3">
      <tr>
        <td class="top3">
        </td>
        <td align="center" class="top1">
          $title2
        </td>
        <td class="top3">
          <div align="center">
            <form name="myForm" id="myForm">
              この画面は 
			  <input type="text" name="myFormDate" class="js1" readonly>
               <script language="JavaScript" type="text/javascript">
                  <!--
                       myFunc();
                  // -->
               </script> 後に<br>
              リロードされます。
            </form>
          </div>
        </td>
      </tr>
    </table>
__HTML__

if ($alart_disp == 1){
    # タイトル表示エリアに表示されるタイトル加工
        $numUser = $moni ."ユーザ使用";
}else{
        $numUser = "";
}


if ($alart_disp == 1){
	$UseSrvRatio = getSrvRatio($ChkRoot);
    if ($UseSrvRatio >= 60 && $UseSrvRatio < 80 ){
        $UseSrvRatioDisp = "<td align=\"center\" class=\"top5_1\">サーバ使用率 $UseSrvRatio ％</td>";
    } elsif ($UseSrvRatio >= 80){
        $UseSrvRatioDisp = "<td align=\"center\" class=\"top5_2\">サーバ使用率 $UseSrvRatio ％</td>";
    } else {
        $UseSrvRatioDisp = "<td align=\"center\" class=\"top5\">サーバ使用率 $UseSrvRatio ％</td>";
    }
} else {
$UseSrvRatioDisp = "<td align=\"center\" class=\"top5\"></td>";
}

$strHTML1 .= <<"__HTML__";

    <table width="100%" border="0" cellspacing="0" cellpadding="3">
      <tr>
        <td align="center" class="top5">
          $numUser
        </td>
        <td align="center" class="top4">
          $NowDateTime 現在のアップロード状況
        </td>
	    $UseSrvRatioDisp
      </tr>
    </table>

    <div>
	  <table width="100%" border="0" cellspacing="0" cellpadding="3">
        <tr>
          <td align="right">
            <font size="65%" color="#777777">$script_ver</font>
          </td>
        </tr>
      </table>
__HTML__

return $strHTML1;
exit
}

sub Display{

my($strNewImageName,$strImageDate,$img_cyc_x,$img_cyc_x2,$img_info_x,$img_stat_x,$stat_alart,$alart,$cntfile2) = @_;

$strHTML2 = <<"__HTML__";

      <center>
        <table width="100%" border="0" cellspacing="0" cellpadding="3">
          <tr>
__HTML__

if ($rounder_disp ==1 || $compare_disp == 1){
$strHTML2 .= <<"__HTML__";

            <td align="center">
            <p>
__HTML__

    if ($rounder_disp == 1){
$strHTML2 .= <<"__HTML__";

              <button type="button" onclick="open_imagecompare()" onkeypress="open_imagecompare()" id="button_width">
              自動巡回 </button>
__HTML__
    }
    if ($compare_disp == 1){
$strHTML2 .= <<"__HTML__";

              <button type="button" onclick="open_imagecompare()" onkeypress="open_imagecompare()" id="button_width">
              巡回比較 </button>
__HTML__
    }

$strHTML2 .= <<"__HTML__";

            </p>        
            </td>
          </tr>
        </table>
      </center>
      <center>
        $link_area_a<br>
        <table>
__HTML__

}else{
$strHTML2 .= <<"__HTML__";

      <center>
        $link_area_a<br>
        <table>
__HTML__

}

DISP1:for ( $j = 0; $j < $disp_v; $j++ ){
    $strHTML2 .= <<"__HTML__";
          <tr>
            <td width="$disp_spc">
            </td>

__HTML__

    $ImgCycDisp = "";
    $ImgInfoDisp = "";
    $ImgStatDisp = "";
    $CountDisp = "";

    for ( $ii = 0; $ii < $disp_h; $ii++ ) {
        $jj = $j * $disp_h + $ii;

        if ($jj == $moni){ last DISP1 ;
        }

	if ($alart_disp == 0){ $alart[$jj] = "log_alart0"; }

	if ($cyc_disp == 1){
		if($camera_flag == 0){
	            # スケジュール情報表示
        	        $ImgCycDisp = "<div class=\"imgdate2\">$$img_cyc_x[$jj]</div>";
		} else {
	            # スケジュール情報表示
	                $ImgCycDisp = "<div class=\"imgdate2\">$$img_cyc_x[$jj]</div><div class=\"norm\">$$img_cyc_x2[$jj]</div>";
	        }
	}

        if($info_disp == 1){
            # 撮影情報表示
                $ImgInfoDisp = "<div class=\"norm\">$$img_info_x[$jj]</div>";
        }

        if($status_disp == 1){
            # ステータス情報表示
                $ImgStatDisp = "<div class=\"$$stat_alart[$jj]\">$$img_stat_x[$jj]</div>";
        }

        if($count_disp == 1 && -f $$cntfile2[$jj]){
			($a_cnt[$jj],$t_cnt[$jj],$y_cnt[$jj],$w_cnt[$jj],$lw_cnt[$jj],$m_cnt[$jj],$lm_cnt[$jj]) = getCount($$cntfile2[$jj]);

            # カウンタ情報表示
                $CountDisp = "<div class=\"norm\">$a_cnt[$jj]<br>$t_cnt[$jj]<br>$y_cnt[$jj]<br><br>$w_cnt[$jj]<br>$lw_cnt[$jj]<br>$m_cnt[$jj]<br>$lm_cnt[$jj]</div><br>";
        }

        $strHTML2 .= <<"_HTML_";

            <td>
              <div align="center">
                <br>

                <div class="dirtitle">
                  $dir_img_title_x[$jj]
                </div>
                $ImgCycDisp
                $ImgInfoDisp
                $ImgStatDisp


_HTML_
	if($lnk_cgi_x[$jj] == 1){

        $strHTML2 .= <<"_HTML_";
				<a href="$path_cgi_x[$jj]" target="_blank">
_HTML_

	}
	
        $strHTML2 .= <<"_HTML_";

				  <img src="$path_img_x[$jj]$strNewImageName[$jj]" class="$alart[$jj]" width="$img_width" height="$img_hight" vspace="0">
				</a>
                <div class="$limit[$jj]">
                  $strImageDate[$jj]
                </div>
                <br>
                $CountDisp<br>
              </div>
            </td>
            <td width="$disp_spc">
            </td>
_HTML_

    }

}

$strHTML2 .= <<"__HTML__";
          </tr>
        </table>
        $link_area_b
      </center>
    </div>

__HTML__

return $strHTML2;

}

sub Time2UTime{

	@T2uT = ();
	@num_T2uT = ();

	my @T2uT = @_;

	$t2ut = 0;
	foreach (@T2uT){
		$time[$t2ut] = $_;
		$time[$t2ut] =~ /(\d{2})(\d{2})(\d{2})/;
		$valT2uT[$t2ut] = ($1 * 3600) + ($2 * 60) + $3;
		push(@num_T2uT,$valT2uT[$t2ut]);
		$t2ut = $t2ut + 1;
	}

	return (@num_T2uT);
}

sub getDirSize($path) {
##引数 $pathにはディレクトリ、またはファイルの絶対パスを指定。
	(local $path) = $_[0];
	local $file;
	local @file_list;
	local $dir_size;

	##指定したのがファイルだった場合はサイズを返して終了。
	if (-f  $path) {
		return (-s $path);

	} elsif (-d $path) {
		$basename = basename($path);

	##カレントディレクトリと上位ディレクトリを指している場合はここで終了。
		if ($basename eq '.' || $basename eq '..') {
			return 0;
		}

			##ディレクトリ内のファイル一覧を入手。
		opendir(DIR, "$path");
		@file_list = readdir(DIR);
		closedir(DIR);

		@file_list = sort @file_list;

		foreach $file (@file_list) {
		##ディレクトリ内の各ファイルを引数にして、自分自身を呼び出す。
		$dir_size += getDirSize($path .'/'. $file);
		}
	return $dir_size;

	} else {
		return 0;
	}
}

sub getCount{

	my $countfile2 = shift;
	my $count2;

	open(FILE2, "<$countfile2") || die;
	$count2 = <FILE2>;
	chomp $count2;

	#トータル,1日分,昨日分,今週分,先週分,今月分,先月分
	my($a_count,$day,$y_count,$week,$lw_count,$month,$lm_count) = split(/\t/,$count2);

			($t_count,$dummy)=split(/:/,$day);
			($w_count,$dummy)=split(/:/,$week);
			($m_count,$dummy)=split(/:/,$month);

	close(FILE2);

	# カウント読み込み
	$a_cnt  =  sprintf("合計 %07d", $a_count);
	$t_cnt  =  sprintf("本日 %s%04d", "&nbsp;&nbsp;&nbsp;&nbsp;",$t_count);
	$y_cnt  =  sprintf("昨日 %s%04d", "&nbsp;&nbsp;&nbsp;&nbsp;",$y_count);

	$w_cnt  =  sprintf("今週 %s%04d", "&nbsp;&nbsp;&nbsp;&nbsp;",$w_count);
	$lw_cnt =  sprintf("先週 %s%04d", "&nbsp;&nbsp;&nbsp;&nbsp;",$lw_count);
	$m_cnt  =  sprintf("今月 %07d", $m_count);
	$lm_cnt =  sprintf("先月 %07d", $lm_count);

	return ($a_cnt,$t_cnt,$y_cnt,$w_cnt,$lw_cnt,$m_cnt,$lm_cnt);
}
