#!/usr/local/bin/perl
####################################################################
# Script: | Poll It #
# Version: | 2.0 #
# By: | Jason Berry (i2 Services, Inc. / CGI World) #
# Contact: | jason@cgi-world.com #
# WWWeb: | http://www.cgi-world.com #
# Copyright: | Jason Berry (CGI World of i2 Services, Inc.) #
# Released | August 09, 1998 #
####################################################################
# By using this software, you have agreed to the license #
# agreement packaged with this program. #
# #
####################################################################
# Variables:
#
#
$image_url = "http://www.edgate.com/elections/design/poll-bin/image.gif";
# URL to the 'image.gif' that was packaged with this script. Upload
# that GIF Image to your website & enter the URL to it above.
$vote_text = "Vote";
# Text that is shown on the submit button when casting your vote.
# Note:
##################################################################
# If you're looking to use an image in one of the variables
# below, input the IMAGE tag inside of the quotes as:
# <-- Placing backslashes (\)
# before the extra quotes inside a quote.
###########################################################
$last_poll_text = "";
# Text that is linked to view the previous results of your
# previous poll.
$results_not_available = " The results will be posted soon...";
# Message shown when the number of votes is not greater then
# the ammount you opted for when setting up a poll.
$poll_not_available = " Currently there is no opinion poll available...
Check back soon for another poll...";
# Message listed when a poll is not available.
#
$non_SSI_CGI_FileName = "poll-bin/Poll_It_v2.0.cgi";
# The name of the file that was originaly named "Poll_It_v2.0.cgi" when
# you received this zipped up package. If you renamed that file to poll.cgi
# then enter "poll.cgi" above.
#
#
# (We do not support this script if you edit below this line )
################################################################
#
#
#if ($0=~m#^(.*)(\\|/)#) { $cgidir = $1; }
#else { $cgidir = `pwd`; chomp $cgidir; }
$cgidir="/export/home/www/gocopernicus/pearson_design/elections/design/poll-bin";
$script_url = $ENV{'SCRIPT_NAME'};
$data_dir = "$cgidir/pollit_files";
$poll_options = "$data_dir/poll_options.txt";
$poll_info = "$data_dir/poll_info.txt";
$ips_file = "$data_dir/ips.txt";
$last_file = "$data_dir/last_poll.txt";
$lockdir = "$data_dir/filelock";
%in = &ReadForm;
open(IPS,"<$ips_file");
@ips = ;
close(IPS);
$all_ips = join('|',@ips);
$addr = "$ENV{'REMOTE_ADDR'}\n";
if(@ips && $addr =~ /$all_ips/) {
$voted = 1;
}
if($option_selected && !$voted) {
&FileLock("$lockdir");
open(MIPS,">>$ips_file");
print MIPS "$ENV{'REMOTE_ADDR'}\n";
close(MIPS);
&FileUnlock("$lockdir");
open(POPTIONS,"<$poll_options");
while() {
($option_id,$poll_option,$votes_received) = split(/=/,$_);
if($option_id eq "total") {
$new_total = $poll_option + 1;
$push = "total=$new_total\n";
push(@reprint,$push);
}
else {
if($option_id eq "$option_selected") {
$new_ototal = $votes_received + 1;
$push = "$option_id\=$poll_option\=$new_ototal\n";
push(@reprint,$push);
}
else {
push(@reprint,$_);
}
}
}
close(POPTIONS);
&FileLock("$lockdir");
open(REPRINT,">$poll_options");
print REPRINT @reprint;
close(REPRINT);
&FileUnlock("$lockdir");
$voted = 1;
print "Location: $ENV{'HTTP_REFERER'}\n\n";
}
# Print Out SSI Poll Box:
###############################################################
&Template("$data_dir/_ssi_poll.html");
open(POLLINFO,"<$poll_info");
while() {
chop($_);
($pinfo,$pvalue) = split(/=/,$_);
$$pinfo = "$pvalue";
}
close(POLLINFO);
open(POLLOPTIONS,"<$poll_options");
@unsorted_poll_options = ;
close(POLLOPTIONS);
foreach$unsorted(@unsorted_poll_options) {
($option_id,$poll_option,$votes_received) = split(/=/,$unsorted);
chop($votes_recieved);
if($option_id eq "total") {
$total = $poll_option;
$show_total = "Total Votes: $total";
}
$push = "$votes_received\=$option_id\=$poll_option";
push(@poll_options,$push);
}
# Show Voting Results:
#####################################
if($voted) {
foreach$p_option(sort { $b <=> $a } @poll_options) {
($votes_received,$option_id,$poll_option) = split(/=/,$p_option);
if($option_id ne "total" && $total > "0") {
$percent = (int(($votes_received / $total) * 1000)) / 10;
$percent = substr($percent,0,4);
$sign = "%";
if($votes_received < 1) {
$percent = "0";
}
$width = int($percent * 1);
if($votes_received < 1) {
$width = 2;
}
$percent = "$percent$sign";
$image_percent = "";
$show_results .= &Cell('poll_results');
}
}
$show_results .= &Cell('total_votes');
if($show_results_after > $total) {
undef($show_results);
$show_results = "$results_not_available";
}
}
# Show Voting Options:
#####################################
if(!$voted) {
foreach$p_option(@poll_options) {
($votes_received,$option_id,$poll_option) = split(/=/,$p_option);
if($option_id ne "total") {
$display_options .= &Cell("show_options");
}
}
if(!$display_options) { $display_options = "$poll_not_available" };
}
if($display_options) { $submit = " " };
open(LASTPOLL,"<$last_file");
@last_poll = ;
close(LASTPOLL);
if(@last_poll) {
$last_poll = "$last_poll_text ";
}
print &Template("$data_dir/_ssi_poll.html",'html');
# Load Template: #
###############################################################
sub Template {
local(*FILE);
if ($_[1] eq 'html') { print "Content-type: text/html\n\n" unless ($ContentType++ > 0); }
elsif ($_[1] eq 'text') { print "Content-type: text/plain\n\n" unless ($ContentType++ > 0); }
if (!$_[0]) { return " \nTemplate : No file was specified \n"; }
elsif (!-e "$_[0]") { return " \nTemplate : File '$_[0]' does not exist \n"; }
else {
open(FILE, "<$_[0]") || return " \nTemplate : Could open $_[0] \n";
while () { $FILE .= $_; }
close(FILE);
for ($FILE) {
s//\1/gi; # show hidden inserts
s/(?:\r\n|\n)?(.*?)/
$CELL{$1}=$2;''/ges; # read/remove template cells
s/\$(\w+)\$/${$1}/g; # translate $scalars$
}
}
return $FILE;
}
# Translate Cell: #
###############################################################
sub Cell {
my($CELL);
for (0..$#_) { if ($_[$_]) { $CELL .= $CELL{$_[$_]}; }}
if (!$_[0]) { return " \nCell : No cell was specified \n"; }
elsif (!$CELL) { return " \nCell : Cell '$_[0]' is not defined \n"; }
else { $CELL =~ s/\$(\w+)\$/${$1}/g; } # translate $scalars$
return $CELL;
}
# Parse Form: #
###############################################################
# Usage : %in = &ReadForm; #
# #
###############################################################
sub ReadForm {
my($max) = $_[1]; # Max Input Size
my($name,$value,$pair,@pairs,$buffer,%hash); # localize variables
# Check input size if max input size is defined
if ($max && ($ENV{'CONTENT_LENGTH'}||length $ENV{'QUERY_STRING'}) > $max) {
die("ReadForm : Input exceeds max input limit of $max bytes\n");
}
# Read GET or POST form into $buffer
if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }
if ($ENV{'QUERY_STRING'}) { $buffer .= $ENV{'QUERY_STRING'}; }
@pairs = split(/&/, $buffer); # Split into name/value pairs
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair); # split into $name and $value
$value =~ tr/+/ /; # replace "+" with " "
$value =~ s/%([A-F0-9]{2})/pack("C", hex($1))/egi; # replace %hex with char
$$name = $value;
}
return %hash;
}
# File Locking: #
###############################################################
# Usage : &FileLock("$lockdir"); #
# : &FileUnlock("$lockdir"); #
# #
###############################################################
sub FileLock {
my($i); # sleep counter
while (!mkdir($_[0],0777)) { # if there already is a lock
sleep 1; # sleep for 1 sec and try again
if (++$i>60) { die("File_Lock : Can't create filelock : $!\n"); }
}
}
sub FileUnlock {
rmdir($_[0]); # remove file lock dir
}
####################################################################
The 2000 U.S. presidential election offers a terrific opportunity to examine America's election process and political history. Join us as we follow the selection and inauguration of the country's 43rd president. Here, you'll find everything you need for class -- breaking news, special activities, historical timelines, interactive polls, and our recommendations for the Web's best election-related sites and lesson plans.
Analyze the news from the campaign trail with special activities from USA TODAY
Walk in the footsteps of a potential president from declaration of candidacy to inauguration
Follow the development of America's political parties with our unique timeline
Meet the men who want to live in the White House: George W. Bush and Al Gore
Debate this year's biggest campaign issues and weigh each candidate's proposals
Discover why it is important to vote and how to cast your ballot at the polls
Jump back in time to the days when women and minorities weren't allowed to vote
Examine this popular method for gauging the viewpoints of Americans
Questions, comments, or suggestions? Your feedback is welcome.