#!/usr/bin/perl
#tigvote.cgi

$tagToTitle="<font face=tahoma size=2 color=#333366><b>"; # Теги для заголовка
$tagToRow="<font face=tahoma,sans-serif size=2>"; # Теги для пунктов
$graphLenght=100; # длина максимального поля графика (в пикселах)
$graphWidth=10; # ширина поля графика (в пикселах)
$submitText="Ответить"; # надпись на кнопке отправки формы
$closeIP="yes"; # чтобы один адрес не мог голосовать два раза,
		# значение должно быть "yes". если "no" - то адрес
		# может голосовать неограниченное количество раз

$showResult="yes"; # показывать ли результаты голосования?
$URLtoImage="http://localhost/votign/img/"; # URL картинок для полей графика
$cgiUrl="http://localhost/cgi-bin/votign/"; # URL каталога cgi-bin
$body="<Body Link=#000000 Vlink=#000000 ALink=#000000 Hlink=#000000><center>";

#=============================================================
# проверка на вызов подпрограммы

$in = $ENV{'QUERY_STRING'};
@temp=split /&/,$in;
$in=@temp[1];
@temp=split /=/,@temp[0];
$fileName='vote'.@temp[1].'.txt';
$fileIP='ip-'.$fileName;


if($in eq 'result'){print "Content-Type: text/html\n\n";result();exit;}
if($in eq 'form'){print "Content-Type: text/html\n\n";form();exit;}
if($in eq 'add'){print "Content-Type: text/html\n\n";add();exit;}


#получение данных из формы и проверка на выбор пункта

read(STDIN, $query, $ENV{'CONTENT_LENGTH'});

@temp=split /&/,$query;
$data=@temp[1];
@temp=split /=/,@temp[0];
$fileName=@temp[1];
$fileIP='ip-'.$fileName;


@vote=split /=/,$data;

if(@vote[0] eq 'addRow'){print "Content-Type: text/html\n\n";addRowToFile();exit;}



if($data eq ''){print "Content-Type: text/html\n\n";
print "<HTML><HEAD><TITLE>Выберите пункт!</TITLE></HEAD>$body\n";
print "<Body BgColor=#ffffff Text=#000000 TopMargin=5 LeftMargin=5>\n";
print "<Table Border=0 Width=100% Height=100%><Tr><Td Align=Center Valign=Middle>\n";
print "<center><Font Face=Tahoma,Sans-Serif,Arial Size=2><B>Ни один пункт не был выбран!<Br><Br><A Href=$ENV{'HTTP_REFERER'}><U>Вернуться</U></A></B></Font></center>";
print "</Td></Tr></Table>\n";
print "</BODY></HTML>";
exit;}

# проверка IP

if($closeIP eq 'yes'){IPcheck();}


#открытие файла с данными

open FILE,"$fileName";
@fil=<FILE>;
close FILE;


#обработка данных

$punkt=@vote[1];
@temp=split /=/,@fil[$punkt];
@temp[1]++;
@fil[$punkt]=join '=',@temp;
@fil[$punkt]=@fil[$punkt]."\n";


#запись полученного результата в файл

open FILE,">$fileName";

for $i(0..$#fil){
print FILE "@fil[$i]";
}

close FILE;


#ответ после голосования

print "Content-Type: text/html\n\n";
print "<HTML><HEAD><TITLE>Спасибо, Ваш голос засчитан</TITLE></HEAD>$body\n";
print "<Body BgColor=#ffffff Text=#000000 TopMargin=5 LeftMargin=5>\n";
print "<Table Border=0 Width=100% Height=100%><Tr><Td Align=Center Valign=Middle>\n";
print "<Font Face=Tahoma,Sans-Serif,Arial Size=2><B>Спасибо, Ваш голос был принят</B></Font><Br><Br>\n";
if($showResult eq 'yes'){result();}
print "<Font Face=Tahoma,Sans-Serif,Arial Size=2><B><U><A Href=$ENV{'HTTP_REFERER'}>Вернуться</A></U></B></Font>\n";
print "</Td></Tr></Table>\n";
print "</BODY></HTML>";


exit;



#------------------------------------
#подпрограмма вывода графика
#------------------------------------

