#!/usr/bin/perl
##############################################################################
# Megabook - Guestbook Script V2.2                                           # 
# Copyright 2005 Terry Billinger                                             #
# Created 7/2/00                                                             #
# Modified 11/03/05                                                          #
# Available at http://www.go-mega.net/megabook/                              #
##############################################################################
# COPYRIGHT NOTICE                                                           #
#                                                                            #
# This script can be used/modified so long as this header and any parts      #
# of the program which give credit remain intact.  By using this program,    #
# you indemnify the creators from any liability that may arise from its use. #
#                                                                            #
# Redistributing/selling the code for this program is strictly forbidden     #
# without prior written consent.									         #
##############################################################################


print ("Content-type: text/html\n\n");

# Reads in style and setup.

&getdata;

&process;

&signhtml;

&footer;

sub getdata {

if ($ENV{'QUERY_STRING'}) {

foreach (split('&', $ENV{'QUERY_STRING'})) {
        s/\+/ /g ;
        ($name, $value)= split('=', $_, 2) ;
        $name=~ s/%(..)/chr(hex($1))/ge ;
        $value=~ s/%(..)/chr(hex($1))/ge ;
        $FORM{$name}.= "\0" if defined($FORM{$name}) ;  # concatenate multiple vars
        $FORM{$name}.= $value ;
    }
}

# Read in style and setup

chmod(0666, "setup.db");
open (SETUP, "setup.db");
@setup = <SETUP>;
close(SETUP);
chmod(0000, "setup.db");
$setupline = ($setup[0]);
chomp($setupline);
($title,$background,$bgcolor,$textcolor,$linkcolor,$vlinkcolor,
$alinkcolor,$homepage,$mailprogram,$datafile,$success,$adminemail,$reverseentries,
$allow_html,$entriesperpage,$maxentries,$mail_you,$guesspass,$nextview,$backview,
$privview,$adminpassword,$uplook,$downlook,$requiredfields,$fontface,$pagebreak,
$yearformat,$dateformat,$timeformat,$timezone,$dateseperator,$altcolor1,$altcolor2,$mail_them,$icqflower) = split(/\|/, $setupline);
$entriesperpage = $entriesperpage - 1;

open (DATA, "$datafile");
if ($reverseentries eq "1") {
   @data = reverse(<DATA>);
} else {
   @data = <DATA>;
}
close(DATA);

open (BADWORDS, "badwords.txt");
@badwords = split /\s+/, <BADWORDS>;
close(BADWORDS);

}

# PROCESS GUESTBOOK

