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


# ↓定義
#-----------------------------------------------------------------------------#
package AppsPage::Txtcnt::Counter;
my $define = {};


#++++++++++++++++++++++++++++#
# 定義の目次             
#++++++++++++++++++++++++++++#
# １：基本設定
# ２：設置環境設定
#++++++++++++++++++++++++++++#




#【１：基本設定】
#-----------------------------------------------------------------------------#


# ■ファイルロック方法
# '0' mkdir関数  / flock関数が使えないサーバ専用
# '1' flock関数  / *標準
# '2' ロックしない
$define->{'LOCK_METHOD'} = '1';


# ※基本的に以上の設定で、サーバへ転送可能です。




#【２：設置環境設定】
#-----------------------------------------------------------------------------#
#
# 以下のの設定項目で、セキュリティ強化や、設置環境特有の状態に変更できますが、
# 分からない場合、変更しない方が無難です。
#


# ▼ディレクトリ構成（ファイル構成図参照）
	# ■ライブラリディレクトリ（このファイルからのパス）
	# ※２項目とも同じ設定
	$define->{'LIB_DIR'} = 'lib/';
	
	# ■データ記録ディレクトリ（このファイルからのパス）
	$define->{'DATA_DIR'} = 'data/';
	
	# ■ロックディレクトリ（このファイルからのパス）
	$define->{'LOCK_DIR'} = 'lock/';
	
	# ■作業用ディレクトリ（このファイルからのパス）
	# 通常、データ記録ディレクトリと同じ。
	$define->{'TMP_DIR'} = 'data/';


# ▼セキュリティ強化
	# ■suExec環境オプション（'0'#標準 / '1' suExec環境限定）
	# '0'#標準の場合、データファイルパーミッションは常に666です。
	# '1'を設定した場合、更新時、元のパーミッションを引継ぐか、644です。
	# ※分からない方、suExec環境でない方は、『絶対に』変更しないで下さい。
	$define->{'SU_MODE'} = '0';


# ▼flock関数の因数（通常変更不要）
	# ■排他ロック
	$define->{'LOCK_EX'} = '2';
	
	# ■アンロック
	$define->{'LOCK_UN'} = '8';




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




sub new { return bless $define; }




# ↓主な処理
#-----------------------------------------------------------------------------#
package AppsPage::Txtcnt::Counter::Countup;


#use strict;
my $this = new();
$this->start;
$this->stop;


sub new {
	my $this = new AppsPage::Txtcnt::Counter::;
	return bless $this;
}


# →処理開始
sub start {
	my $this = shift;
	
	
	#基本的なライブラリ
	require($this->{'LIB_DIR'}.'modus/OO.cgi');
	require($this->{'LIB_DIR'}.'modus/TytiCnt2.cgi');
	require($this->{'LIB_DIR'}.'modus/Filelock.cgi');
	
	
	#ファイルロック
	$this->{'lock'} = new AppsPage::Txtcnt::Filelock::(
		$this->{'LOCK_METHOD'},
		$this->{'LOCK_DIR'},
		'flock',
		$this->{'LOCK_EX'},
		1,
		$this->{'LOCK_UN'}
	);
	
	
	#カウンタ
	$this->{'counter'} = new AppsPage::Txtcnt::TytiCnt2::(
		$this->{'DATA_DIR'}.'counter.cgi',
	);
	
	
	########## 区切 ##########
	
	
	my $check;
	#カウンタの処理
	if( $this->{'lock'}->lock('EX') ) {
		$check = $this->{'counter'}->doCount;
		if( $check eq 2) {
			#日付更新
			require($this->{'LIB_DIR'}.'mode/m_cntupd.cgi');
			if( !$this->doUpdate ) { $this->error(''); }
		}
		$this->{'lock'}->unlock;
	}
	else { $this->error(''); }
	
	
	########## 区切 ##########
	
	#カウンタ出力
	if($check) {
		$this->outHeader;
		my( $komma, $total_fig ) = split(
			/<>/, $this->{'counter'}->{'result'}->{'info'}
		);
		my $total = $this->{'counter'}->{'result'}->{'total'};
		if( $komma ) {
			while( $total =~ s/(\d)(\d\d\d)(?!\d)/$1,$2/g ) { next;}
		}
		else {
			$total = sprintf('%0'.$total_fig.'d',$total);
		}
		
		print  "document.write('$total');\n";
	}
	#エラー出力
	else { $this->error(''); }
}


# →HTTPヘッダ
sub outHeader {
	my $this = shift;
	if( $ENV{'SCRIPT_NAME'} =~ /nph\-[^\/\\]+$/ || 
		( $ENV{'MOD_PERL'} && $ENV{'PERL_SEND_HEADER'} ne 'On' )
	) {
		print "HTTP/1.1 200 OK\n";
	}
	print "Content-Type: text/plain\n\n";
}


# →終了
sub stop {
	my $this = shift;
	$this->{'lock'}->unlock;
	exit(0);
}




# →エラー
sub error {
	my $this = shift;
	$this->{'lock'}->unlock;
	$this->outHeader;
	print  "document.write('ERROR');\n";
	$this->stop;
}




0;