sub result()
{

open FILE,"$fileName";
@fil=<FILE>;
close FILE;


#обработка данных из файла

for $i(1..$#fil){
@temp=split /=/,@fil[$i];
@mess[$i]=@temp[0];@num[$i]=@temp[1];
}

#вычисление графика
#нахождение большего значения, вычисление коэффициента

$max=0;$sum=0;
for $i(1..$#fil){
$sum=$sum+@num[$i];
if(@num[$i]>$max){$max=@num[$i];}
}
if($max==0){$max=1;}
$koeff=$graphLenght/$max;


#построение графика

print "<table border=0>\n";
print "<tr><td colspan=4>$tagToTitle@fil[0]</td></tr>\n";

$sumgolos=0;
for $i(1..$#fil){
$width=int(@num[$i]*$koeff);
$percent=0;
$sumgolos=$sumgolos+@num[$i];

if($sum!=0){$percent=@num[$i]/$sum*100;$percent=int($percent*100+0.5)/100;}

$image=$URLtoImage.'strip'.$i.'.gif';
if($width==0){print "<tr><td>$tagToRow@mess[$i]</td><td>$tagToRow&nbsp;@num[$i]</td><td>$tagToRow($percent%)</td><td></td></tr>\n";}
else {print "<tr><td>$tagToRow@mess[$i]</td><td>$tagToRow&nbsp;@num[$i]</td><td>$tagToRow($percent%)</td><td><img src=$image height=$graphWidth width=$width></td></tr>\n";}
}
print "<tr><td>$tagToRowВсего:</td><td>$tagToRow&nbsp;$sumgolos</td><td colspan=2>&nbsp;</td></tr>\n";
print "</table>\n";
print "<!--TigVote ver. 2.02-->\n";
}


#------------------------------------
#подпрограмма построения формы
#------------------------------------
sub form()
{
open FILE,"$fileName";
@fil=<FILE>;
close FILE;


#построение формы

$tigvote=$cgiUrl.'tigvote.cgi';
print "<form action=$tigvote method=POST>\n";

print "<input type=hidden name=file value=$fileName>\n";

print "<table border=0>\n";
print "<tr><td>$tagToTitle@fil[0]</td></tr>\n";

for $i(1..$#fil){
@temp=split /=/,@fil[$i];
print "<tr><td>$tagToRow<input type=radio name=tigvote value=$i>@temp[0]</td></tr>\n";
}

print "<tr><td>$tagToRow<input type=submit value=\"$submitText\"></td></tr>\n";
print "</table></form>\n";
print "<!--TigVote ver. 2.02-->\n";
}


#------------------------------------
#подпрограмма проверки IP
#------------------------------------
sub IPcheck()
{
open FILE,"$fileIP";
@filip=<FILE>;
close FILE;

chomp(@filip);

$ip=$ENV{'REMOTE_ADDR'};

# не пущать, если адрес есть в базе

for $i(0..$#filip){
if(@filip[$i] eq $ip){print "Content-Type: text/html\n\n";
print "<HTML><HEAD><TITLE>Ваш голос не принят!</TITLE></HEAD>$body\n";
print "<Body BgColor=#ffffff Text=#000000 TopMargin=5 LeftMargin=5>\n";
print "<Table Border=0 Width=100% Height=100%><Tr><Td Align=Center Valign=Middle>\n";
print "<center><Font Face=Tahoma,Sans-Serif,Arial Size=2><B>Ваш голос не был принят, т.к. Вы уже голосовали!</B><Br><Br></Font>";
if($showResult eq 'yes'){result();}
print "<Font Face=Tahoma,Sans-Serif,Arial Size=2><B><A Href=$ENV{'HTTP_REFERER'}><U>Вернуться</U></A><B>\n</center>";
print "</Td></Tr></Table>\n";

print "</BODY></HTML>\n";exit;}
}

open FILE,">>$fileIP";
print FILE "$ip\n";
close FILE;
}


#------------------------------------
#подпрограмма построения формы для добавления пункта
#------------------------------------
sub add()
{
open FILE,"$fileName";
@fil=<FILE>;
close FILE;


#построение формы

$tigvote=$cgiUrl.'tigvote.cgi';
print "<form action=$tigvote method=POST>\n";
print "<input type=hidden name=file value=$fileName>\n";

print "<table border=0>\n";
print "<tr><td>$tagToRow<input type=text name=addRow></td></tr>\n";
print "<tr><td>$tagToRow<input type=submit value=\"Добавить пункт\"></td></tr></table>\n";
print "</form>\n";
print "<!--TigVote ver. 2.02-->\n";
}


#------------------------------------
#подпрограмма добавления пункта в файл
#------------------------------------
sub addRowToFile()
{
$stroka=@vote[1];
replacx($stroka);
$stroka=~s/\+/ /g;

open FILE,">>$fileName";
print FILE "$stroka=0\n";
close FILE;

print "<HTML><HEAD><TITLE>Пункт добавлен.</TITLE></HEAD>$body\n";
print "<Body BgColor=#ffffff Text=#000000 TopMargin=5 LeftMargin=5>\n";
print "<Table Border=0 Width=100% Height=100%><Tr><Td Align=Center Valign=Middle>\n";
print "<br><center><Font Face=Tahoma,Sans-Serif,Arial Size=2><B>Пункт был успешно добавлен</B></Font><A Href=$ENV{'HTTP_REFERER'}>Вернуться</a></h3></center>";
print "</Td></Tr></Table>\n";
print "</BODY></HTML>";

}

############################################
###подпрограмма преобразования cgi-потока###
############################################
sub replacx($)
{$_[0]=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;}
