#!/usr/local/bin/perl
# ↑ご利用のプロバイダのPerl(JPerl不可)のあるパスを記述してください
#┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#┃■ CreviceVote 基の型 v2.4.1 (旧 CreviceVote)
#┃■ Copyright (c) 2002-2003 ゆき All rights reserved
#┃■ e-mail:kuwahara@anx.co.jp
#┃■ homepage:http://www1.anx.co.jp/~kuwahara/cgi/
#┃
#┃■ 2002/01/15	着手
#┃   2002/01/16	v0.5	初期バージョン完成
#┃   2002/01/17	v0.7	ベータアップ
#┃   2002/01/18	v1.0	公開
#┃   2002/01/30	v1.1	並べ替え機能追加,投票後の処理の修正,順位表示機能の追加,多重投票拒否機能の見直し,投票ログ機能の追加
#┃   2002/02/01	v1.2	EZWeb(XHTML Basic=WAP2)対応,携帯アクセス時自動モード変更機能,細かい修正
#┃   2002/02/02	v1.3	投票時処理のバグ修正
#┃   2002/02/03	v1.4	投票件数が表示できるように機能追加
#┃   2002/02/03	v1.5	パーセント表示の不具合を修正
#┃   2002/02/04	v1.6	細かい不具合を修正
#┃   2002/02/08	v1.7	表示指定項目追加,パーセント&票数同時表示機能追加,不具合修正,最終投票日時表示機能追加,総投票数表示機能追加
#┃   2002/02/19	v1.8	携帯自動モード変換処理の不具合を修正,フレーム内使用時の不具合を修正,著作権表示の携帯向け最適化
#┃   2002/02/26	v1.9	各種不具合修正,他スクリプトからの投票無効化,投票後の表示ページを設定に追加してメルマガ投票対応
#┃   2002/04/13	v2.0	ヘッダー広告サーバーでの多重投票無効に対する処置
#┃   2002/07/16	v2.1	WAP2関係の細かい修正,フォームの前後のマージンを切り取り,ファイルロック強化,J-Skyで一部の機種で不具合が発生する可能性があるのを修正,結果表示制限機能,未選択投票でデータファイルが更新される不具合を修正
#┃   2002/07/19	v2.1.1	結果表示制限機能の携帯での扱いに関する処理が抜けていたので追加
#┃   2002/07/30	v2.2	携帯自動モード変更時のグラフ用画像パスの不具合の修正とそれに伴い設定も簡易化,色指定グラフがネスケで表示されない不具合を修正,携帯グラフ幅自動調整機能追加,微調整,表示形式追加,iMode&J-Skyアクセス時に配色指定が反映されない不具合を修正,携帯での出力データ圧縮
#┃   2002/08/07	v2.2.1	携帯での投票がうまくいかない不具合を修正
#┃   2002/11/17	v2.3	EZWebアクセス時に配色指定が反映されない不具合を修正,携帯で見にくかったデフォルト配色を変更,細かい修正,画像ボタンとボタンテキスト修正機能追加,グラフ画像パスに関する不具合を修正,
#┃   2003/01/23	v2.4	CGIモード以外や表示形式によって反映されなかった配色設定を修正,SSI設置に関する修正,締め切り機能追加,結果表示機能追加,細かい不具合を修正,JavaScriptモード+Operaでエラーになる不具合を修正,Opera+クッキー関連の不具合を修正
#┃   2003/01/27	v2.4.1	CGIモード + グラフ画像絶対パス指定時にグラフ画像が正しく表示されない不具合を修正
#┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

#┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#┃外部ファイルリンク
#┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
require './lib/jcode.pl';
require './lib/util.pl';
require './lib/cookie.pl';
require './lib/string.pl';
require './lib/mobile.pl';


#┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#┃システム情報（変更必須）
#┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# このスクリプトのパス(URLをフルパスで記述)
$script_path = 'http://cyberbb.com/nttr/cgi-bin/CreviceVote/CreviceVote.cgi';

# 投票後に表示するページのアドレス（通常は不要なので必要なときのみ設定してください。メルマガ等テキストベースからの投票を行うときでCGIモード以外の時は設定必須）
$mode_adr = '';

# 質問メッセージ(タグ利用可)
$msg =<< 'SRC_OF_HTML';		# この下の行から
▼なにが好き？<hr>
SRC_OF_HTML
# この２行上まで（質問メッセージ）

# ページタイトル（「重複投票拒否」指定時必須）
$title = '　▼土浦ラーメン投票';

