#!/usr/bin/perl
# This line says "Hey, Man, I'm a Perl program!"
# It points to the Location of the Perl Interpreter on your server. 
# This tells the server that your program 
# needs to be interpreted/executed
# Some windows environments will not require this line


# Note: when saving this script from your browser you will need to save it as
# scipt.pl or script.cgi


######### This Section is where we will START to define all of our variables #########

# The name of our text file we are going to use
$FileName = "info.txt";

# The path (not the url!) to the directory where the text file is located
# For UNIX it would look like this $ServerPath = "/www/usr/web/";
# For WIN32 it would look like this $ServerPath = "C:\\www\\usr\\web\\";
$ServerPath = "/www/webref/webref/dev/perl/";

######### This is where we will END identifying our variables ###################

# This calls the Parse Form SUBROUTINE
&parse_form;

# This calls our date accessor functions SUBROUTINE (i.e. returns the date)
&GetDate;

# This Prints the appropriate HTTP Header Type so that the browser knows we are sending it text or html
# if we didn't have this we would get an internal server error

sub PrintHeader {
	print "Content-type: text/html\n\n";
}


# This next section examines the Query String 
# The informatoin we passes to the program by appending the ? and then the command
# i.e. when we called the script http://www.yourdomain.com/cgi-bin/script.cgi?exec
# everything after the ? would be the Query_String-- in this case it would be "exec"
# This is a standard if statement 
# if (this expression is true) {
# Do This!
# }

if ($ENV{'QUERY_STRING'} =~ /exec/i) {

# Now we could change the above line to the below to make it easier to understand, but
# by using the "=~ /exec/i" instead of eq "exec" we are telling the program to look for 
# any string containing the string "exec" regardless of case....we could pass it ?ExEcdog
# and it would work as opposed to the below version where we would have to pass it the literal 
# translation or "exec" case sensitive and with no accompanying characters.
# if($ENV{'QUERY_STRING'} eq "exec") {

# If the correct Query String is passed we will do whatever we are told to do between the opening 
# and closing brackets {}
# NOTE that we do not need semicolons after the opening if statement and the closing bracket
# First we call the print header subroutine to tell the browser what kind of output to expect
# and to print the appropriate HTTP header

&PrintHeader;

# And then we print out a few lines of text using our standard print statement termintaed by a semicolon
# you might want to try and add a few lines here in this format:
# print "whatever text you want";
# It is important to note here that for the most part Perl is not case or 
# whitespace sensitive (not including variables)

print "Hey, man, it worked!\n<br>";
print "I'm executed!\n<br>";
print "$date\n<br>";

# The "\n" you see is Perl's new line character, which is basically just like hitting the return button
# in a text editor. It is not necessary but does make it easier to read the code if you were to view 
# source on the page produced

} # Terminate true expression

# If we don't pass it a Query String let's, that is just call our program, we will call the LogMe subroutine

else { 				# beginning of else statement
&LogMe 			# Call the LogMe subroutine
} 				# terminate else statement


# Here is another SUBROUTINE that takes care of writing our information to the text file
# The format for a subroutine -a block of code which accomplishes a specific task-
# sub SomeName {
# put code here
# } 
# End subroutine
sub LogMe {
# Open file we specified in our variables our senmd an error to our log file
# The word "FILE" is called a file handle and we can substitute any name we want as long as we
# keep it uniform
open(FILE,">>$ServerPath$FileName") || die ("no luck with opening file $dir$file");
# Print the Environmental variables about the user to the text file separated by a | character
print FILE "$shortdate|$hour:$min $ampm|$ENV{'HTTP_REFERER'}|$ENV{'REMOTE_ADDR'}|$ENV{HTTP_USER_AGENT}|$ENV{'DOCUMENT_NAME'}\n";
# Make sure we close our file, using the file handle
close(FILE);
# print the appropriate HTTP header
   &PrintHeader;
# Let us know we are done
           print "You Have Been Logged!";
} #End LogMe subroutine


sub Error {
   &PrintHeader;
        print "You Have Done Something Wrong! -Ha Ha";
}

sub GetDate {
	@days =
	  (Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);
	@months =
	  (January,February,March,April,May,June,
	  July,August,September,October,November,December);
	$time = time;
	($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
	  localtime($time);
	$sam = $mon+1;
	$shortdate = "$mday/$sam/$year";
	$ampm = "AM";
	if ($hour eq 12) { $ampm = "PM"; }
	if ($hour eq 0) { $hour = "12"; }
	if ($hour > 12) {
		$hour = ($hour - 12);
		$ampm = "PM";
	}
	if ($min < 10) { $min = "0$min"; }
	$year = 1900+$year;
	$todaydate = "$days[$wday], $mday $months[$mon] $year";
	$date = $todaydate . " $hour\:$min $ampm";

}

#This is the parse form subroutine
#It converts the Name/Value pairs
#It also facilitates both Get and Post requests
sub parse_form {
 if ($ENV{'REQUEST_METHOD'} eq 'GET') {
        # Split the name-value pairs
        @pairs = split(/&/, $ENV{'QUERY_STRING'});
    }

    elsif ($ENV{'REQUEST_METHOD'} eq 'POST') {
        # Get the input
        read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
 
        # Split the name-value pairs
        @pairs = split(/&/, $buffer);
    }
    else {
   #Print the Header so the browser knows what is coming 	
   &PrintHeader;
        print "Bad Request Method";
    }

   # Get the input
   # read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
   # Split the name-value pairs
   foreach $pair (@pairs) {
      ($name, $value) = split(/=/, $pair);

      # Un-Webify plus signs and %-encoding
      $value =~ tr/+/ /;
      $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
      $value =~ s/<!--(.|\n)*-->//g;

      if ($allow_html != 1) {
         $value =~ s/<([^>]|\n)*>//g;
      }
      else { }
      $FORM{$name} = $value;
   }

}


