#!/usr/bin/perl

;# WebVOTE v3.5 is Free. (c)rescue.ne.jp
;# Scripts Found at: http://www.rescue.ne.jp/
# History
# v3.2 29-Aug-98 浮動小数点(小数点１桁固定小数点形式)処理
# v3.3 06-Sep-98 投票方式およびグラフ処理の変更
# v3.4 07-Jul-99 小数点以下処理のバグ修正
# v3.5 23-Dec-99 2000年対応

#初期設定
###########################################################################################
#●日本語コード変換ライブラリの指定（別に用意します）
require 'jcode.pl';

#●設置したＵＲＬ(http://から正しく記入します)
$cgi = 'http://irworks.jp/cgi-local/vote.cgi';

#●データを記録するファイル
$an_file = "vote.dat";

#●画像バーのＵＲＬ(このCGIから見たパス位置、または http:// から書く)
$gif ='http://irworks.jp/bar.gif';

#●画面設定
$body = '<body bgcolor="#FFCC00" text="#000000" link="#FF00CC" vlink="#FF3366" alink="#3300FF">';

#●バータイトル
$title = '紙ジャケ化希望アンケート';

#●画面冒頭に入れる画面(ＨＴＭＬ式)
$an_title = '

<h1>紙ジャケ化希望アンケート</h1>
<h3>紙ジャケ化を希望するものに投票してください</h3>
みなさんからの投票をお待ちしています。<br>
<a href="http://irworks.jp/kami/index.htm" >紙ジャケ探検隊TOPへ</a><br>

';

#●クッキーを使った簡易２重投稿防止処理をする=1 しない=0
$wck = 0;

#●アンケートファイルが大きくなりすぎないようにする為の最大アンケート可能件数の設定
#　ソート処理を扱うために大きなデータファイルはサーバに多大な負荷を与えてしまいます.
#　それを防止するために記録件数の上限を設定してください. 1000以下のご利用が推奨です.
$rescue = 10000;

#●入力処理方式 標準:post 直接:get
$method = 'post';

###########################################################################################

#時刻取得
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
if ($sec < 10)  { $sec = "0$sec";   }
if ($min < 10)  { $min = "0$min";   }
if ($hour < 10) { $hour = "0$hour"; }
$month = ($mon + 1);

#データ記録用時刻フォーマット
$date = "$hour\:$min\:$sec $month\:$mday\:$year";

#現在時刻表示用
$date_now = "$year年$month月$mday日 $hour時$min分$sec秒";

#データ入力
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }
else { $buffer = $ENV{'QUERY_STRING'}; }

#処理
if ($buffer eq "") { &html_header; &html_form; &html_trailer; }
else { $tnx = "1"; &an_w;&html_header; &html_trailer; }

sub html_header {

	if (!open(DB,"$an_file")) { &error('エラー','データファイルを読み出せません.'); }
	@lines = <DB>;
	close(DB);

	$accesses = @lines;

	#集計最初のデータの投票時刻
	if ($lines[0] =~ /\[(.*)\] (.*)/) {

		$first_date = $1;
		($clock,$day) = split(/ /,$first_date);
		($hour,$minute,$second) = split(/:/,$clock);
		($month,$mday,$year) = split(/:/,$day);
		if ($year < 100) { $year += 1900; }

		$first_date = "$year年$month月$mday日 $hour時$minute分";
	}
	else { $first_date = 0; }

	#集計最後のデータの投票時刻
	if ($lines[($accesses - 1)] =~ /\[(.*)\] (.*)/) {

		$last_date = $1;
		($clock,$day) = split(/ /,$last_date);
		($hour,$minute,$second) = split(/:/,$clock);
		($month,$mday,$year) = split(/:/,$day);
		if ($year < 100) { $year += 1900; }

		$last_date = "$year年$month月$mday日 $hour時$minute分";
	}
	else { $last_date = 0; }

	foreach $line (@lines) {

		if ($line =~ /\[(.*)\] (.*)/) {

			$an = $2;
			if ($an ne ' ' && $an ne '') { push(@AN, $an); }
		}
	}

	$i = 0;

	foreach (@AN) { $ans{($_)[0]}++; $i++; }

	print "Content-type: text/html\n\n";
	print "<html><head><title>$title</title></head>\n";
	print "$body\n";
	print "$an_title<p><hr noshade size=1><p>\n";

	print "全投票数:<i><b>$accesses</b></i>　有効回答数(白票以外):<i><b>$i</b></i><p>\n";
	print "<table width=650 align=left valign=middle bgcolor=#FFFFF0 border=3 cellpadding=0 sellspacing=2 >\n";

	if ($tnx ne "1") { print "<tr align=left valign=middle><th align=left>項目名</th><th align=left>備考</th><th>選択数</th><th>投票</th><th>割合</th><th>グラフ</th><br></tr>\n"; }
	else { print "<tr align=left><th align=left>項目名</th><th align=left>備考</th><th>選択数</th><th>割合</th><th>グラフ</th><br></tr>\n"; }

	foreach (sort { $ans{$b} <=> $ans{$a} } keys %ans) {

		print "<tr>\n";
		$total_ans += $ans{$_};

		$percent_ans = 100 * ($ans{$_} / $i);
		$percent_ans = sprintf("%2.1f",$percent_ans);

		$img = int($percent_ans) * 3;

		if ($tnx ne "1") {

			print "<form method=\"$method\" action=\"$cgi\">\n";
			print "<input type=hidden name=\"write\" value=\"write\">\n";
			print "<input type=hidden name=\"an\" value=\"$_\">\n";

			print "<th align=left valign=middle>$_</th><th align=left valign=middle>$ans{$_}</th nowrap><th><input type=submit value=\"投票\"></th nowrap><th>$percent_ans\%</th nowrap><td 200><img src=\"$gif\" WIDTH=$img HEIGHT=20></td></form>\n";
		}
		else { print "<th align=left valign=middle >$_</th><th align=left valign=middle >$ans{$_}</th><th>$percent_ans\%</th><td nowrap><img src=\"$gif\" WIDTH=$img HEIGHT=20></td>\n"; }

		print "</tr>\n";
	}

	print "</table><br clear=left><hr><br>\n";

	print "<br clear>・<b>$date_now</b> 現在のアンケート集計結果です。<br>\n";

	if ($first_date != 0 && $last_date != 0) {

		print "・これらは[<b>$first_date</b>]から[<b>$last_date</b>]までの集計結果です。<br>\n";
		print "・最大アンケート集計件数： $rescue 件分（これを超えると最新の$rescue件分の集計になります）<p>\n";
	}
}

