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

#┌──────────────────────────────
#│  Ana-Vote v1.2 Type-B(2003/9/29)
#│  Copyright Tink CGI 2003
#│  http://fairyland.cside.com/marine/tinkcgi/
#└──────────────────────────────
#
#=====================================================================
#このたびは「Ana-Vote」をダウンロードしていただきありがとうございます。
#このスクリプトは「Tink CGI」のホームページにある「利用規定」をよく
#読んだ上でご利用下さい。
#=====================================================================
#
#========
#初期設定
#========
#☆設定の注意
#
#１　総ての設定は「"」で囲まれた部分を変更してください。
#２　設定は特に指定が無い限り半角英数字及び半角の記号で行ってください。
#３　変更の際に「"」や「;」などの記号を消してしまわないようご注意ください。
#４　色の指定は16進数表記でしてください（HTML準拠）。
#５　ファイル名を指定する場合、ファイルが「vote.cgi」と同じディレクトリ内に無いときは、ファイルへのパスも指定してください。
#　　パスは、絶対パスでも相対パスでもかまいません。
#
#==========================
#ファイルに関する設定
#==========================
$FileName = "vote.cgi";			#このファイルの名前
$DataFile = "data.dat";			#得票数用ファイルのファイル名
$LogFile = "loglog.csv";			#投票ログ用ファイルのファイル名
$RenzokuFile = "renzokuuuuu.dat";	#連続投票規制用ファイルのファイル名

$maxlog = "999";		#ログファイルの最大保持件数（600件以下推奨）
$comlog = "999";		#コメント用ログファイルの最大保持件数（600件以下推奨）

#==========================
#投票に関する基本設定
#==========================
$mode = "0";						#投票モードの選択　0=エンドレスモード　1=期間限定モード　2=レースモード
$end_date = "2003,12,01,00,00";		#投票終了日時（期間限定モードの場合）　左から「西暦,月,日,時,分」の順に指定（最初の「0」は省略できません。例えば０時５分は「00,05」とします。
$goal_point = "100";				#ゴール得票数（レースモードの場合）

$title_text = "ユーザー様によるキャットフードレビュー";		#タイトル（全角文字可）（ブラウザの左上に表示され、お気に入りへの追加時にデフォルトの名前にもなります）
$title_size = "18";					#タイトルの文字の大きさ 単位はpixel
$title_color = "#FF0099";			#タイトルの色
$title_image = "";					#タイトル用の画像

$top_message = "
<tr>
<td>

<hr>
<b>
一言コメントを添えて投票できる推薦投票所です。<br>
（お名前など個人情報をご記入頂く必要は一切ございません）<br>
コメントを書かなくても投票できます。どんどん投票して、<br>
良かったアイテムを他の方にも教えてあげて下さい。<br>
<br>
エントリー項目に投票したい品目が無ければ、ページ下部<br>
｢項目を追加」で一覧に加える事もできます。<br>
</b>
<hr>
<br>
<br>
■コメントは個々のユーザー様の使用感でお気軽にお書き下さい。<br>
　読む方はあくまでもご参考までに参照下さい。<br>
　そのメーカーのどの品目を使用しているかコメントに書いて頂けると、<br>
　読む方にとってより参考になります。<br><br>
■当店にて取扱の無い製品の項目追加はご遠慮下さい。<br><br>
■レビューと無関係なコメントや当店が当投票所の趣旨に沿わないと判断した<br>
　コメント・投票は削除する場合がございます。<br>
　また、項目が重複している場合は合流させる事があります。<br><br>
■メーカーさんが自社の製品に投票する行為はおやめ下さい。<br><br>
<br>
<br>

<br>

</td>
</tr>
";		
#トップに表示させるメッセージ（全角文字可）HTMLタグ利用可


$homepage = "https://www.yuho-online.jp/index2.php";			#あなたのホームページへのリンクを表示させる場合はパスを指定（http://〜）

$com_mode = "1";		#投票時にコメントを付けられるようにするか　0=しない　1=する

#==========================
#項目の追加に関する設定
#==========================
$user_add = "1";		#投票者による項目の追加を許可するか　0=許可しない　1=許可する
$link_permit = "0";		#項目にリンクを貼ることを許可するか　0=許可しない　1=許可する
$image_permit = "0";	#項目に画像を貼ることを許可するか　　0=許可しない　1=許可する

#==========================
#見た目に関する設定
#==========================
$bgcolor = "#FFFFFF";				#背景色
$textcolor = "#000000";				#文字色
@colors = ('#000080','#800000','#339933','#3C3AFF','#C14BC1','#FF80C0','#FF9900');		#コメントの文字色(色数は増減できます)
$bgimage = "";						#背景用画像（パスとファイル名を指定）

$bar_image = "bar_red_s.gif";		#グラフのバーの画像（パスとファイル名を指定）
$graph = "1";						#グラフの長さ　0=短い　1=普通　2=長い
$hr_color ="#FF0099";				#しきりの色

$link_color = "#6767F5";			#リンクの色
$link_visit = "#6767F5";			#リンクの色（訪問済み）
$link_hover = "#FFB100";			#リンクの色（マウスを合わせた時）

$table_topcolor = "#FF66FF";		#テーブル（表）の表題の背景色
$table_topfont = "#FFFFFF";			#テーブル（表）の表題の文字色
$table_bgcolor1 = "#FFCCFF";		#テーブル（表）の背景色１
$table_bgcolor2 = "#FFFFFF";		#テーブル（表）の背景色２

$com_bgcolor = "";					#コメント表示用テーブルの背景色
$tbwaku_color = "#FF0099";			#コメント表示用テーブルの枠の色
$tbwaku_width = "1";				#コメント表示用テーブルの枠の太さ

$submit_bgcolor = "#FFFFFF";		#ボタンの背景色
$submit_txcolor = "#000000";		#ボタンの文字色
$submit_overcolor = "#EEFFFF";		#ボタンにマウスを合わせたときの色
$submit_outcolor = "#FFFFFF";		#ボタンからマウスを離したときの色（通常はボタンの背景色と同じにします）

#==========================
#データの表示に関する設定
#==========================
$comment_num = "20";		#トップページに表示させるコメントの数
$history = "0";				#投票履歴を表示させるか　0=させない　1=させる
$history_num = "40";		#表示させる投票履歴の数

