#!/usr/local/bin/perl
#↑Perlのパスをサーバに合わせて記述して下さい。


package AppsPage::Jscntdx;
my $define = {};



#【プログラム情報】
#------------------------------------------------------------------------------#
# (C) Apps Page.
# http://apps.cside.com/
#
# プログラム名 【 JSカウンタDX 】
# バージョン   【 1.5 】#
#



#【ファイル構成図】
#-----------------------------------------------------------------------------#
#
# public_html/
#   │
#   ├ index.html ……………………………… (755) カウンタ呼出しHTML
#   │
#   └ jscntdx/   ……………………………… (755) プログラムディレクトリ
#       ├ cnt.cgi  …………………………… (755) このファイル。
#       ├ layout.cgi   ……………………… (644) レイアウト設定ファイル。
#       └ data.cgi   ………………………… (666) カウント数記録ファイル
#


# ★出力レイアウトを変更するには？★
# 「layout.cgi」をテキストエディタで編集して、サーバへ転送します。
# 「layout.cgi」のフォーマットは以下の通りです。
# 改行を入れる場合、「<br>」などHTMLタグを書込みます。
#
# $(tday) の部分が今日のカウント数に置き換えられます。
# $(yday) の部分が昨日のカウント数に置き換えられます。
# $(total) の部分が累計のカウント数に置き換えられます。


# ★カウント数を初期化するには？★
# 「data.cgi」をテキストエディタで編集して、サーバへ転送します。
# 「data.cgi」のフォーマットは以下の通りです。
#
# １行目は、今日のカウント数
# ２行目は、昨日のカウント数
# ３行目は、累計のカウント数
# ４行目は、８ケタの数字で表す今日の日付。2100年1月1日なら、21000101。
#
# ※今日、昨日のカウント数を初期化する場合、日付も合わせて初期化します。




#【設置環境設定】
#-----------------------------------------------------------------------------#


# ■ファイルロック（flock関数）
# '0' / ロックしない
# '1' / flock関数でロックする#標準
$define->{'FILELOCK'} = '1';


# ■カウンタ最短ケタ数
$define->{'DAYS_FIG'} = 4;


# ■カウンタ最短ケタ数
$define->{'TOTAL_FIG'} = 6;


# ■HTTPヘッダ（通常変更不要）
# 中にはこの項目を変更しないとカウンタを表示できないサーバもあります。
# 詳しくはご利用中のサーバ管理にお訪ね下さい。
# "Content-Type: text/plain\n\n" / *標準
$define->{'HTTP_HEADER'} = "Content-Type: text/plain\n\n";


# ■カウント数記録ファイル（data.cgi）のパス
$define->{'DATA_FILE'} = 'data.cgi';


# ■レイアウトファイル（layout.cgi）のパス
$define->{'LAYOUT'} = 'layout.cgi';


# ▼flock関数の因数

# ■排他ロック（通常変更不要）
$define->{'LOCK_EX'} = '2';


# ■アンロック（通常変更不要）
$define->{'LOCK_UN'} = '8';




#【呼出しタグ】
#-----------------------------------------------------------------------------#

# ファイル構成図どおりに設置した場合、次のタグを
# index.htmlに貼付けてカウンタを呼出せます。
#
# <script language="JavaScript" src="./jscntdx/cnt.cgi"></script>
#


# ファイル構成図とは別の方法で設置した場合、次を参考にどうぞ。
#
# <script language="JavaScript" src="設置アドレス/cnt.cgi"></script>
# 
# カウントしたいページに上記のタグを貼付けてカウンタを呼び出します。
# 設置アドレス部分は、http://〜〜〜/ または、相対パスで指定します。
#
#




#=============================================================================#
#
# これ以下は、変更の必要ありません。
#
#=============================================================================#


#日付け
my($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime(
	time + (60 * 60 * 9)
);
my $now = ($year += 1900).sprintf('%02d',++$mon).sprintf('%02d',$mday);

#カウント
my ( $tday, $yday, $total, $date );
if( !open(CNT,'<'.$define->{'DATA_FILE'}) ) { exit(0); }
if( $define->{'FILELOCK'} && !flock(CNT,$define->{'LOCK_EX'}) ) { exit(0); }
chomp( $tday = readline *CNT );
chomp( $yday = readline *CNT );
chomp( $total = readline *CNT );
chomp( $date = readline *CNT );
if( $date ne $now ) {
	$yday = $tday;
	$tday = 0;
	$date = $now;
}
$tday++;
$total++;

if( !open(CNT,'>'.$define->{'DATA_FILE'}) ) { exit(0); }
print CNT $tday,"\n";
print CNT $yday,"\n";
print CNT $total,"\n";
print CNT $date,"\n";
if( $define->{'FILELOCK'} ) { flock(CNT,$define->{'LOCK_UN'}); }
close(CNT);

#ケタ
$tday = sprintf('%0'.$define->{'DAYS_FIG'}.'d',$tday);
$yday = sprintf('%0'.$define->{'DAYS_FIG'}.'d',$yday);
$total = sprintf('%0'.$define->{'TOTAL_FIG'}.'d',$total);


#レイアウトファイル
my ( $html_code );
if( !open(LAYOUT,'<'.$define->{'LAYOUT'}) ) { exit(0); }
while ( readline *LAYOUT ) { $html_code .=  $_; }
close(LAYOUT);
$html_code =~ s/\'/\\\'/g;
$html_code =~ s/\r\n/\n/g;
$html_code =~ s/\r//g;
$html_code =~ s/\n/ /g;
$html_code =~ s/\$\(tday\)/$tday/g;
$html_code =~ s/\$\(yday\)/$yday/g;
$html_code =~ s/\$\(total\)/$total/g;


#主力
if( $ENV{'SCRIPT_NAME'} =~ /nph\-[^\/\\]+$/ || 
	( $ENV{'MOD_PERL'} && $ENV{'PERL_SEND_HEADER'} ne 'On' )
) {
	print "HTTP/1.1 200 OK\n";
}

print $define->{'HTTP_HEADER'};
print  "document.write('$html_code');\n";

exit(0);




0;