# 選択肢(タグ利用不可)( ''で囲って , で区切る。個数は自由)
@choice = ( 'しょう油' , 'しお' , 'みそ' , 'ゴマみそ' , '白しょうゆ');

# 選択肢対応色(文字指定でも数値指定でもOKだが数値指定の場合は先頭の#を忘れずに) ''で囲って , で区切る。個数は自由,不足時は繰り返し
@choice_color = ( 'blue' , 'red' , 'green' , 'pink' , 'black');

# グラフ用画像 ''で囲って , で区切る くれぐれもファイル名だけを記述してください　モードによるパスの記述は不要になりました　個数は自由、不足時は循環
# J-Sky端末での画像表示を行いたい場合は同じファイル名で拡張子が png のファイルを用意してください。（設定は gif のままでＯＫです。）
@choice_img = ( 'blue_g.gif' , 'red_g.gif' , 'green_g.gif' , 'pink_g.gif' );
# 注)グラフ表示で "画像表示" を行わない場合は変更不要

# グラフ画像のパス（画像が CreviceVote.cgi と同じ場所におけない場合は相対パスを指定してください。同じ場所にある場合は変更不要）まあ絶対パスでも問題はないけど・・・
$img_path = './';
# 注)グラフ表示で "画像表示" を行わない場合は変更不要


### 基本＆設置関連設定
$mode         = 2;			# モード指定(0:CGI,1:SSI,2:JavaScript)
$ssi_mode     = 0;			# SSIのモードの指定(上記「モード指定」で1:SSIを設定したときのみ設定してください)
							#   0:呼び出し方法が → の場合 <!--#exec cgi=
							#   1:呼び出し方法が → の場合 <!--#exec cmd=
							#   2:呼び出し方法が → の場合 <!--#include virtual=
							#   3:呼び出し方法が → の場合 <!--#include file=
$jump_flg     = 0;			# 投票後にページが戻らない場合は 1 を指定。普通は 0 ※携帯は 0 で無いとダメです
$h_ban_server = 0;			# 先頭部に自動的に広告などが挿入されるサーバーで多重投票拒否設定が効かないときには 1 に変更してください

### 表示形式関連設定
$view_mode    = 0;			# 表示指定
							#   0:項目の横に数値でグラフは下
							#   1:項目下にグラフでその右に数値
							#   2:項目の横に数値でグラフは右（テーブル使うので携帯不可）
							#   3:項目の横にグラフでその右に数値（テーブル使うので携帯不可）
							#   4:項目の下に数値でその下にグラフ表示
							#   20:PCでは2の表示形式で携帯からだと0の表示形式
							#   21:PCでは2の表示形式で携帯からだと1の表示形式
							#   24:PCでは2の表示形式で携帯からだと4の表示形式
							#   30:PCでは3の表示形式で携帯からだと0の表示形式
							#   31:PCでは3の表示形式で携帯からだと1の表示形式
							#   34:PCでは3の表示形式で携帯からだと4の表示形式
$graph_flg    = 2;			# グラフ指定(0:非表示,1:色表示,2:画像表示)	※色指定はテーブルを使っているので携帯では不可->自動で切り替わります
$graph_height = 12;			# グラフの縦幅(px)※表示指定により下限が文字サイズになる可能性があります
$graph_width  = 100;		        # グラフの横幅(px)※グラフの幅の計算に使用します
$num_v        = 3;			# 数値表示指定(0:表示無し,1:パーセント表示,2:投票数表示,3:パーセントと票数)
$nowrap_flg   = 1;			# 自動改行フラグ(0:自動改行しない,1:自動改行する)
$sort_mode    = 0;			# 並べ替え指定(0:並べ替え無し,1:降順,2:昇順)
$rank_flg     = 2;			# 順位表示指定(0:表示しない,1:表示する(同位があった場合は番号が飛ぶ),2:表示する(同位があっても番号は飛ばない))
$last_vote_v  = 1;			# 最終投票日時表示指定(0:表示しない,1:表示する)
$total_vote_v = 1;			# 総投票数表示指定(0:表示しない,1:表示する)
$m_expand     = 100;		# 携帯からのアクセス時にグラフの幅を携帯の幅で自動調節します。(0:自動調節しない,1〜100:調節幅(%) 幅一杯にするときは100 半分は50)
$hide_result  = 0;			# 結果表示制限機能 - 投票後にしか結果を表示しない指定（クッキーを利用して確認している為に携帯からアクセスした場合には無効（未投票時でも結果は表示されます）になります）
							#   0:常に結果を表示
							#   1:投票後にしか結果を表示しない
							#   2:締め切り後にしか結果を表示しない