$cnt_on = "0";				#カウンターを表示させるか　0=させない　1=させる
$cnt_mode = "0";			#同一ホストからの連続アクセスの場合にカウントアップさせるか　0=させる　1=させない
$figure = "8";				#カウンターの桁数
$cnt_color ="#FF0099";		#カウンターの色

#==========================
#投票制限に関する設定
#==========================
$continuity = "1";		#同一ホストからの連続投票を許可するか　0=許可しない　1=許可する
$cookie_time = "1";		#クッキーによる投票制限（時間）　例えば""24"なら24時間の投票制限　"0"にすると制限なし
$cookie_date = "0";		#クッキーによる投票制限（日数）　例えば""3"なら3日間の投票制限　"0"にすると制限なし。日数を指定すると時間の指定は無効になる

$reject_proxy = "0";				#プロクシによる投票を規制をするか　0=規制しない　1=規制する
$reject_acgo = "0";					#教育機関や政府機関からの投票を規制するか　0=規制しない　1=規制する
$reject_free = "0";					#フリープロバイダーからの投票を規制するか　0=規制しない　1=規制する
$reject_host = "";	#その他、投票を規制するホスト（ホスト名又はIPの一部でも可。複数のときは「|」で区切って指定）
$escape_host = "";					#上の４つの投票規制対象に該当しても、特別に投票を許可するホスト（ホスト名又はIPの一部でも可。複数のときは「|」で区切って指定）

$emergency = "1";		#緊急投票停止機能　0=オフ　1=オン　（一時的に投票を停止させたいときに1を指定してアップロードします）


#====================================
#初期設定終わり。以下はプログラムです
#====================================

#==============
#メインルーチン
#==============
if ($bgimage ne ""){
	$bgimage = ("background="."$bgimage");
}
if ($table_bgcolor ne ""){
	$table_bgcolor = ("bgcolor="."$table_bgcolor");
}

#==================
#投票期間のチェック
#==================
if ($mode == "1"){
	&get_date;
	$date_check = "$year$mon$mday$hour$min";
	$end_date2 = $end_date;
	$end_date2 =~ s/[\,]//g;
	if ($date_check >= $end_date2){$emergency = "2";}
}
elsif ($mode == "2"){
	&read_data;
	foreach $data(@Lines){
	    ($name,$point,$link,$image) = split(/\,/,$data);
		if ($point >= $goal_point){$emergency = "2";}
	}
}

#==================
#再投票期間の取得
#==================
$cookie_rejection = "0";
if ($cookie_time != 0 && $cookie_date == "0"){
	$set_cookie_time = $cookie_time;
	$set_cookie_date = "1";
	$revote_mes = "（$cookie_time時間に1回投票できます）";
	$cookie_rejection = "1";
}
elsif ($cookie_date != "0"){
	$set_cookie_time = "24";
	$set_cookie_date = $cookie_date;
	$revote_mes = "（$cookie_date日に1回投票できます）";
	$cookie_rejection = "1";
}
#================================
#ユーザー情報とフォーム情報の取得
#================================
&get_user;
&form_decode;
$zein = 0;
&get_cookie;

#================
#投票規制チェック
#================
$rejection = 0;
&reject;

#==============
#処理の振り分け
#==============

#投票フォームの表示
if ($FORM{'action'} eq "form"){
	&read_renzoku_data;
	&reject;

	if ($rejection == 1){
		$status = "$FORM{'name'}へ投票→ホスト規制による拒否";
		$message = "<font size='class3'>連続投票制限（不正投票防止のため）　なにとぞご容赦ください</font>";
		&show_message;
		exit;
	}
	if ($cookie_rejection == "1" && $zein == 1){
		$status = "$FORM{'name'}へ投票→クッキーによる拒否";
		$message = "<font size = 3>連続投票制限（不正投票防止のため）　なにとぞご容赦ください</font><br><br><br>前回の投票は<br><br><font size = 3>$cook_date</font><br><br>でした<br><br><font size = 3>1時間に1回のみ投票できます。</font><br><br>";
		&show_message;
		exit;
	}else{
		if ($continuity == 0 && $addr eq $renzoku_vote){
			$status = "$FORM{'name'}へ投票→連続投票規制による拒否";
			$message = "<font size='class3'>連続投票制限（不正投票防止のため）　なにとぞご容赦ください</font>";
			&show_message;
			exit;
		}else{
			&show_form;
			exit;
		}
	}
}

#投票された場合の処理
elsif ($FORM{'action'} eq "vote"){
	&read_renzoku_data;
	&reject;

	if ($rejection == 1){
		$status = "ホスト規制による拒否";
		$message = "連続投票制限（不正投票防止のため）　なにとぞご容赦ください";
		&show_message;
		exit;
	}
	if ($cookie_rejection == "1" && $zein == 1){
		$status = "クッキーによる拒否";
		$message = "<font size = 3>連続投票制限（不正投票防止のため）　なにとぞご容赦ください</font><br><br><br>前回の投票は<br><br><font size = 3>$cook_date</font><br><br>でした";
		&show_message;
		exit;
	}else{
		if ($continuity == 0 && $addr eq $renzoku_vote){
			$status = "連続投票規制による拒否";
			$message = "連続投票制限（不正投票防止のため）　なにとぞご容赦ください";
			&show_message;
			exit;
		}else {
			&get_date;
			&read_data;
			foreach $line (@Lines) {
				chop($line);
				($name,$point,$link,$image) = split(/\,/,$line);
				if ($name eq $FORM{'name'}){
					$point++;
					push (@newlines,join(',',$name,$point,$link,$image));
				}else{
					push (@newlines,$line);
				}
			}
			&write_data(@newlines);
			&write_log;
			&set_cookie;
			$renzoku_vote = $addr;
			if ($renzoku_add ne $addr){
				$renzoku_add = "neutral";
			}
			&write_renzoku_data;

			$FORM{'action'} = "";
			$message = "<font class='size3'>$FORM{'name'}に投票しました</font>";
			&show_message;
			exit;
		}
	}
}