sub html_trailer {

	print "<p>\n";

	if ($tnx eq "1") {  print "<p><h2>ありがとうございました。</h2>\n"; }

	#著作表示(削除禁止)
	print "<h5 align=right><hr noshade size=1><a href=\"http://www.rescue.ne.jp/\" target=_top>WebVOTE</a></h5>\n";
	print "</body></html>\n";
}

sub html_form {

	print "<form method=\"post\" action=\"$cgi\">\n";
	print "<input type=hidden name=\"write\" value=\"write\">\n";

	if ($i == 0) { print "現在何も登録されていませんので項目を作成してください <br>備考もありましたらお書き入れください。<br><table>
<tr><td>項目名</td><td><input type=\"text\" name=\"an2\" size=\"40\"></td></tr>
<tr><td>備考</td><td><input type=\"text\" name=\"misc\" size=\"80\"></td></tr>
</table>\n"; }
	else { print "該当がなければ追加してください<br>備考もありましたらお書き入れください。<br><table>
<tr><td>項目名</td><td align=left><input type=\"text\" name=\"an2\" size=\"40\"></td></tr>
<tr><td>備考</td><td align=left><input type=\"text\" name=\"misc\" size=\"80\"></td></tr>
</table>\n"; }

	print " <input type=submit value=\"新項目投票\"></form><p>\n";
}

sub an_w {

	@pairs = split(/&/,$buffer);
	foreach $pair (@pairs) {

		($name, $value) = split(/=/, $pair);
		$value =~ tr/+/ /;
		$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
		&jcode'convert(*value,'sjis');

		if ($FORM{'an2'} ne "") {
                  $value =~ s/</&lt;/g;
                  $value =~ s/>/&gt;/g;
		  $value =~ s/\$/＄/g;
		  $value =~ s/\\/￥/g;
                }

		if ($name ne "write") {	$FORM{$name} = $value; }
	}

	if ($FORM{'an'} ne "" && $FORM{'an2'} ne "") { $write = ""; }
	elsif ($FORM{'an'} ne "") { $write = $FORM{'an'}; }
	elsif ($FORM{'an2'} ne "") { $write = "$FORM{'an2'}</th align=left><th align=left  align=left>$FORM{'misc'}"; }

	#重複チェックへ
	if ($wck) { &wcheck; }

	if (!open(LOG,"$an_file")) { &error('エラー','データファイルを読み出せません.'); }
	@lines=<LOG>;
	close(LOG);

	$axs=@lines;
	$rescue2 = ($rescue - 1);

	if ($axs >= $rescue) {

		if (!open(LOG,">$an_file")) { &error('エラー','データファイルに記録できません.'); }
		foreach $axs (1..$rescue2) { print LOG $lines[$axs]; }
	}
	else { if (!open(LOG,">>$an_file")) { &error('エラー','データファイルに記録できません.'); } }

	print LOG "[$date] $write\n";
	close(LOG);
}


sub error {

	print "Content-type: text/html\n\n";
	print "<html><head><title>$title</title></head>\n";
	print "$body\n";
	print "<h2>$_[0]</h2>\n";
	print "<i>$_[1]</i>\n";
	print '<p></body></html>' . "\n";
	exit;
}

sub wcheck {

	#(簡易)複数回投稿防止処理

	@pairs = split(/;/,$ENV{'HTTP_COOKIE'});
	foreach $pair (@pairs) {

		($name, $value) = split(/=/, $pair);
		$name =~ s/ //g;
		$COOKIE{$name} = $value;
	}

	if ($COOKIE{$cgi} eq 'repost_check') { &error('複数投票できません','あなたは既に投票されました.'); }
	print "Set-Cookie: $cgi=repost_check;\n";
}

# end of script.