$result_mode  = 0;			# 結果表示指定
							#   0:通常モード
							#   1:結果表示モード（投票は出来ません。過去ログとしてでもお使い下さい。 result.dat にhtmlを出力していますのでそれを過去ログとして使用できます）
							#   2:締め切り後に自動で結果表示モード

### 重複投票拒否設定関連設定
$limit_flg    = 0;			# 重複投票拒否指定(0:拒否しない,1:拒否する) ※携帯不可,ページタイトル設定必須,COOKIE無効クライアント不可
$limit_day    = 31;			# 重複投票拒否期間(日)

### 締め切り関連設定
$vote_limit_flg = 0;							# 締め切り指定
												#   0:締め切り無し
												#   1:日時による締め切り（指定日時に達した時点で締め切り）
												#   2:総票数での締め切り（総票数が指定票に達した時点で締め切り）
												#   3:単票数での締め切り（いずれかの項目が指定票に達した時点で締め切り）
@vote_limit_date = ( 2003 , 1 , 15 , 14 , 43 );	# 締め切り日時（カンマで区切って　年,月,日,時,分　を設定してください）
$vote_limit_cnt = 18;							# 締め切り票数（票数で締め切るときに設定してください）

### 投票ボタン関連設定
$btn_pos      = 'center';			# 投票ボタンの位置です。(left:左,center:中央,right:右)
$btn_cap      = '押してね！';		# ボタンの文字を設定します。(未入力だと「投票」になります)
$btn_img      = '';					# ボタンに画像を使うときは画像のパスを指定します。文字設定より優先です。携帯では利用できません。CGIモードの時以外は 絶対パスを指定

# ヘッダー部（タグ利用可）
$header =<< 'SRC_OF_HTML';		# この下の行から
SRC_OF_HTML
# この２行上まで（ヘッダー）

# フッター部（タグ利用可）
$footer =<< 'SRC_OF_HTML';		# この下の行から
SRC_OF_HTML
# この２行上まで（フッター）


#┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#┃配色設定（変更任意）
#┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
$ec_body_bcolor	= '#ffffc1';						# 背景色
$ec_body_fcolor	= '#8000ff';						# 文字色
$ec_alink		= '#FF0000';						# link色
$ec_avlink		= '#FF0000';						# vlink色
$ec_aalink		= '#FF0000';						# alink色
$ec_ahlink		= '#FF0000';						# hlink色
$ec_size		= '16';								# 文字サイズ(px指定)	


# 以下で上で設定した配色を反映するスタイルシートの設定を行っています
# スタイルシートを知っている方は直接変更されても良いかもしれません（ＰＣとEZWebのみ）
$style =<< "SRC_OF_HTML";
<style type="text/css">
<!--
BODY		{ color : $ec_body_fcolor; background-color : $ec_body_bcolor; font-size : ${ec_size}px; }
A:LINK		{ color : $ec_alink; }
A:VISITED	{ color : $ec_avlink; }
A:HOVER		{ color : $ec_ahlink; }
A:ACTIVE	{ color : $ec_avlink; }
TD			{ font-size : ${ec_size}px; }
-->
</style>
SRC_OF_HTML

$body = "<body bgcolor=\"$ec_body_bcolor\" text=\"$ec_body_fcolor\" link=\"$ec_alink\" alink=\"$ec_aalink\" vlink=\"$ec_avlink\">";

#┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#┃ファイル情報（変更推奨）
#┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
$data_file    = './vote.dat';						# データファイル(自動で作成されます)
$log_file     = './vote.log';						# ログファイル(自動で作成されます)

#┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#┃システム情報（変更不要）
#┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
$ENV{'TZ'}    = "JST-9";							# 標準時間設定（海外サーバー向け？）
$cookiename   = 'CreviceVote_System';				# クッキー用の名前

#┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#┃著作権表示関係設定（変更禁止）
#┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
$soft_ver = '2.4.1';
$soft_name = 'CreviceVote 基の型';
$soft_adr = 'http://www1.anx.co.jp/~kuwahara/cgi/';
$soft_home_title = 'A-10 CGI Arms WebSite ...';


#┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#┃プログラム開始
#┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

	# 端末判別
	$agent = &AgentCheck( 0 );

	# 自動モード変換
	if( $agent == 1 || $agent == 2 || $agent == 3 || $agent == 7 ){
		$mode = 0;
		$mobile_flg = 1;
		$hide_result = 0;
		$jump_flg = 0;
		$graph_flg = 2	if( $graph_flg == 1 );
	}

	# パラメーター解析
	&parseInput();

	# クッキーの取得
	&init_cookie($cookiename);

	$method = ( $agent == 2 ) ? "get" : "post";

	if( $in{'mode'} eq "" ){				&default_page();	}
	if( $in{'mode'} eq "vote" ){			&vote();			}

	if( $mode == 0 ){
		# CGIモード
		if( $in{'mode'} ne "vote" ){
			if( $agent == 1 || $agent == 2 ){
				&compact_buf();
			}elsif( $agent == 3 || $agent == 7 ){
				&convert_mobile( \$out_buf );
			}
		}
		printf( "Content-Length: %d\n" , length( $out_buf ) )		if( $agent == 0 || $agent == 1 );
		print "Content-type: text/html\n\n"							if( $in{'mode'} ne "vote" );
		print $out_buf;
	}elsif( $mode == 1 ){
		# SSIモード
		print "Content-type: text/html\n\n"		if( $ssi_mode != 1 );
		print $out_buf;
	}elsif( $mode == 2 ){
		# JavaScriptモード
		if( $in{'mode'} eq "vote" ){
			print $out_buf;
		}else{
			$out_buf =~ s/\x0D\x0A//g;		$out_buf =~ s/\x0D//g;		$out_buf =~ s/\x0A//g;
			$out_buf =~ s/'/\\'/g;
			print "Content-type: text/html\n\n";
			print "<!--\ndocument.write( '$out_buf' );\n// -->";
		}
	}

exit(0);