#項目追加フォームの表示
elsif ($FORM{'action'} eq "addform"){
	&read_renzoku_data;
	if ($rejection != 1){
		if ($continuity == 1 || $renzoku_add ne $addr){
			&show_add;
			exit;
		}else{
			$status = "項目の追加→連続追加規制による拒否";
			$message = "項目を追加できません";
			&show_message;
			exit;
		}
	}else{
		$status = "項目の追加→ホスト規制による拒否";
		$message = "項目を追加できません";
		&show_message;
		exit;
	}
}

#項目が追加された場合の処理
elsif ($FORM{'action'} eq "add"){
	if ($FORM{'name'} eq ""){
		&show_add;
		exit;
	}
	&read_renzoku_data;
	if ($rejection != 1){
		if ($continuity == 1 || $renzoku_add ne $addr){
			&read_data;
			foreach $data(@Lines){
			    ($name,$point,$link,$image) = split(/\,/,$data);
				if ($name eq $FORM{'name'}){
					$message = "<font class='size3'>$nameはすでにエントリーされています。</font>";
					&show_message;
					exit;
				}
			}
			if ($FORM{'link'} eq "http://"){
				$link = "";
			}else{
				$link = $FORM{'link'};
			}
			if ($FORM{'image'} eq "http://"){
				$image = "";
			}else{
				$image = $FORM{'image'};
			}
		
			$data = "$FORM{'name'},0,$link,$image";
			open(OUT,">> $DataFile");
			print OUT $data,"\n";
			close(OUT);
			
			&get_date;
			&write_log;
			$renzoku_add = $addr;
			&write_renzoku_data;
			$FORM{'action'} = "";
			$message = "<font class='size3'>項目に$nameを追加しました</font>";
			&show_message;
			exit;
		}else{
			$status = "項目の追加→連続追加規制による拒否";
			$message = "<font class='size3'>項目を追加できません</font>";
			&show_message;
			exit;
		}
	}else{
		$status = "項目の追加→ホスト規制による拒否";
		$message = "<font class='size3'>項目を追加できません</font>";
		&show_message;
		exit;
	}
}

#項目別コメント表示の処理
if ($FORM{'action'} eq "comment"){
	$name2 = $FORM['name'];
	&get_comment;
	&get_partcomment;
	if ($write_comment eq ""){$write_comment = "<div align = center>コメントはありません</div>";}
	$message = $write_comment;
	&show_message;
	exit;
}

#総てのコメントを表示する処理
elsif ($FORM{'action'} eq "allcomment"){
	&get_comment;
	undef($write_comment);
	$i = 0;
	while ($all_comment[$i] ne ""){
		$s = ("<font color = $textcolor>".$all_name[$i]." ＞ </font>".$all_comment[$i]."<font size = 2>  ".$all_sex[$i]."　".$all_age[$i]."</font>");
		$write_comment = "$write_comment<font color = $all_color[$i]>$s</font><hr size = 1>";
	$i += 1;
	}
	$message = $write_comment;
	&show_message;
	exit;
}

#投票履歴を表示する処理
elsif ($FORM{'action'} eq "votelog"){
	&get_votelog;
	$message = $votelog;
	&show_message;
	exit;
}

#通常の表示
&read_data;
&get_total;
&get_comment;
&get_top_comment;
&show_main;

exit;

#==========================================
#メインルーチン終わり。以下はサブルーチン
#==========================================

#==========================================
#連続投票防止用データを読み込むサブルーチン
#==========================================
sub read_renzoku_data {

	open(IN,"$RenzokuFile");
		$data = <IN>;
	close(IN);
	chop($data);
	($renzoku_vote,$renzoku_add) = split(/\,/,$data);
}

#==========================================
#連続投票防止用データを書き込むサブルーチン
#==========================================
sub write_renzoku_data {

	$data = join(',',$renzoku_vote,$renzoku_add);
	open(OUT,">$RenzokuFile");
		print OUT $data,"\n";
	close(OUT);
}

#==========================================
#投票データ（表示用）を読み込むサブルーチン
#==========================================
sub read_data {
	open(IN,"$DataFile");
	@Lines=<IN>;
	close(IN);
}

#==========================================
#投票データ（表示用）を書き込むサブルーチン
#==========================================
sub write_data {

	#ロックファイルの作成
	&lock;

	#表示用データを書き込む
	local(@NewLines)=@_;
	local($line);
	
	open(OUT,"> $DataFile");
	foreach $line (@NewLines) {
		print OUT $line,"\n";
	}
	close(OUT);

	#コメントデータを書き込む
	if ($FORM{'comment'} ne ""){

		#ログの最大保持件数を超える場合は古いものからカット
		open(IN,"comment.dat");
			@lines = <IN>;
		close (IN);
		@lines = reverse(@lines);
		$flag = "0";
		while ($comlog <= @lines){
			pop(@lines);
			$flag = "1";
		}

		$name = $FORM{'name'};
		$comment = $FORM{'comment'};
		$sex = $FORM{'sex'};
		$age = $FORM{'age'};
		$color = $FORM{'color'};
	
		$data = join(',',$name,$comment,$sex,$age,$color);
		if ($flag == "0"){
			open(OUT,">> comment.dat");
				print OUT $data,"\n";
			close(OUT);
		}else{
			@lines = reverse(@lines);
			push(@lines,$data);
			open(OUT,"> comment.dat");
				print OUT @lines,"\n";
			close(OUT);
		}
	}

	#ロックファイルの解除
	&unlock;
}

#==========================================
#投票データ（管理用）を書き込むサブルーチン
#==========================================
sub write_log {
	#書き込み番号を取得
	open(IN,"/usr/bin/tail -1 $LogFile |");
	$data=<IN>;
	close(IN);
	$num=(split(/\,/,$data))[0];
	$num++;

	#ログの最大保持件数を超える場合は古いものからカット
	open(IN,"$LogFile");
		@lines = <IN>;
	close (IN);
	@lines = reverse(@lines);
	$flag = "0";
	while ($maxlog <= @lines){
		pop(@lines);
		$flag = "1";
	}

	#投稿内容の取得
	if ($FORM{'action'} eq "add"){
		$name = $FORM{'name'};
		$referer = $FORM{'referer'};
		$comment = "新規";
		$sex = "新規";
		$age = "新規";
	}else{
		$name = $FORM{'name'};
		$referer = $FORM{'referer'};
		$comment = $FORM{'comment'};
		$sex = $FORM{'sex'};
		$age = $FORM{'age'};
	}

	#ロックファイルの作成
	&lock;

	#書き込みをログファイルに書き加える
	$data = join(',',$num,$name,$date,$addr,$host,$agent,$referer,$comment,$sex,$age);
	if ($flag == "0"){
		open(OUT,">> $LogFile");
			print OUT $data,"\n";
		close(OUT);
	}else{
		@lines = reverse(@lines);
		push(@lines,$data);
		open(OUT,"> $LogFile");
			print OUT @lines,"\n";
		close(OUT);
	}
	#ロックファイルの解除
	&unlock;
}