sub process {

	# Check if HTML is on or off.

	if ($allow_html eq "1") {
	   $htmlstatus = "HTML has been enabled.";
	   } else {
	   $htmlstatus = "HTML has been disabled.";
	}

$totalentries = ($#data + 1);

# PAGE CODE 

$numofpages = ($totalentries / ($entriesperpage + 1));
$roundnumofpages = int($numofpages);
if ($numofpages - $roundnumofpages > 0) {
	$roundnumofpages++;
}

if ($pagebreak < 3) {
   $pagebreak = 3;
}

$pagebreak = int($pagebreak);

$space = ($pagebreak / 2);
$roundpagebreak = int($space);

if ($space - $roundpagebreak > 0) {
   $spacing = $space - .5;
} else {
   $spacing = $space;
}

# Calculate current page, starting page and ending page

$currentpage = ($FORM{'start'} + $entriesperpage + 1) / ($entriesperpage + 1);
$startpage = $currentpage - $spacing;
$endpage = $currentpage + $spacing;

# If at the end of the guestbook fix list
if (($endpage * ($entriesperpage + 1)) > $totalentries) {
   $endpage = $roundnumofpages;
   $startpage = $endpage - $pagebreak + 1;
}

# If at the start of the guestbook fix list
if ($startpage <= 0) {
   $startpage = 1;
   if ($roundnumofpages > $pagebreak) {
   $endpage = $pagebreak;
      } else {
   $endpage = $roundnumofpages;
   }
} 

# Setup ouput

for ($pagenum = $startpage;$pagenum <= $endpage;$pagenum++) {

   $entriesonpage = ($pagenum * ($entriesperpage + 1));
   $entriesonpage -= $entriesperpage + 1;
   $pagesoutput .= "<a href=guestbook.cgi?start=$entriesonpage>$pagenum</a>";

   if ($pagenum != $endpage) {
      $pagesoutput .= "\&nbsp;\&nbsp;"
   }
}

# END PAGE CODE


        unless ($FORM{'start'}) { $FORM{'start'} = 0; }
        if ($entriesperpage == -1) { $entriesperpage = $#data; }
        $last = $FORM{'start'} + $entriesperpage;        
        if ($last > $#data) { $last = $#data; }
if ($reverseentries eq "1") {
        $startnum = $FORM{'start'} + 1;
        $end = $last + 1;
} else {
	$end = $totalentries - $FORM{'start'};
	$startnum = $end - $entriesperpage;
        if ($startnum <= 1) { 
	   $startnum = 1;
	}
}

$lastnum = "$last";

$startcount = "$FORM{'start'}";

        $k = 0;
        for ($k = $startcount; $k <= $lastnum; $k++) {
        }
        if ($startcount > 0) {                
                $k = $startcount - $entriesperpage - 1;
                if ($k < 0) {
                        $k = 0;
                        $l = $startcount + 1;
                }
                else { $l = $entriesperpage + 1; }
		$backview =~ s/\[num\]/$l/ig;
		if ($entriesperpage >= 1) {
                $back = "<a href=\"guestbook.cgi?start=$k\">$backview</a>";
		}
        }
        if ($lastnum < $#data) {
                $lastnum++;
                $startcount = ($#data + 1) - $lastnum;
                if ($startcount > $entriesperpage) { $startcount = $entriesperpage + 1; }
		$nextview =~ s/\[num\]/$startcount/ig;
		if ($entriesperpage >= 1) {
                $next = "<a href=\"guestbook.cgi?start=$lastnum\">$nextview</a>";
		}
        }

# Read in header and print out
open (HEAD, "header.txt");
while (<HEAD>) {
	$_ =~ s/\[title\]/$title/ig;
	$_ =~ s/\[background\]/$background/ig;
	$_ =~ s/\[bgcolor\]/$bgcolor/ig;
	$_ =~ s/\[font\]/$fontface/ig;
	$_ =~ s/\[textcolor\]/$textcolor/ig;
	$_ =~ s/\[linkcolor\]/$linkcolor/ig;
	$_ =~ s/\[vlinkcolor\]/$vlinkcolor/ig;
	$_ =~ s/\[alinkcolor\]/$alinkcolor/ig;
	$_ =~ s/\[homepage\]/$homepage/ig;
	$_ =~ s/\[htmlstatus\]/$htmlstatus/ig;
	$_ =~ s/\[totalnum\]/$totalentries/ig;
	$_ =~ s/\[startnum\]/$startnum/ig;
	$_ =~ s/\[endnum\]/$end/ig;
	$_ =~ s/\[next\]/$next/ig;
	$_ =~ s/\[pagelist\]/$pagesoutput/ig;
	$_ =~ s/\[pagenum\]/$currentpage/ig;
	$_ =~ s/\[totalpages\]/$roundnumofpages/ig;
	$_ =~ s/\[back\]/$back/ig;
push (@header,$_);
}
close(HEAD);

print "<!-- Guestbook // -->\n";
print "@header";

$colorswitch = "$altcolor1";

        $i = 0;
        for ($i = $FORM{'start'}; $i <= $last; $i++) {
                @entrylayout = &viewhtml($data[$i]);
                print "@entrylayout";
		if ($colorswitch eq "$altcolor1") {
		   $colorswitch = $altcolor2;
		} else {
		   $colorswitch = $altcolor1;
		}
        }
}
#END PROCESS GUESTBOOK

# HTML OF OUTPUTTED ENTRIES

sub viewhtml {

        # Get the data and change it into what we want to show

        $line = shift(@_);
        ($name,$private,$email,$url,$comment,$adminreply,$month,$day,$year,$min,$hour,$var1,$var2,$var3,$var4,$var5,$var6,$ip,$browser,$icq) = split(/\|/, $line);

	if ($reverseentries eq "1") {
		$entryid = ($i + 1);
		$downentry = ($entryid + 1);
		$upentry = ($entryid - 1);
	} else {
		$entryid = ($totalentries - $i);
		$upentry = ($entryid + 1);
		$downentry = ($entryid - 1);
	}

	$up = "<a href=#$upentry style=\"text-decoration: none;\">$uplook</a>";
	$down = "<a href=#$downentry style=\"text-decoration: none;\">$downlook</a>";

        # HTML Filter

        $comment =~ s/&#60;/</g;
		$comment =~ s/&#62;/>/g;

	if ($allow_html == 0) {
	   $comment =~ s/<p>/&60;p&#62;/ig;
	   $comment =~ s/<br>/&60;br&#62;/ig;
           $comment =~ s/<([^>]|\n)*>//g;
	   $comment =~ s/&60;p&#62;/<p>/ig;
	   $comment =~ s/&60;br&#62;/<br>/ig;
        }

        # Kill Bad Words
           foreach $badword (@badwords) {
	$length = length($badword);
	$replace = "*" x $length;
	$name =~ s/$badword/$replace/ig;
                $comment =~ s/$badword/$replace/ig;
           }

	$icq =~ s/\s+//g;
	if ($icq =~ /[^0-9]+/ || $icq eq "") {
		$icq = "";
	} else {
		if ($icqflower == 1) {
			$icq = "<a href=\"http://wwp.icq.com/scripts/search.dll?to=$icq\" target=icq><img src=\"http://wwp.icq.com/scripts/online.dll?icq=$icq&img=5\" border=\"0\"></a>";
		} else {
			$icq = $icq;
		}
	}

	# Check if its a private message to the admin.

	if ($private eq "priv") {
		$comment = "<a href=javascript:openPrivate($entryid)>$privview</a>";
		}

####### TIME SETUP

#### Time Setups for Time Formats
if ($timeformat <= 2) {
   if ($hour >= 12) {
       if ($hour != 12) {
          $hour -= 12;
       }
         if ($timeformat == 1) {
           $ampm = " PM"; 
         } else {
           $ampm = "p";
         }
   } else { 
      if ($hour <= 0) { 
         $hour = 12; 
      }
      if ($timeformat == 1) {
        $ampm = " AM";
      } else {
        $ampm = "a";
      }
   }
} else {
   if ($hour < 10) {
      $hour = "0$hour";
   }
   $ampm = "";
}


sub timefix {

if ($day < 10) {
  $day = "0$day";
}

if ($yearformat == 2) { 
   $year -= "2000"; 
   if ($year < 10) { $yearzero = "0"; } else { $yearzero = ""; }
} else {
   $yearzero = "";
}

@months = ("1","2","3","4","5","6","7", "8","9","10","11","12");
$month = @months[$month];
if ($month < 10) { 
  $month = "0$month"; 
}
}

if ($dateformat == 1) {
&timefix;
$date = "$month$dateseperator$day$dateseperator$yearzero$year";
}
if ($dateformat == 2) {
&timefix;
$date = "$day$dateseperator$month$dateseperator$yearzero$year";
}
if ($dateformat == 3) {
&timefix;
$date = "$yearzero$year$dateseperator$month$dateseperator$day";
}
if ($dateformat == 4) {
&timefix;
$date = "$yearzero$year$dateseperator$day$dateseperator$month";
}
if ($dateformat == 5) {
@months = ("January","February","March","April","May","June","July", "August","September","October","November","December");
$month = @months[$month];
$date = "$month $day, $year";

}
if ($dateformat == 6) {
@months = ("Jan","Feb","Mar","Apr","May","Jun","Jul", "Aug","Sep","Oct","Nov","Dec");
$month = @months[$month];
$date = "$month $day, $year";
}

$time = "$hour:$min$ampm";

@entrylayout = "";

$keeplinks = 0;
# Read in entry layout
open (LAYOUT, "entry.txt");
while (<LAYOUT>) {
	$_ =~ s/\[font\]/$fontface/ig;
	$_ =~ s/\[name\]/$name/ig;
	$_ =~ s/\[url\]/$url/ig;
	$_ =~ s/\[email\]/$email/ig;
	$_ =~ s/\[icq\]/$icq/ig;
	$_ =~ s/\[up\]/$up/ig;
	$_ =~ s/\[down\]/$down/ig;
	$_ =~ s/\[entrynum\]/$entryid/ig;
	$_ =~ s/\[comment\]/$comment/ig;
	$_ =~ s/\[date\]/$date/ig;
	$_ =~ s/\[time\]/$time/ig;
	$_ =~ s/\[ip\]/$ip/ig;
	$_ =~ s/\[browser\]/$browser/ig;
	$_ =~ s/\[var1\]/$var1/ig;
	$_ =~ s/\[var2\]/$var2/ig;
	$_ =~ s/\[var3\]/$var3/ig;
	$_ =~ s/\[var4\]/$var4/ig;
	$_ =~ s/\[var5\]/$var5/ig;
	$_ =~ s/\[var6\]/$var6/ig;
	$_ =~ s/\[adminreply\]/$adminreply/ig;
	$_ =~ s/\[alternate\]/$colorswitch/ig;
push (@entrylayout,$_);
}
close(LAYOUT);

return(@entrylayout);
}

# END HTML OF OUTPUTTED ENTRIES

# SIGNING HTML - Modify if you wish

sub signhtml {

# Read in footer
open (FOOTER, "footer.txt");
while (<FOOTER>) {
	$_ =~ s/\[totalnum\]/$totalentries/ig;
	$_ =~ s/\[startnum\]/$startnum/ig;
	$_ =~ s/\[endnum\]/$end/ig;
	$_ =~ s/\[next\]/$next/ig;
	$_ =~ s/\[pagelist\]/$pagesoutput/ig;
	$_ =~ s/\[pagenum\]/$currentpage/ig;
	$_ =~ s/\[totalpages\]/$roundnumofpages/ig;
	$_ =~ s/\[back\]/$back/ig;
	$_ =~ s/\[font\]/$fontface/ig;
push (@footer,$_);
}
close(FOOTER);

print "@footer";
}
# END SIGNING HTML 

# FOOTER - Please do not modify this part of the code.
# It just gives me a tiny bit of credit and also allows others
# to retrieve this guestbook script.
sub footer {

print <<FOOTER;
<br>
<br>
<font size="1" face="Verdana, Arial">Powered by: <a href="#">Guestbook</a> </font><br>
FOOTER
exit;
}