#!/usr/bin/perl -w
$data_file = '/cgi-bin/data/guestbook.txt';
$max_entries = 10; # how many guestbook entries to save?
# set to '0' (zero) for infinite entries...
use CGI;
use Fcntl;
$query = new CGI;
$date_command = '/bin/date';
$date = `$date_command +"%A, %B %e, %Y at %I:%M %p"`; chop($date);
$smilies_url =
"http://smilies";
unless ($action = $query->param('action')) {
$action = 'none';
}
print <<"EndOfText";
Content-type: text/html
<html><head><title>page</title></head><body>
<p><font size="3">To Post A Comment Or Offer Your Support Click <A HREF="#form"><i><b>HERE</b></i></a> to fill out the form!</font></b>
<br><font size="2">HTML is ENABLED!</font></center>
<HR>
<!-- END HTML CODE BEFORE FORM -->
EndOfText
if ($action eq 'Be Heard') {
# process the form submission and assemble the guestbook entry
$name = $query->param('name');
$email = $query->param('email');
$url = $query->param('url');
$city = $query->param('city');
$state = $query->param('state');
$country = $query->param('country');
$comment = $query->param('comment');
# clean up $name
if (length($name) > 50) {
$name = 'A Really Long Name . . . ';
}
# clean up and adjust $from_where
$from_where = "$city, $state, $country";
$from_where =~ s/, , /, /; # remove duplicate ', '
$from_where =~ s/^, //; # remove initial ', '
$from_where =~ s/, $//; # remove final ', '
if ($from_where =~ /^[,\s]+$/) {
# commas and whitespace
$from_where = 'parts unknown';
}
if (length($from_where) > 75) {
$from_where = 'A Place With A Really Long Name . . .';
}
# clean up and adjust $comment
if (length($comment) > 32768) {
$comment = 'The Comment That Was Posted Was Too Long.';
}
# fix line-endings
$comment =~ s/\r\n?/\n/g;
#clean up $URL
unless ($url) {
$url = 'No Website';
}
# Smilies
$comment =~ s/\
/<img src="$smilies_url\/angel.gif">/sg;
$comment =~ s/\:bow:/<img src="$smilies_url\/bow.gif">/sg;
$comment =~ s/\:clap:/<img src="$smilies_url\/clap.gif">/sg;
$comment =~ s/\
/<img src="$smilies_url\/cool.gif">/sg;
$comment =~ s/\:crazy:/<img src="$smilies_url\/crazy.gif">/sg;
$comment =~ s/\
/<img src="$smilies_url\/cry.gif">/sg;
$comment =~ s/\:cry2:/<img src="$smilies_url\/cry2.gif">/sg;
$comment =~ s/\:dork:/<img src="$smilies_url\/dork.gif">/sg;
$comment =~ s/\
/<img src="$smilies_url\/evil.gif">/sg;
$comment =~ s/\:flag:/<img src="$smilies_url\/flag.gif">/sg;
$comment =~ s/\:giggle:/<img src="$smilies_url\/giggle.gif">/sg;
$comment =~ s/\:grin:/<img src="$smilies_url\/grin.gif">/sg;
$comment =~ s/\:hbreak:/<img src="$smilies_url\/hbreak.gif">/sg;
$comment =~ s/\:hug:/<img src="$smilies_url\/hug.gif">/sg;
$comment =~ s/\:idea:/<img src="$smilies_url\/idea.gif">/sg;
$comment =~ s/\
/<img src="$smilies_url\/laugh.gif">/sg;
$comment =~ s/\:lost:/<img src="$smilies_url\/lost.gif">/sg;
$comment =~ s/\:love:/<img src="$smilies_url\/love.gif">/sg;
$comment =~ s/\
/<img src="$smilies_url\/mad.gif">/sg;
$comment =~ s/\:nervous:/<img src="$smilies_url\/nervous.gif">/sg;
$comment =~ s/\:no:/<img src="$smilies_url\/no.gif">/sg;
$comment =~ s/\:nono:/<img src="$smilies_url\/nono.gif">/sg;
$comment =~ s/\
hno:/<img src="$smilies_url\/ohno.gif">/sg;
$comment =~ s/\
mg:/<img src="$smilies_url\/omg.gif">/sg;
$comment =~ s/\:party:/<img src="$smilies_url\/party.gif">/sg;
$comment =~ s/\:peace:/<img src="$smilies_url\/peace.gif">/sg;
$comment =~ s/\:please:/<img src="$smilies_url\/please.gif">/sg;
$comment =~ s/\:quiet:/<img src="$smilies_url\/quiet.gif">/sg;
$comment =~ s/\
/<img src="$smilies_url\/rofl.gif">/sg;
$comment =~ s/\:rose:/<img src="$smilies_url\/rose.gif">/sg;
$comment =~ s/\:sad:/<img src="$smilies_url\/sad.gif">/sg;
$comment =~ s/\:sigh:/<img src="$smilies_url\/sigh.gif">/sg;
$comment =~ s/\:smile:/<img src="$smilies_url\/smile.gif">/sg;
$comment =~ s/\:stop:/<img src="$smilies_url\/stop.gif">/sg;
$comment =~ s/\:thanku:/<img src="$smilies_url\/thanku.gif">/sg;
$comment =~ s/\:think:/<img src="$smilies_url\/think.gif">/sg;
$comment =~ s/\:whatever:/<img src="$smilies_url\/whatever.gif">/sg;
$comment =~ s/\:wink:/<img src="$smilies_url\/wink.gif">/sg;
$comment =~ s/\:yap:/<img src="$smilies_url\/yap.gif">/sg;
$comment =~ s/\:yay:/<img src="$smilies_url\/yay.gif">/sg;
# assemble finished guestbook entry
$entry = <<"EndOfText";
<P><strong><emp>Posted on $date</emp></strong>
<P><strong>Name:</strong> $name
<br> <strong>Email:</strong> <A HREF=\"<A href="mailto:$email\">$email</A">mailto:$email\">$email</A>
<br><strong>My URL:</strong> <A target="_blank" HREF=http://$url>$url</a>
<br><strong>Location:</strong> $from_where
<br><strong>Comments:</strong>
<BR><center><div style="width:500px">$comment</div></center></P>
<HR>
EndOfText
# Read old entries, write out new
$all_entries = $entry;
sysopen(ENTRIES, "$data_file", O_RDWR)
or die "can't open $data_file: $!";
flock(ENTRIES, 2) or die "can't LOCK_EX $data_file: $!";
while(<ENTRIES>) {
$all_entries .= $_;
}
if ($max_entries) {
# lop the tail off the guestbook, if necessary
@all_entries = split(/<HR>/i, $all_entries);
$entry_count = @all_entries - 1;
while ($entry_count > $max_entries) {
pop @all_entries;
$entry_count = @all_entries - 1;
}
$all_entries = join('<HR>', @all_entries);
}
# now write out to $data_file
seek(ENTRIES, 0, 0) or die "can't rewind $data_file: $!";
truncate(ENTRIES, 0) or die "can't truncate $data_file: $!";
print ENTRIES $all_entries or die "can't print to $data_file: $!";
close(ENTRIES) or die "can't close $data_file: $!";
}
# display the guestbook
open (IN, "$data_file") or die "Can't open $data_file for reading: $!";
flock(IN, 1) or die "Can't get LOCK_SH on $data_file: $!";
while (<IN>) {
print;
}
close IN or die "Can't close $data_file: $!";
# display the form
print <<"EndOfText";
<!-- BEGIN HTML CODE FOR FORM AND AFTER -->
<A NAME="form"><H2>Submit Your Voice!</H2></A>
<FORM NAME="gbook" METHOD="POST" ACTION="/cgi-bin/guestbook.cgi">
<TABLE>
<TR>
<TD ALIGN="right"><STRONG>Name:</STRONG></TD>
<TD><INPUT NAME="name" SIZE=30></TD>
</TR>
<TR>
<TD ALIGN="right"><STRONG>Email:</STRONG></TD>
<TD><INPUT NAME="email" SIZE=30></TD>
</TR>
<TR>
<TD ALIGN="right"><STRONG>My URL:</STRONG><br>(www.domain.com)</TD>
<TD><INPUT NAME="url" SIZE=30></TD>
</TR>
<TR>
<TD ALIGN="right"><STRONG>City:</STRONG></TD>
<TD><INPUT NAME="city" SIZE=30></TD>
</TR>
<TR>
<TD ALIGN="right"><STRONG>State:</STRONG></TD>
<TD><INPUT NAME="state" SIZE=30></TD>
</TR>
<TR>
<TD ALIGN="right"><STRONG>Country:</STRONG></TD>
<TD><INPUT NAME="country" SIZE=30 value="USA"></TD>
</TR>
<TR>
<TD ALIGN="right"><STRONG>Comment:</STRONG></TD>
<TD>
<TEXTAREA NAME="comment" ROWS=5 COLS=55 WRAP="virtual"></TEXTAREA>
</TD>
</TR>
<TR><TD COLSPAN=2> </TD></TR>
<TR>
<TD> </TD>
<TD><INPUT TYPE="submit" NAME="action" VALUE="Be Heard" onsubmit="return validate();"></TD>
</TR>
</TABLE>
</FORM>
<!-- BEGIN JAVASCRIPT VALIDATION -->
<script language="JavaScript">
<!--
document.gbook.onsubmit=validate;
function validate() {
var name=document.gbook.name.value;
if( (name.length==0) ) {
alert("Please Enter A Name.");
document.gbook.name.focus();
document.gbook.name.select();
return false;
}
var city=document.gbook.city.value;
if( (city.length==0) ) {
alert("Please Enter A City.");
document.gbook.city.focus();
document.gbook.city.select();
return false;
}
var state=document.gbook.state.value;
if( (state.length==0) ) {
alert("Please Enter A State.");
document.gbook.state.focus();
document.gbook.state.select();
return false;
}
var comment=document.gbook.comment.value;
if( (comment.length==0) ) {
alert("Please Enter A Comment.");
document.gbook.comment.focus();
document.gbook.comment.select();
return false;
}
var email=document.gbook.email.value;
if( (email.length<5) ||
(countchar(email," ")>0) ||
(countchar(email,"@")!=1) ||
(countchar(email,".")==0) ) {
alert("Invalid email format.");
document.gbook.email.focus();
document.gbook.email.select();
return false;
}
return true;
}
//-->
</script>
<!-- END JAVASCRIPT VALIDATION -->
</body>
</html>
EndOfText