#========================================
#フォームデータをデコードするサブルーチン
#========================================
sub form_decode {
	
	if ($ENV{'REQUEST_METHOD'} eq "POST"){
		read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
	} else {
		$buffer = $ENV{QUERY_STRING};
	}
	@pairs = split(/&/,$buffer);
	foreach (@pairs) {
		($name, $value) = split(/=/, $_);
		$value =~ tr/+/ /;
		$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
		$value =~ s/</&lt;/g;	#htmlタグを禁止する
		$value =~ s/>/&gt;/g;	#htmlタグを禁止する
		$value =~ s/\r//g;		#改行コードの\rを消去
		$FORM{$name} = $value;
	}
}

#==============================
#投票履歴を得るサブルーチン
#==============================
sub get_votelog{
	open(IN,"$LogFile");
	@log = <IN>;
	close(IN);
	@log = reverse(@log);
	$i = 1;
	undef($votelog);
	foreach $data(@log){
		if ($i <= $history_num){
			chop($data);
			($no,$name,$date,$addr,$host,$agent,$comment,$sex,$age) = split(/\,/,$data);
			if ($sex ne "新規"){
				$votelog = $votelog."<br>".$date." ：".$name;
			}
		}
		if ($sex ne "新規"){
			$i++;
		}
	}
	$votelog =~ s/<br>//;
}

#==================================
#コメントを読み込む基礎サブルーチン
#==================================
sub get_comment{
	open(IN,"comment.dat");
	@log = <IN>;
	close(IN);
	@log = reverse(@log);

	undef(@all_comment);
	undef(@all_name);
	undef(@all_sex);
	undef(@all_age);
	undef(@all_color);
	$i = 0;
	foreach $data(@log){
		chop($data);
		($name,$comment,$sex,$age,$color) = split(/\,/,$data);
		$all_comment[$i] = $comment;
		$all_name[$i] = $name;
		$all_sex[$i] = $sex;
		$all_age[$i] = $age;
		$all_color[$i] = $color;
		$i = $i += 1;
	}
}

#================================================
#メインページに表示するコメントを得るサブルーチン
#================================================
sub get_top_comment{
	undef($write_comment);
	$i = 0;
	while ($i <= $comment_num && $all_comment[$i] ne ""){
		$s = ("<font color = $textcolor>".$all_name[$i]." ＞ </font>".$all_comment[$i]."<font size = 2>  ".$all_sex[$i]."　".$all_age[$i]."</font>");
		if ($i == 0){
			$write_comment = "<font color = '$all_color[$i]'>$s</font>";
		}else{
			$write_comment = "$write_comment<br><font color = $all_color[$i]>$s</font>";
		}
	$i += 1;
	}
}

#==================================
#項目別のコメントを得るサブルーチン
#==================================
sub get_partcomment{
	$name2 = $FORM{'name'};
	undef($write_comment);
	$i = 0;
	while ($all_comment[$i] ne ""){
		if ($all_name[$i] eq $name2){
			$s = ("<font color = $textcolor>".$all_name[$i]." ＞ </font>".$all_comment[$i]."<font size = 2>  ".$all_sex[$i]."　".$all_age[$i]."</font>");
			$write_comment = "$write_comment<hr size = 1><font color = $all_color[$i]>$s</font>";
		}
	$i += 1;
	}
	if ($write_comment eq ""){
		$write_comment = "<center><font size='3'>コメントはありません</font></center>";
	}else{
		$write_comment = "$write_comment<hr size = 1>";
		$write_comment =~ s/<hr size = 1>//;
	}
}

#==========================
#総投票数を得るサブルーチン
#==========================
sub get_total{
	$total = 0;
	foreach $data(@Lines){
	    ($name,$point) = split(/\,/,$data);
		$total = $total += $point;
	}
}

#============================
#カウンター処理のサブルーチン
#============================
sub counter{

	#データの読み込み
	undef(@Lines);
	open(IN,"count.dat");
	@Lines = <IN>;
	close(IN);
	($cnt,$cntaddr) = split(/\,/,$Lines[0]);
	chop($cntaddr);

	if ($cntaddr ne $addr || $cnt_mode == 0){
		if ($cnt == ""){$cnt = "0";}
		$cnt ++;
		
		#データの書き込み
		&lock;
		$Lines[0] = join(',',$cnt,$addr);
		open(OUT,"> count.dat");
			foreach $line(@Lines) {
				print OUT $line,"\n";
			}
		close(OUT);
		&unlock;
	}

	while(length($cnt) < $figure) { $cnt = '0' . $cnt; }
	$counter = $cnt;
}

#================================
#HTMLのヘッダーの表示サブルーチン
#================================
sub html_header {

print <<"EOL";
Content-type: text/html

<html>
<head>
<title>$title_text</title>
<meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS">
    <STYLE type="text/css">
    <!--
        body{ font-size: 11pt }
		.size1 {font-size:11px}
		.size2 {font-size:13px}
		.size3 {font-size:14px}
		span {font-size:$title_size}
		a{text-decoration: none;}
		a:link {text-decoration: none; color: "$link_color";}
		a:visited {text-decoration: none; color: "$link_visit";}
		a:hover {text-decoration: none; color: "$link_hover";position: relative; top: 2px; left: 2px;}
		hr {color:$hr_color;}
    -->
    </STYLE>
</head>
<body bgcolor = $bgcolor text = $textcolor $bgimage>
<div align = "center">
EOL

}

