#!/usr/npac/bin/perl
##############################################################################
# TextCounter                   Version 1.2                                  #
# Copyright 1996 Matt Wright    mattw@worldwidemart.com                      #
# Created 3/14/96               Last Modified 5/10/96                        #
# Scripts Archive at:           http://www.worldwidemart.com/scripts/        #
##############################################################################
# COPYRIGHT NOTICE                                                           #
# Copyright 1996 Matthew M. Wright  All Rights Reserved.                     #
#                                                                            #
# TextCounter may be used and modified free of charge by anyone so long as   #
# this copyright notice and the comments above remain intact.  By using this #
# code you agree to indemnify Matthew M. Wright from any liability that      #  
# might arise from it's use.                                                 #  
#                                                                            #
# Selling the code for this program without prior written consent is         #
# expressly forbidden.  In other words, please ask first before you try and  #
# make money off of my program.                                              #
#                                                                            #
# Obtain permission before redistributing this software over the Internet or #
# in any other medium.  In all cases copyright and header must remain intact.#
##############################################################################
# Define Variables

# Data Dir is the directory on your server that you wish to store the 
# count files in.  Each page that has the counter on it will have it's own 
# file.  

$data_dir = "/npac/server/foxsden/sroot/droot/simfanatic/simalliance/counterdata/";

# Valid-URI allows you to set up the counter to only work under specific 
# directories on your server.  Include any of these directories as they 
# appear in a URI, into this array.  More information on URI's available in 
# README.

@valid_uri = ('/');

# Invalid-URI allows the owner of this script to set up the counter so 
# that certain portions of the web server that may be included in Valid-URI 
# cannot use the program.  Leave this commented out if you wish not to 
# block out certain parts.

# @invalid_uri = ('/');

##############################################################################
# Set Options

# Show Link allows you to add a link around the counter to point to 
# either instructions explaining to users how to set this up on the system 
# (useful if a system administrator wants to allow anyone to set things up 
# themselves).  Setting it to 0 will make no link, otherwise put the URL
# you want linked to the count here.

$show_link = "0";

# When Auto-Create is enabled, users will be able to auto-create the 
# count on their home pages by simply imbedding the Server Side Includes 
# call.  Setting auto_create to 1 enables it, 0 will disable it. Only 
# users in @valid_uri will be allowed to auto create.

$auto_create = "1";

# Show Date will show the date of when the count began if you set this 
# option to 1.  It will appear in yor document as [Count] hits since [Date].
# Set this to 0 and it will simply return the [Count].

$show_date = "1";

# Lock Seconds will define the number of seconds the script should sit 
# and wait for the lock file to be gone before it will overwrite it if it 
# is still there.  Every now and then a user will interrupt a page, causing 
# the script to halt and leave a lock file in place before the lock file 
# could be removed.  This defines how long it waits.

$lock_sec = "3";

# Padding Size define how many numbers will be shown as your count.  For 
# instance, if you want your count to say 00065 and have the zeros padded 
# up to five digits, then set $pad_size = "5";  If the number goes higher 
# than the pad_size, don't worry, there just won't be any zero's tacked 
# onto the front.

$pad_size = "0";

##############################################################################

# Print Content Type Header For Browser
print "Content-type: text/html\n\n";

# Get the page location from the DOCUMENT_URI environment variable.
$count_page = "$ENV{'DOCUMENT_URI'}";

# Chop off any trailing /'s
if ($count_page =~ /\/$/) {
   chop($count_page);
}

$count_page =~ s/\//_/g;
$lock_file = "$count_page\.lock";

# Check Valid-URI to make sure user can use this program.
&check_uri;

# Check to see if file is locked by program already in use.
&check_lock($lock_sec);

# If the file exists, get the date and count out of it.  Otherwise, if 
# auto_create is allowed, create a new account.  If neither of these are 
# true, return an error.

if (-e "$data_dir$count_page") {
   open(COUNT,"$data_dir$count_page");
   $line = <COUNT>;
   chop($line) if $line =~ /\n$/;
   close(COUNT);
   ($date,$count) = split(/\|\|/,$line);
}
elsif ($auto_create == 1) {
   &create; 
}
else {
   &error('page_not_found');
}

# Increment Count.
$count++;
$print_count = $count;

# Get Count Length for use in padding.
$count_length = length($count);

# Pad the number if it is smaller than $pad_size.
for ($i = $pad_size;$i > $count_length;$i--) {
   $print_count = "0$print_count";
}

# Print the Count, Link and Date depending on what user has specified 
# they wish to print.

if ($show_date == 1) {
   if ($show_link =~ /http:\/\//) {
      print "<a href=\"$show_link\">$print_count</a> hits since $date";
   }
   else {
      print "$print_count hits since $date";
   }
}
else {
   if ($show_link =~ /http:\/\//) {
      print "<a href=\"$show_link\">$print_count</a>";
   }
   else {
      print "$print_count";
   }
}

# Open the count file and write the new count that has been incremented.
open(COUNT,">$data_dir$count_page") || &error('could_not_increment');
print COUNT "$date\|\|$count";
close(COUNT);

# Remove Lock File for next time script is run on that HTML page.
&clean_up;

sub check_uri {
   $uri_check = "0";

   foreach $uri (@valid_uri) {
      if ($ENV{'DOCUMENT_URI'} =~ /$uri/) {
         $uri_check = "1";
         last;
      }
   }

   foreach $uri (@invalid_uri) {
      if ($ENV{'DOCUMENT_URI'} =~ /$uri/) {
         $uri_check = "0";
	 last;
      }
   }

   if ($uri_check == 0) {
      &error('bad_uri');
   }
}

sub create {
   ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
   @months = ("January","February","March","April","May","June","July",
	      "August","September","October","November","December");
   $date = "@months[$mon] $mday, 19$year";
   $count = "0";
   open(COUNT,">$data_dir$count_page") || &error('count_not_created');
   print COUNT "$date\|\|$count";
   close(COUNT);
}

sub error {
   $error = shift(@_);

   if ($error eq 'page_not_found') {
      print "[TextCounter Fatal Error: This Page Not Found\; Auto-Create Option Disabled]";
   }
   elsif ($error eq 'bad_uri') {
      print "[TextCounter Fatal Error: This Page Not In Valid URI]";
   }
   elsif ($error eq 'count_not_created') {
      print "[TextCounter Fatal Error: Could Not Write to File $datadir$count_page]";
   }
   elsif ($error eq 'could_not_increment') {
      print "[TextCounter Fatal Error: Could Not Increment Counter]";
   }
   exit;
}

sub check_lock {
   $time = $_[0];

   for ($i = 1;$i <= $time; $i++) {
      if (-e "$data_dir$lock_file") {
         sleep 1;
      }
      else {
         open(LOCK,">$data_dir$lock_file");
         print LOCK "0";
         close(LOCK);
         last;
      }
   }
}

sub clean_up {
   unlink("$data_dir$lock_file");
}