#┏━━━━━━━━━━━━━━━━━━━━━━━
#┃■ 表示処理
#┃
#┃呼び出し方法	：
#┃引数			：
#┃戻り値		：
#┃注意事項		：
#┗━━━━━━━━━━━━━━━━━━━━━━━
sub default_page(){

	$vote_max = 0;

	if( -e $data_file ){
		open( FH , "<$data_file" ) or exitError( "データファイルがオープン出来ません(".__LINE__.")" );
		@vote = split(/\t/,<FH>);
		close FH;
		foreach( @vote ){	$vote_cnt += $_;	}
		foreach( 0..$#choice ){	push( @data , "$_\t$choice[$_]\t$vote[$_]" );	$vote_max = $vote[$_]	if( $vote_max < $vote[$_] );	}
	}else{
		foreach( 0..$#choice ){	push( @data , "$_\t$choice[$_]\t0" );	}
		$vote_cnt = 0;
	}

	$result_view = 1	if( $result_mode == 1 || ( $result_mode == 2 && &vote_limit_check() ) );

	if( $hide_result == 1 && $cookie{"$title"} ne "" ){
		$hide_result = 0;
	}elsif( $hide_result == 2 ){
		if( $result_view == 1 ){
			$hide_result = 0;
		}else{
			$hide_result = 1;
		}
	}
#	$hide_result = 0	if( $cookie{"$title"} ne "" );
	$sort_mode = 0		if( $hide_result );
	$rank_flg = 0		if( $hide_result );

	# 画像パス調整
	$img_path = $img_path . "/"		if( !( $img_path =~ m/\/$/ ) );		# 画像パスの最後に / が付いてなければ付加する
	if( $mode != 0 && !( $img_path =~ /^http:/ ) ){						# JavaScript or SSI で 相対パス指定であれば
		( $dir, $base, $ext ) = &split_path( $script_path );			# CGIの設置パスからカレントパスを取得して
		$img_path = $dir . $img_path;									# 画像パスをCGIパス + 画像パス(相対)に修正
	}
	foreach( 0..$#choice_img ){
		$choice_img[$_] = $img_path . $choice_img[$_];
		if( $agent == 2 ){												# J-PHONEで有れば
			( $dir, $base, $ext ) = &split_path( $choice_img[$_] );		# 画像ファイルの拡張子を pngに
			$choice_img[$_] = $dir . $base . '.png';
		}
	}
	
	if( $sort_mode eq "1" || $sort_mode eq "2" ){
		@data = reverse @data;
		@tmp = map{ (split /\t/ )[2] } @data;
		@data = @data[ sort{ $tmp[$a] <=> $tmp[$b] } 0 .. $#tmp ];
		@data = reverse @data		if( $sort_mode eq "1" );
	}

	$sp_path = $script_path;
	$sp_path =~ s/(.*)\/(.*)$/$1\/sp.gif/;

	# グラフ幅調整
	if( $mobile_flg == 1 ){
		$m_width = &GetMobileScaleWidth();
		if( $m_width > 0 ){
			$graph_width = $m_width * ( $m_expand / 100 );
		}
	}

	# 表示形式端末分岐
	if( $view_mode > 10 ){
		if( $mobile_flg == 1 ){
			$view_mode = $view_mode % 10;
		}else{
			$view_mode = int( $view_mode / 10 );
		}
	}

	if( $mode != 0 ){
		$no_cgi_style = " style=\"color : $ec_body_fcolor; background-color : $ec_body_bcolor; font-size : ${ec_size}px;\"";
		$no_cgi_style2 = " color : $ec_body_fcolor; background-color : $ec_body_bcolor; font-size : ${ec_size}px;";
		$no_cgi_style3 = " style=\"color : $ec_body_fcolor; background-color : $ec_body_bcolor; \"";
	}

	$nowrap = " nowrap"	if( $nowrap_flg == 0 );

	if( $agent == 3 || $agent == 7 ){
		# XHTML Basic対応

		open( FH , ">style.css" ) or exitError( "CSSファイルがオープン出来ません(".__LINE__.")" );
		print FH $style;
		close FH;
		$style = "<link rel=\"stylesheet\" href=\"./style.css\" />";

$out_buf .=<< "SRC_OF_HTML";
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//OPENWAVE//DTD XHTML 1.0//EN" http://www.openwave.com/DTD/xhtml-basic.dtd>
<html>
SRC_OF_HTML
	}else{
		$out_buf .= "<html>"		if( $mode == 0 );
	}

	if( $mode == 0 ){
		$out_buf .= "<head>"		if( $agent != 2 );
$out_buf .=<< "SRC_OF_HTML";
<title>$title</title>
SRC_OF_HTML
		if( $agent == 2 ){
			$out_buf .= "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=shift_jis\">";
		}else{
			$out_buf .= "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">";
		}
		$out_buf .= $style			if( $agent == 0 || $agent == 3 || $agent == 7 );
		$out_buf .= "</head>"		if( $agent != 2 );
	}
	$out_buf .= $body				if( $mode == 0 );
	
	if( !$result_view ){
		$out_buf .= "<form method=\"$method\" action=\"$script_path\" target=\"_self\" style=\"margin-bottom : 0px;$no_cgi_style2\">";
	}else{
		$out_buf .= "<div $no_cgi_style>";
	}

$out_buf .=<< "SRC_OF_HTML";
$header
$msg<br>
SRC_OF_HTML

	if( $agent == 3 || $agent == 7 ){
		$out_buf .= "<p style=\"font-size : 80%;text-align : right;\"$no_cgi_style2>";
	}else{
		$out_buf .= "<div align=\"right\"$no_cgi_style3><font size=\"-2\">";
	}
	$out_buf .= "総投票数：$vote_cnt票<br>"													if( $total_vote_v == 1 );
	if( $last_vote_v == 1 && -e $data_file ){
		local( $sec , $min , $hour , $mday , $mon , $year ) = localtime((lstat($data_file))[9]);
		$year += 1900;$mon++;
		if( $mobile_flg == 1 ){
			$out_buf .= sprintf( "最終投票:%d/%02d %d:%02d<br>" , $mon , $mday , $hour , $min );
		}else{
			$out_buf .= sprintf( "最終投票：%04d/%02d/%02d %02d:%02d<br>" , $year , $mon , $mday , $hour , $min );
		}
	}
	if( $agent == 3 || $agent == 7 ){
		$out_buf .= "</p>";
	}else{
		$out_buf .= "</font></div>";
	}

	$out_buf .= "<table border=\"0\"><tbody>"		if( $view_mode == 2 || $view_mode == 3 );

	$rank_cnt = 1;
	$old_value = -1;
	foreach( 0..$#data ){
		local( $no , $item , $value ) = split(/\t/,$data[$_]);
		$out_buf .= "<tr><td$nowrap$no_cgi_style>"		if( $view_mode == 2 || $view_mode == 3 );

		$ritu = ( $value == 0 and $vote_cnt == 0 ) ? 0 : $value / $vote_cnt  * 100;
		$g_ritu = ( $value == 0 and $vote_cnt == 0 ) ? 0 : $value / $vote_max  * 100;
		$par = sprintf( "%3.1f" , $ritu );

		$now_rank = $rank_cnt	if( $value != $old_value );
#		$out_buf .= sprintf( "<input type=\"radio\" name=\"select\" value=\"$no\">%s$item" , $rank_flg ne "0" && $sort_mode ne "0" ? ( $value == $old_value ? "･" x ( length( $now_rank ) + 2 ) : "[".$rank_cnt."]" ) : "" );
		$out_buf .= "<input type=\"radio\" name=\"select\" value=\"$no\">"		if( !$result_view );
		$out_buf .= sprintf( "%s$item" , $rank_flg ne "0" && $sort_mode ne "0" ? ( $value == $old_value ? "･" x ( length( $now_rank ) + 2 ) : "[".$rank_cnt."]" ) : "" );
		$out_buf .= "<br>"		if( $view_mode == 4 );
		$out_buf .= sprintf( ( $view_mode == 4 ? "%s" : " (%s)" ) , $num_v == 1 ? $par."%" : ( $num_v == 2 ? $value."票" : "$par% $value票" ) ) 							if( $num_v && ( $view_mode == 0 || $view_mode == 2 || $view_mode == 4 ) && $hide_result != 1 );
		$out_buf .= "</td>"		if( $view_mode == 2 || $view_mode == 3 );

		if( $hide_result != 1 ){
			$out_buf .= "<td$nowrap$no_cgi_style>"		if( $view_mode == 2 || $view_mode == 3 );
			if( $graph_flg == 2 ){
				$width = $graph_width * ( $g_ritu / 100 );
				$br = ( $view_mode == 2 || $view_mode == 3 ) ? "" : "<br>";
				$out_buf .= sprintf( "$br<img src=\"%s\" width=\"$width\" height=\"$graph_height\">%s$br" , $choice_img[ $no % scalar @choice_img ] , ( $num_v != 0 && ( $view_mode == 1 || $view_mode == 3 ) ? " ".( $num_v == 1 ? $par."%" : ( $num_v == 2 ? $value."票" : "$par% $value票" ) ) : "" ) );
			}elsif( $graph_flg == 1 ){
				$g_ritu2 = 100 - $g_ritu;
				$par = "&nbsp;"			if( $num_v == 0 );
				$sp = ( $mobile_flg == 1 ? "" : "<img src=\"$sp_path\" border=\"0\" height=\"1\" width=\"1\">" );
				$show = ( $view_mode == 1 || $view_mode == 3 ) ? " ".( $num_v == 1 ? $par."%" : ( $num_v == 2 ? $value."票" : "$par% $value票" ) ) : "";
$out_buf .=<< "SRC_OF_HTML";
<table width="$graph_width" border="0"><tbody><tr><td bgcolor="$choice_color[ $no % scalar @choice_color ]" width="$g_ritu%" height="$graph_height">$sp</td><td width="$g_ritu2%" height="$graph_height">$sp</td><td height="$graph_height"$nowrap$no_cgi_style>$show</td></tr></tbody></table>
SRC_OF_HTML
			}else{
				$out_buf .= "<br>"				if( $view_mode == 1 );
				$out_buf .= sprintf( "%s" , ( $num_v == 1 ? $par."%" : ( $num_v == 2 ? $value."票" : "$par% $value票" ) ) )					if( $num_v != 0 && ( $view_mode == 1 || $view_mode == 3 ) );
				$out_buf .= "<br>";
			}
			$out_buf .= "</td></tr>"		if( $view_mode == 2 || $view_mode == 3 );
		}else{
			$out_buf .= "<br>"				if( $view_mode == 0 || $view_mode == 1 );
		}
		if( $rank_flg eq "1" ){
			$rank_cnt++;
		}else{
			$rank_cnt++		if( $old_value != $value );
		}
		$old_value = $value;
	}
	$out_buf .= "</tr></tbody></table>"		if( $view_mode == 2 || $view_mode == 3 );

	$out_buf .= "<br>";
	
	if( !$result_view ){

		$btn_enable = ( $cookie{"$title"} ne "" && $limit_flg eq "1" ) || &vote_limit_check() ? " disabled" : "";

		$f_size = -s substr( $script_path , rindex( $script_path , "/" ) + 1 );

		if( $btn_img ne "" && $agent == 0 ){
			$btn_buf = "<input type=\"image\" src=\"$btn_img\" name=\"投票\" value=\" 投票 \"$btn_enable>";
		}else{
			$btn_cap = "投票"	if( $btn_cap eq "" );
			$btn_buf = "<input type=\"submit\" name=\"$btn_cap\" value=\" $btn_cap \"$btn_enable>";
		}

$out_buf .=<< "SRC_OF_HTML";
<div align="$btn_pos">$btn_buf</div>
<input type="hidden" name="mode" value="vote">
<input type="hidden" name="id" value="$f_size">
<input type="hidden" name="from" value="form">
SRC_OF_HTML
	}

	if( $mobile_flg == 1 ){
		# 携帯アクセス
		$ban = "<div align=\"center\">CreviceVote</div>";
	}else{
		$ban = "<div align=\"right\"><font size=\"-2\"><a href=\"$soft_adr\" target=\"_blank\">$soft_name v$soft_ver</a></font></div>";
	}

$out_buf .=<< "SRC_OF_HTML";
$footer
$ban
SRC_OF_HTML

	if( !$result_view ){
		$out_buf .= "</form>";
	}else{
		$out_buf .= "</div>";
	}

	if( $mode == 0 ){
$out_buf .=<< "SRC_OF_HTML";
</body>
</html>
SRC_OF_HTML
	}

	if( $agent == 3 || $agent == 7 ){
		# XHTML Basic対応
		$out_buf =~ s/(<br[^>]*)>/$1 \/>/g;
		$out_buf =~ s/<hr>/<hr \/>/g;
		$out_buf =~ s/(<img[^>]*)>/$1 \/>/g;
		$out_buf =~ s/(<input[^>]*)>/$1 \/>/g;
		$out_buf =~ s/&nbsp;/ /g;
	}elsif( $mobile_flg == 1 ){
		$out_buf =~ s/&nbsp;/ /g;
	}

	if( $result_view ){
		my $filename;
		if( $agent == 0 ){
			$filename = 'result.dat';
		}elsif( $agent == 1 ){
			$filename = 'result-i.dat';
		}elsif( $agent == 2 ){
			$filename = 'result-j.dat';
		}elsif( $agent == 3 || $agent == 7 ){
			$filename = 'result-e.dat';
		}
		openLock( FH , ">$filename" ) or exitError( "結果html出力ファイルファイルがオープン出来ません(".__LINE__.")" );
		print FH $out_buf;
		closeUnlock( FH , $filename );
	}
}

#┏━━━━━━━━━━━━━━━━━━━━━━━
#┃■ 投票処理
#┃
#┃呼び出し方法	：
#┃引数			：
#┃戻り値		：
#┃注意事項		：
#┗━━━━━━━━━━━━━━━━━━━━━━━
sub vote(){

	if( ( $cookie{"$title"} ne "" && $limit_flg eq "1" ) || ( $in{'from'} eq "form" && $in{'id'} != -s substr( $script_path , rindex( $script_path , "/" ) + 1 ) ) || $in{'select'} eq "" ){
	}else{
		# データ書き込み処理
		if( -e $data_file ){
			openLock( FH , "<$data_file" ) or exitError( "データファイルがオープン出来ません(".__LINE__.")" );
			@vote = split(/\t/,<FH>);
			close FH;
			
			$atime = (stat($data_file))[8];
			$mtime = (stat($data_file))[9];
			
			open( FH , ">$data_file" ) or exitError( "データファイルがオープン出来ません(".__LINE__.")" );
		}else{
			foreach( 0..$#choice ){	push( @vote , 0 );	}
			openLock( FH , ">$data_file" ) or exitError( "データファイルがオープン出来ません(".__LINE__.")" );
		}

		foreach( @vote ){	$vote_cnt += $_;	}

		if( !&vote_limit_check() ){
			$vote[$in{'select'}]++;
			$log_item = $choice[$in{'select'}];

			$work = join( "\t" , @vote );
			print FH $work;
			closeUnlock( FH , $data_file );

			# ログ出力処理
			openLock( FH , ">>$log_file" ) or exitError( "ログファイルがオープン出来ません(".__LINE__.")" );
			
			&GetNowDate();
			print FH "$ENV{'REMOTE_ADDR'},$now_date{'year'}/$now_date{'month'}/$now_date{'day'} $now_date{'hour'}:$now_date{'min'}:$now_date{'sec'},$log_item,$ENV{'HTTP_USER_AGENT'}\n";
			closeUnlock( FH , $log_file );

			# クッキー出力
			$cookie{"$title"} = "済";
			if( $h_ban_server eq "0" ){
				&print_cookie( $cookiename , $limit_day );
			}else{
				$http_cookie_value = sprintf( "%s expires=%s" , &make_cookie( $cookiename ) , &get_expire_date_string( $limit_day ) );
				$http_cookie = "<meta http-equiv=\"Set-Cookie\" content=\"$http_cookie_value\">";
				$jump_flg = 1	if( $mobile_flg ne "1" );
			}
		}else{
			$work = join( "\t" , @vote );
			print FH $work;
			closeUnlock( FH , $data_file );
			
			if( $atime && $mtime ){
				utime $atime , $mtime , $data_file;
			}else{
				unlink $data_file;
			}
		}
	}

	# ページ戻る処理
	if( $mode == 0 ){
		$url = ( $mode_adr ne "" ? $mode_adr : $script_path );
	}else{
		$url = ( $mode_adr ne "" ? $mode_adr : $ENV{'HTTP_REFERER'} );
	}

	if( $hide_result == 2 && $cookie{"$title"} == "済" ){
$out_buf =<< "SRC_OF_HTML";
Content-type: text/html

<html>
<head>$http_cookie<meta http-equiv="refresh" content="3;URL=$url"><title>投稿完了</title></head>
<body>投稿を受け付けました。<br>３秒以上経過してもページが移動しない場合 or 携帯からのアクセスの場合は <a href="$url">戻る</a> をクリックして戻ってください。</body>
</html>
SRC_OF_HTML
		return;
	}
	&jump( $url );
}

#┏━━━━━━━━━━━━━━━━━━━━━━━
#┃■
#┃
#┃呼び出し方法	：
#┃引数			：
#┃戻り値		：
#┃注意事項		：
#┗━━━━━━━━━━━━━━━━━━━━━━━
sub jump(){

	if( $jump_flg eq "1" ){
$out_buf =<< "SRC_OF_HTML";
Content-type: text/html

<html>
<head>$http_cookie<meta http-equiv="refresh" content="0;URL=@_"></head>
<body></body>
</html>
SRC_OF_HTML
	}else{
		$out_buf = "Location: @_?\n\n";
	}
}

#┏━━━━━━━━━━━━━━━━━━━━━━━
#┃■
#┃
#┃呼び出し方法	：
#┃引数			：
#┃戻り値		：
#┃注意事項		：
#┗━━━━━━━━━━━━━━━━━━━━━━━
sub GetNowDate(){

	my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

	$now_date{'year'} = $year + 1900;
	$now_date{'month'} = $mon + 1;
	$now_date{'day'} = $mday;
	$now_date{'hour'} = $hour;
	$now_date{'min'} = $min;
	$now_date{'sec'} = $sec;
}

#┏━━━━━━━━━━━━━━━━━━━━━━━
#┃■
#┃
#┃呼び出し方法	：
#┃引数			：
#┃戻り値		：
#┃注意事項		：
#┗━━━━━━━━━━━━━━━━━━━━━━━
sub vote_limit_check(){

	if( $vote_limit_flg == 0 ){
	}elsif( $vote_limit_flg == 1 ){
		&GetNowDate();
		
		my $s_now , $s_lmt;
		$s_now = sprintf( "%04d%02d%02d%02d%02d" , $now_date{'year'} , $now_date{'month'} , $now_date{'day'} , $now_date{'hour'} , $now_date{'min'} );
		$s_lmt = sprintf( "%04d%02d%02d%02d%02d" , $vote_limit_date[0] , $vote_limit_date[1] , $vote_limit_date[2] , $vote_limit_date[3] , $vote_limit_date[4] );
		if( $s_now >= $s_lmt ){	return 1;	}
	}elsif( $vote_limit_flg == 2 ){
		if( $vote_cnt >= $vote_limit_cnt ){	return 1;	}
	}elsif( $vote_limit_flg == 3 ){
		foreach( @vote ){
			if( $_ >= $vote_limit_cnt ){	return 1;	}
		}
	}
	
	return 0;
}

#┏━━━━━━━━━━━━━━━━━━━━━━━
#┃■
#┃
#┃呼び出し方法	：
#┃引数			：
#┃戻り値		：
#┃注意事項		：
#┗━━━━━━━━━━━━━━━━━━━━━━━
#┏━━━━━━━━━━━━━━━━━━━━━━━
#┃■
#┃
#┃呼び出し方法	：
#┃引数			：
#┃戻り値		：
#┃注意事項		：
#┗━━━━━━━━━━━━━━━━━━━━━━━