#============================
#メインHTML表示のサブルーチン
#============================
sub show_main {

#順位の並べ替え
foreach $data (@Lines){
    $data =~ s/\n$//;
    push(@lines,$data);
    push(@name,(split(/\,/,$data))[1]);
}

sub bykey { $name[$b] <=> $name[$a];}
@sorted = @lines[sort bykey $[..$#lines];

#グラフのセルの長さ
if ($graph == "0"){
	$graph_width = "width = 85";
	$graph_per = 1;
}elsif ($graph == "2"){
	$graph_width = "width = 185";
	$graph_per = 3;
}else{
	$graph_width = "width = 135";
	$graph_per = 2;
}

&html_header;

#ホームページへのリンクとカウンターの表示
if ($homepage ne "" && $cnt_on == '0'){
	print "<div align = center><br><br>[<a href='$homepage'>サイトへ戻る</a>]</div><br>";
}elsif ($homepage ne "" && $cnt_on == '1'){
	&counter;
	print "<div align='left'> [<a href='$homepage'>HomePage</a>]　<font class='size3' face='Arial,verdana,Times New Roman' color='$cnt_color'>$counter</font></div><br>";
}elsif ($homepage eq "" && $cnt_on == '1'){
	&counter;
	print "<div align='left'> <font class='size3' face='Arial,verdana,Times New Roman' color='$cnt_color'>$counter</font></div><br>";
}else{
	print "<br>";
}

#タイトルの表示
if ($title_image ne ""){
	print "<img src = '$title_image'><br><br>";
}else{
	print "<br><br><br><font color=$title_color><span>$title_text</span></FONT><br>";
}
#トップメッセージの表示
print "<table border = 0 class='size2'><tr><td><br><nobr>$top_message</nobr><br></td></tr></table>";

#緊急投票停止機能がオンの場合
if ($emergency == "1"){
	print "<font color = 'red'>ユーザーレビュー機能開始に伴い、この投票所は参照専用となりました。</font><br>
				たくさんの投票、ありがとうございました。<br>
				引き続き<a href='http://www.yuho-online.jp/products/review_list.php?_=1'>こちらのレビュー機能</a>をご活用下さい。<br><br>";
}
elsif ($emergency == "2"){
	print "<table border = 0 width = 285 class='size2'><tr><td><br>投票期間を終了いたしました。<br>投票してくださった皆様ありがとうございました。<br><br></td></tr></table>";
}

print "<table  width = 600 border = 0><tr><td>";
#投票モードの切り替え
if ($mode == "0"){
	print "<table border = '0' width = 100% class = 'size2'><tr><td align = 'left'>投票総数 $total票 $revote_mes</td></tr></table>";
}
elsif ($mode == "1"){
	($end_year,$end_mon,$end_day,$end_hour,$end_min) = split(/,/,$end_date);
	$show_date = "$end_year年$end_mon月$end_day日$end_hour時$end_min分";
	print "<table border = '0' width = 100% class = 'size2'><tr><td align = 'left'>投票総数 $total票 $revote_mes</td>";
	print "<td align = 'right'>[投票締切 $show_date]</td></tr></table>";
}
elsif ($mode == "2"){
	print "<table border = '0' width = 100% class = 'size2'><tr><td align = 'left'>投票総数 $total票 $revote_mes</td>";
	print "<td align = 'right'>【 レースモード $goal_point票獲得で優勝 】</td></tr></table>";
}

print "<table width='600' border='0' cellpadding='2' cellspacing='3' class = 'size2'>";
print "<tr bgcolor = $table_topcolor align = center><td nowrap><font color = $table_topfont>順位</font></td><td nowrap><font color = $table_topfont>エントリー項目</font></td>";
if ($com_mode){
	print "<td nowrap><font color = $table_topfont>得票</font></td><td nowrap><font color = $table_topfont>投票</font></td><td nowrap><font color = $table_topfont>コメント</font></td><td $graph_width><font color = $table_topfont>グラフ</font></td></tr>";
}else{
	print "<td nowrap><font color = $table_topfont>得票</font></td><td nowrap><font color = $table_topfont>投票</font></td><td $graph_width><font color = $table_topfont>グラフ</font></td></tr>";
}

$count = 0;
$for_point = 0;
$for_count = 1;

foreach $data (@sorted) {
    ($name,$point,$link,$image)=split(/\,/,$data);
	$count = $count + 1;
	if ($count % 10 == 1 && $count != 1){
		print "</table><br><TABLE width='600' border='0' cellpadding='2' cellspacing='3' class = 'size2'>";
	}
	if ($mode == "0" || $mode == "1"){
		if ($total == 0){
			$percent = 0;
		}else{
			$percent = $point / $total * 1000;
			$percent = int($percent);
			$percent = $percent / 10;
		}
	}
	elsif ($mode == "2"){
		$percent = $point / $goal_point * 1000;
		$percent = int($percent);
		$percent = $percent / 10;
	}
	$barwidth = $percent * $graph_per / 2;

	#１行ごとに色を変える
	$x = $count % 2;
	if ($x == 0){
		$table_color = $table_bgcolor2;
	}else{
		$table_color = $table_bgcolor1;
	}

	#順位の表示
	print "<form method = 'post' action = './$FileName'><tr bgcolor = $table_color>";
	if ($point == $for_point){
		$i = $for_count;
		print "<td align = 'center' width = '35'>$i</td><td>";
	}else{
		print "<td align = 'center' width = '35'>$count</td><td>";
		$for_count = $count;
	}
	$for_point = $point;

	#項目の表示
	if ($image ne ""){
		print "<img src = '$image'><br>";
	}
	if ($link ne ""){
		print "<a href = '$link' target = '_self'>$name</a></td>";
	}
	else {
		print "$name</td>";
	}

#得票数、投票ボタン、コメント表示ボタンの表示
if ($emergency == "0"){
print <<"EOL";
<td align=right width = "50" nowrap class = "size2">$point</font></td>
<td width = "40" align = center>
<input type=hidden name = "name" value="$name">
<input type = hidden name = "referer" value = "$referer">
<input type=hidden name = "action" value="form">
<input type=submit value = "投票" style = "font-size : 9pt; border-width : 1px 1px 1px 1px ;border-style : outset outset outset outset ;color : $submit_txcolor ;background-color : $submit_bgcolor ;"onmouseover = "this.style.backgroundColor = '$submit_overcolor'" onmouseout = "this.style.backgroundColor='$submit_outcolor'">
</td>
</form>
EOL
}
else {
print <<"EOL";
<td align=right width = "50" nowrap><font size = "3">$point</font></td>
<td width = "40" align = "center">
-
</td>
</form>
EOL
}

if ($com_mode){
	print <<"EOL";
	<form method = "post" action="./$FileName">
	<td width = "40" align = "center">
	<input type=hidden name = "name" value="$name">
	<input type=hidden name = "action" value = "comment">
	<input type=submit value = "表\示" style="font-size : 9pt; border-width : 1px 1px 1px 1px ;border-style : outset outset outset outset ;color : $submit_txcolor ;background-color : $submit_bgcolor ;"onmouseover = "this.style.backgroundColor = '$submit_overcolor'" onmouseout = "this.style.backgroundColor='$submit_outcolor'" >
	</td>
EOL
}

print <<"EOL";
<td $graph_width valign = "middle"	nowrap>
<img src = "$bar_image" width = $barwidth height = "5"> $percent%
</td>
</form>
</tr>
EOL
}

print "</table></td></table>";

#項目の追加を許す場合
if ($user_add == "1" && $emergency == "0"){
print <<"EOL";
<form method = 'post' action='./$FileName'>
<input type=hidden name='action' value='addform'>
<input type = hidden name = 'referer' value = '$referer'>
<input type=submit value='項目を追加' style="font-size : 9pt; border-width : 2px 2px 2px 2px ;border-style : outset outset outset outset ;color : $submit_txcolor ;background-color : $submit_bgcolor ;"onmouseover = "this.style.backgroundColor = '$submit_overcolor'" onmouseout = "this.style.backgroundColor='$submit_outcolor'">
</form>
EOL
}

#コメント有りの場合
if ($com_mode){
	if ($com_bgcolor ne ""){$com_bgcolor = "bgcolor=$com_bgcolor";}
	print <<"EOL";
		<hr width="540" size=1 noshade><br><font size=2>最新のコメント<br><br></font>
		<table width="500" class="size2" $com_bgcolor cellpadding="2" cellspacing="2" style = 'border-left:$tbwaku_width solid $tbwaku_color; border-right:$tbwaku_width solid $tbwaku_color; border-top:$tbwaku_width solid $tbwaku_color; border-bottom:$tbwaku_width solid $tbwaku_color;'><tr><td>
			$write_comment
		</td></tr></table>
		<br><br>
		
		<form method = 'post' action='./$FileName'>
		<input type=hidden name="action" value = "allcomment">
		<input type=submit value="総てのコメントを表\示" style="font-size : 9pt; border-width : 2px 2px 2px 2px ;border-style : outset outset outset outset ;color : $submit_txcolor ;background-color : $submit_bgcolor ;"onmouseover = "this.style.backgroundColor = '$submit_overcolor'" onmouseout = "this.style.backgroundColor='$submit_outcolor'">
		</form>
EOL
}

if ($history == "1"){
	print <<"EOL";
	<form method = 'post' action = './$FileName'>
	<input type = hidden name = 'action' value = 'votelog'>
	<input type = submit value = '投票履歴を表\示' style="font-size : 9pt; border-width : 2px 2px 2px 2px ;border-style : outset outset outset outset ;color : $submit_txcolor ;background-color : $submit_bgcolor ;"onmouseover = "this.style.backgroundColor = '$submit_overcolor'" onmouseout = "this.style.backgroundColor='$submit_outcolor'">
	</form>
EOL
}

print <<"EOL";
	<table width = "90%"><tr><td align = "right">
		<font size = 1><a href = "http://fairyland.cside.com/marine/tinkcgi/" target = "_blank">Ana-Vote1.2 Type-B by Tink CGI</a></font>
	</td></tr></table>
	<br>
	<br></div></body></html>
EOL

}

#==================
#投票フォームの表示
#==================
sub show_form {
$name = $FORM{'name'};
$referer = $FORM{'referer'};

print <<"EOL";
Content-type: text/html

<html>
<head>
<title>投票フォーム</title>
<meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS">
	<style type="text/css">
	<!--
		body,tr,td,th { font-size: 11pt }
		a{text-decoration: none;}
		a:link {text-decoration: none; color: "$link_color";}
		a:visited {text-decoration: none; color: "$link_visit";}
		a:hover {text-decoration: none; color: "$link_hover";position: relative; top: 2px; left: 2px;}
		hr {color:$hr_color;}
	-->
	</style>
EOL

	if ($cookie_rejection){
	print <<"EOL";
<script language = "Javascript">
<!--
	function check_cookie(){
		if (!navigator.cookieEnabled){
			alert("クッキーを有効にして下さい");
			history.go(-1);
		}
	else return "true";
	}
-->
</script>
</head>
<body onLoad='check_cookie()' bgcolor='$bgcolor' text='$textcolor' $bgimage>
EOL
	}else{
		print "</head>\n<body bgcolor='$bgcolor' text='$textcolor' $bgimage>\n";
	}

if ($com_mode){
	print <<"EOL";
<div align="center">
<br>
<table width="425" border="0" height="76">
	<tr align = "center"> <br>
		<td>
		<font class='size3'>$nameに投票します </font><br><br><br>
		
		<form method = "post" action="./$FileName">
		<font size="1">このブランドのどの品目を使っているか、使用感はどうか、などご自由にお書き下さい</font><br>
		<font size="2">コメント
		<input type="text" name="comment" maxlength="200" size="60"><br>（省略可・200文字まで・コメントの文字色↓）<br>
EOL

	$i = 0;
	foreach (0 .. $#colors) {
		if (!$i) {
			print "\t\t<input type='radio' name='color' value='$colors[$_]' checked>\n";
			print "\t\t<font color='$colors[$_]'>★</font>\n";
		} else {
			print "\t\t<input type='radio' name='color' value='$colors[$_]'>\n";
			print "\t\t<font color='$colors[$_]'>★</font>\n";
		}
	$i++;
	}

	#print <<"EOL";
		#<br><br>
		#性別 
		#<select name = "sex">
		#	<option value = "未回答">未回答</option>
		#	<option value = "活動的な猫">活動的な猫</option>
		#	<option value = "おとなしい猫">おとなしい猫</option>
		#	<option value = "フェレット">フェレット</option>
		#</select>
		#　年齢 
		#<select name = "age">
		#	<option value = "未回答">未回答</option>
		#	<option value = "0〜3ヶ月">0〜3ヶ月</option>
		#	<option value = "3〜6ヶ月">3〜6ヶ月</option>
		#	<option value = "6〜12ヶ月">6〜12ヶ月</option>
		#	<option value = "1〜4歳">1〜4歳</option>
		#	<option value = "4〜7歳">4〜7歳</option>
		#	<option value = "7〜10際">7〜10際</option>
		#	<option value = "10〜15歳">10〜15歳</option>
		#	<option value = "15歳〜">15歳〜</option>
		#</select></font>
		print <<"EOL";
		<br>
		<br>
		<br>
		<br>
		<input type = hidden name = "name" value = "$name">
		<input type = hidden name = "referer" value = "$referer">
		<input type = hidden name = "action" value = "vote">
		<font size="1">押して下さい→</font>
		<input type = submit value = "　投　票　" style = "font-size : 9pt; border-width : 1px 1px 1px 1px ;border-style : outset outset outset outset ;color : $submit_txcolor ;background-color : $submit_bgcolor ;"onmouseover = "this.style.backgroundColor = '$submit_overcolor'" onmouseout = "this.style.backgroundColor='$submit_outcolor'">
		</form><br><br>
EOL
}else{
	print <<"EOL";
<div align="center">
<br>
<table width="425" border="0" height="76">
	<tr align = "center"> <br><br>
		<td><font class='size3'>$nameに投票します </font><br><br><br>
		<font size="1">このブランドのどの品目を使っているか、使用感はどうか、などご自由にお書き下さい</font>
		<form method = "post" action="./$FileName">
		<input type = hidden name = "name" value = "$name">
		<input type = hidden name = "referer" value = "$referer">
		<input type = hidden name = "action" value = "vote">
		<font size="1">押して下さい→</font>
		<input type = submit value = "　投　票　" style = "font-size : 9pt; border-width : 1px 1px 1px 1px ;border-style : outset outset outset outset ;color : $submit_txcolor ;background-color : $submit_bgcolor ;"onmouseover = "this.style.backgroundColor = '$submit_overcolor'" onmouseout = "this.style.backgroundColor='$submit_outcolor'">
		</form><br><br>
EOL
}
print <<"EOL";
		<a href="$FileName">やっぱりやめる</a><br><br>
		</td>
	</tr>
</table>
</div>
<table width = "90%">
	<tr>
		<td align = "right">
		<font size = 2><a href = "http://fairyland.cside.com/marine/tinkcgi/" target = "_blank">Ana-Vote1.2 Type-B by Tink CGI</a></font>
		</td>
	</tr>
</table>
<br>
</body>
</html>
EOL
}

#======================
#項目追加フォームの表示
#======================
sub show_add {

&html_header;

print <<"EOL";

<br><br>
<table width="465" border="0" height="76" class = "size3">
	<tr> 
		<td colspan = "2">
			<br><br><p align = "center">新しくエントリー項目を追加します</p>
<br>
<br>
		</td>
	</tr>
	<FORM METHOD = "POST" ACTION="./$FileName">
	<tr align = "left">
		<td align = "center" valign = "top" width = 70>
        	<font size="2">追加項目（アイテム名）</font>
		</td>
		<td>
        	<input type="text" name="name" maxlength="60" size="60">
			<input type = hidden name = "referer" value = "$referer">
			<input type=hidden name = 'action' value = 'add'><br><br>
		</td>
EOL
			#リンクを許可する場合
			if ($link_permit == "1"){
	        	print "<tr valign = 'top'><td align = 'center'>リンク</td><td><input type = 'text' name = 'link' value = '' maxlength = 200 size = 60><font size = 2>（省略可）</font><br><br></td></tr>";
			}
			#画像を許可する場合
			if ($image_permit == "1"){
	        	print "<tr><td align = 'center' valign = 'top'>画像</td><td><input type = 'text' name = 'image' value = 'http://' maxlength = 200 size = 60><font size = 2>（省略可）</font><br><br></td></tr>";
			}

print <<"EOL";
	<br>
	<tr align = "center">
		<td colspan = '2'>
			<INPUT TYPE=SUBMIT VALUE="追加" style = "font-size : 9pt; border-width : 1px 1px 1px 1px ;border-style : outset outset outset outset ;color : $submit_txcolor ;background-color : $submit_bgcolor ;"onmouseover = "this.style.backgroundColor = '$submit_overcolor'" onmouseout = "this.style.backgroundColor='$submit_outcolor'"><br><br><br>
			<a href="$FileName">戻ります</a><br>
			<br><br>
		</td>
	</tr>
	</FORM>
</table>
<table width = "80%"><tr><td align = "right">
	<font size = 2><a href = "http://fairyland.cside.com/marine/tinkcgi/" target = "_blank">Ana-Vote1.2 Type-B by Tink CGI</a></font>
</td></tr></table>
</div>

</BODY>
</HTML>
EOL
}

#==========================
#メッセージ表示用HTMLの表示
#==========================
sub show_message {
if ($FORM{'action'} eq "comment"){
	$mes_title = $FORM{'name'}."へのコメント";
	$mes_width = "width='60%'";
}
elsif ($FORM{'action'} eq "allcomment"){
	$mes_title = "総てのコメント";
	$mes_width = "width='60%'";
}
elsif ($FORM{'action'} eq "votelog"){
	$mes_title = "投票履歴";
}
else{
	$mes_title = "";
	$align = "middle";
}

&html_header;
if ($mes_title ne ""){
	print "<font class='size3'><br><br>$mes_title<br><br>";
}else{
	print "<br><hr noshade size='1' width='80%'><br>";
}
print <<"EOL";
	<table border="0" class='size2' $mes_width><tr align = $align><td><br>
	$message
	</td></tr></table>
	<br><br>
	<a href="$FileName">戻ります</a><br>
	<br><br>
	</font>
	</div>
EOL

if ($mes_title eq ""){
	print "<hr noshade size='1' width='80%'>";
}
print "</body></html>";

}

#==================================
#投票制限対象を判定するサブルーチン
#==================================
sub reject {
	#プロクシによる投票を規制
	if ($reject_proxy == "1"){
		$ip = $host;
		$ip =~ s/[0-9\.]//g;
		if ($ip eq "") {$rejection = 1;}
		if ($host =~ /^firewall|^router|proxy|^prx|cache|delegate|^gate|^gw|^host|^dns|keeper|cust|^mail|^www/i) {$rejection = 1;}
		if ($host !~ /\.jp$/i && $host !~ /\.bbtec\.net$/i) {$rejection = 1;}
		if ($via ne "" || $client ne "") {$rejection = 1;}
	}
	#教育機関、政府機関からの投票を規制
	if ($reject_acgo == "1"){
		if ($host =~ /kencho|pref|\.ac\.jp$|\.go\.jp$/i) {$rejection = 1;}
	}
	#フリープロバイダーからの投票を規制
	if ($reject_free == "1"){
		if ($host =~ /freecom.ne.jp|freeserve.ne.jp|freejpn.com|freenavi.net|livedoor.com/i) {$rejection = 1;}
	}
	#その他個別に規制するホスト
	if ($reject_host ne ""){
		if ($host =~ /$reject_host/i) {$rejection = 1;}
		elsif ($addr =~ /$reject_host/i) {$rejection = 1;}
	}

	#以上の規制に該当しても特別に投票を許可するホスト
	if ($escape_host ne ""){
		if ($host =~ /$escape_host/i) {$rejection = 0;}
		elsif ($addr =~ /$escape_host/i) {$rejection = 0;}
	}
}

#====================================
#書き込んだ日付を取得するサブルーチン
#====================================
sub get_date {
	$ENV{'TZ'} = "JST-9";
	($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
	$year = 1900 + $year;
	$mon++;
	if ($mon  < 10) { $mon  = "0$mon";  }
	if ($mday < 10) { $mday = "0$mday"; }
	if ($hour < 10) { $hour = "0$hour"; }
	if ($min  < 10) { $min  = "0$min";  }
	if ($sec  < 10) { $sec  = "0$sec";  }
	
	$week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday];
	
	# 日時のフォーマット
	$date = "$year/$mon/$mday($week) $hour:$min:$sec";
}

#===============================
#環境変数を取得するサブルーチン
#===============================
sub get_user {
	$addr = $ENV{'REMOTE_ADDR'};
	$host = gethostbyaddr(pack('C4',split(/\./,$addr)),2);
	$client =$ENV{'HTTP_CLIENT_IP'};
	$via = $ENV{'HTTP_VIA'};
	$xfor = $ENV{'HTTP_X_FORWARDED_FOR'};
	$for = $ENV{'HTTP_FORWARDED'};
	$agent = $ENV{'HTTP_USER_AGENT'};
	if ($xfor ne "") {$xfor_name = gethostbyaddr(pack('C4',split(/\./,$xfor)),2) || $xfor; }
	$referer = $ENV{'HTTP_REFERER'};
}

#==============================
#ロックファイル作成サブルーチン
#==============================
sub lock {
	#ロックを生成するディレクトリのパーミッションは 777 に。
	$lockfile = "./vote.lock";

	local($flag) = 0;
	foreach (1 .. 5) {
		if (-e $lockfile) { sleep(1); }
		else {
			open(LOCK,">$lockfile") || &error("Can't create $lockfile");
			close(LOCK);
			$flag = 1;
			last;
		}
	}
	if ($flag == 0) { &error("LOCK is BUSY"); }
}

#==============================
#ロックファイル解除サブルーチン
#==============================
sub unlock {
	if (-e $lockfile) { unlink($lockfile); }
}

#==========================
#クッキーの発行サブルーチン
#==========================
sub set_cookie {
	($secg,$ming,$hourg,$mdayg,$mong,$yearg,
			$wdayg,$ydayg,$isdstg) = gmtime(time + $set_cookie_date * $set_cookie_time * 60 * 60);

	$yearg += 1900;
	if ($secg  < 10) { $secg  = "0$secg";  }
	if ($ming  < 10) { $ming  = "0$ming";  }
	if ($hourg < 10) { $hourg = "0$hourg"; }
	if ($mdayg < 10) { $mdayg = "0$mdayg"; }

	$mong = ('Jan','Feb','Mar','Apr','May',
			'Jun','Jul','Aug','Sep','Oct','Nov','Dec') [$mong];
	$youbi = ('Sunday','Monday','Tuesday',
			'Wednesday','Thursday','Friday','Saturday') [$wdayg];

	$date_gmt = "$youbi, $mdayg\-$mong\-$yearg $hourg:$ming:$secg GMT";
	$cook = "zein\:1,year\:$year,mon\:$mon,mday\:$mday,hour\:$hour,min\:$min,sec\:$sec,week\:$week";

	# クッキーIDは rainbow
	print "Set-Cookie: rainbow = $cook; expires=$date_gmt\n";
}

#==========================
#クッキーを取得サブルーチン
#==========================
sub get_cookie {
	$cookie = $ENV{'HTTP_COOKIE'};

	@pairs = split(/\;/, $cookie);
	foreach $pair (@pairs) {
		local($name, $value) = split(/\=/, $pair);
		$name =~ s/ //g;
		$DUMMY{$name} = $value;
	}
	@pairs = split(/\,/, $DUMMY{'rainbow'});
	foreach $pair (@pairs) {
		local($name, $value) = split(/\:/, $pair);
		$COOKIE{$name} = $value;
	}
	$zein  = $COOKIE{'zein'};
	$cook_year = $COOKIE{'year'};
	$cook_mon = $COOKIE{'mon'};
	$cook_mday = $COOKIE{'mday'};
	$cook_hour = $COOKIE{'hour'};
	$cook_min = $COOKIE{'min'};
	$cook_sec = $COOKIE{'sec'};
	$cook_week = $COOKIE{'week'};
	if ($COOKIE{'year'} ne ""){
		$cook_date = "$cook_year/$cook_mon/$cook_mday（$cook_week） $cook_hour:$cook_min:$cook_sec";
	}
}

#========================
#エラー処理のサブルーチン
#========================
sub error {
	&unlock;
}

