$version = "1.11";

require "find.pl";

@day = (Sun,Mon,Tue,Wed,Thu,Fri,Sat);
@month = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
foreach $pair (@pairs){
	($name, $value) = split(/=/, $pair);
	$name =~ tr/+/ /;
	$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
	$value =~ tr/+/ /;
	$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
	if ($FORM{$name}) {
		$FORM{$name} = "$FORM{$name}, $value";
	}
	else {
		$FORM{$name} = $value;
	}
}

if (!$FORM{'boolean'} && !$FORM{'case'}
  && !$FORM{'hits'} && !$FORM{'terms'}) {
	$ListOnly = 1;
}

unless ($FORM{'boolean'}) { $FORM{'boolean'} = "any terms"; }
unless ($FORM{'case'}) { $FORM{'case'} = "insensitive"; }
unless ($FORM{'hits'}) { $FORM{'hits'} = 25; }
unless ($FORM{'terms'}) { $NoTerms = 1; }

$FORM{'terms'} =~ s/\s+/ /g;
$FORM{'terms'} =~ s/^\s//;
$FORM{'terms'} =~ s/\s$//;
$FORM{'terms'} =~ s/([^\w\s])/\\$1/g;
if ($FORM{'boolean'} eq "as a phrase") {
	push (@terms,$FORM{'terms'});
}
else {
	@terms = split(/\s+/,$FORM{'terms'});
}

$matchcount=0;
$filecount=0;

foreach $file (@dirs) {
	undef (@AllFiles,$AllText);
	if ($file =~ s/\+$//) {
		$AllText = 1;
	}
	if ($file =~ s/\*$//) {
		$AllDirs = 1;
		&find ($file);
	}
	else {
		opendir(DIR,$file);
		@AllFiles = readdir(DIR);
		closedir(DIR);
	}
	$file =~ s/\/$//;
	foreach $subfile (@AllFiles) {
		unless ($subfile =~ /^$file/) {
			$subfile = $file."/".$subfile;
		}
		if ((-T "$subfile")
		  && ($AllText || ($subfile =~ /\.(s|p)*htm(l)*$/))
		  && (!$avoid || ($subfile !~ /$avoid/))) {
			$kbytesize{$subfile} = int((((stat($subfile))[7])/1024)+.5);
			$kbytestotal += $kbytesize{$subfile};
			push (@files,"$subfile");
		}
	}
}

if ($ListOnly) {
	@FILES = sort (@files);
	print "Content-type: text/html\n\n";
	&Header("File List");
	print "<PRE>\n\n";
	print "The following files are included in the search:\n\n";
	foreach $FILE (@FILES) {
		if (%otherurls) {
			foreach $path (keys %otherurls) {
				$FILE =~ s/$path/$otherurls{$path}/i;
			}
		}
		$FILE =~ s/$basepath/$baseurl/i;
		print "$FILE\n";
		$filecount ++;
		next;
	}
	print "\nTotal:  ",&commas($filecount)," files\n";
	print "        ",&commas($kbytestotal)," kb\n\n";
	print "</PRE>\n";
	&PrintForm;
	&Footer;
	exit;
}

unless ($NoTerms) {
	foreach $FILE (@files) {
		open (FILE,"$FILE");
		@LINES = <FILE>;
		close (FILE);
		$filecount ++;
		$mtime = (stat($FILE))[9];
		$mtime{$FILE} = $mtime;
		$update{$FILE} = &Get_Date;
		$string = join(' ',@LINES);
		$string =~ s/\n/ /g;
		$string =~ s/<SCRIPT>.*<\/SCRIPT>/ /gi;
		if ($string =~ /<TITLE>([^>]+)<\/TITLE>/i) {
			$title{$FILE} = "$1";
		}
		elsif ($string =~ /SUBJECT>(.+)POSTER>(.+)EMAIL>/i) {
			$title{$FILE} = "$1";
			$poster{$FILE} = "$2";
		}
		else {
			$title{$FILE} = "$FILE";
		}
		if ($SplitNames) {
			@names = split (/<\s*A\s*NAME\s*=\s*"*/i,$string);
		}
		else {
			@names[0] = $string;
		}
		$namescount = @names;
		foreach $key (0..$namescount-1) {
			unless ($key==0) {
				$filename = $names[$key];
				$filename =~ s/^([^">]*).*/#$1/;
				$names[$key] =~ s/^[^">]*"*\s*>(.*)/$1/;
				$filename = "$FILE"."$filename";
			}
			else {
				$filename = $FILE;
			}
			$kbytesize{$filename} = $kbytesize{$FILE};
			$update{$filename} = $update{$FILE};
			$title{$filename} = $title{$FILE};
			$poster{$filename} = $poster{$FILE};
			$val{$filename} = 0;
			$string = $names[$key];
			unless (!($UseDescs) || ($NoMETAs > 0)) {
				if ($string =~ /<[^>]*META[^>]+NAME\s*=[ "]*description[ 
"]+CONTENT\s*=\s*"(([^>"])*)"[^>]*>/i) {
					$description{$filename} = "$1";
				}
			}
			$title{$filename} =~ s/\s+/ /g;
			$title{$filename} =~ s/^\s*//;
			$title{$filename} =~ s/\s*$//;
			if ($poster{$filename}) {
				$poster{$filename} =~ s/\s+/ /g;
				$poster{$filename} =~ s/^\s*//;
				$poster{$filename} =~ s/\s*$//;
			}
			$string =~ s/<[^>]*\s+ALT\s*=\s*"(([^>"])*)"[^>]*>/$1/ig;
			unless ($NoMETAs > 0) {
				$string =~ s/<[^>]*META[^>]+NAME\s*=[ 
"]*(description|keywords)[ "]+CONTENT\s*=\s*"(([^>"])*)"[^>]*>/$2/ig;
			}
			unless (!($UseDescs) || ($description{$filename})) {
				$description = $string;
				if ($description =~ /<BODY/) {
					$description =~ s/.*<BODY[^>]*>(.*)/$1/i;
				}
				elsif ($description =~ /LINKURL>/) {
					$description =~ s/.*LINKURL>[^ ]*(.*)/$1/i;
				}
				$description =~ s/<([^>])*>//g;
				$description =~ s/\s+/ /g;
				$description =~ s/^\s*//;
				$description =~ s/\s*$//;
				$description{$filename} = substr($description,0,250);
			}
			$string =~ s/<([^>])*>//g;
			$string =~ s/\s+/ /g;
			$string =~ s/^\s*//;
			$string =~ s/\s*$//;
			if ($FORM{'boolean'} eq 'all terms') {
				foreach $term (@terms) {
					if ($FORM{'case'} eq 'insensitive') {
						$test = ($string =~ s/$term//ig);
						if ($test < 1) {
							$val{$filename} = 0;
							last;
						}
						else {
							$val{$filename} = $val{$filename}+$test;
						}
					}
					elsif ($FORM{'case'} eq 'sensitive') {
						$test = ($string =~ s/$term//g);
						if ($test < 1) {
							$val{$filename} = 0;
							last;
						}
						else {
							$val{$filename} = $val{$filename}+$test;
						}
					}
				}
			}
			else {
				foreach $term (@terms) {
					if ($FORM{'case'} eq 'insensitive') {
						$test = ($string =~ s/$term//ig);
					}
					elsif ($FORM{'case'} eq 'sensitive') {
						$test = ($string =~ s/$term//g);
					}
					$val{$filename} = $val{$filename}+$test;
				}
			}
			if ($val{$filename} > 0) {
				$truval{$filename} = ($val{$filename});
				$matchcount++;
			}
		}
	}
}

foreach $term (@terms) {
	$term =~ s/\\\\/BaCkSlAsH/g;
	$term =~ s/\\//g;
	$term =~ s/BaCkSlAsH/\\/g;
	$term =~ s/&/&amp;/g;
	$term =~ s/"/&quot;/g;
	$term =~ s/>/&gt;/g;
	$term =~ s/</&lt;/g;
}

print "Content-type: text/html\n\n";
&Header("Search Results");

print "<H1 ALIGN=CENTER>Search Results</H1>\n";
print "<P ALIGN=CENTER>Keywords ($FORM{'boolean'}, ";
print "case $FORM{'case'}): <STRONG>";
if ($NoTerms) {
	print "No Search Terms Provided!";
}
else {
	foreach $term (@terms) {
		print "$term ";
	}
}
print "</STRONG></P>\n";
print "<P ALIGN=CENTER><SMALL>";
print "(<STRONG>",&commas($filecount),"</STRONG> files searched; ";
print "<STRONG>",&commas($matchcount),"</STRONG> match";
if ($matchcount == 1) {
	print " found)";
}
else {
	print "es found)";
}
print "</SMALL>\n";

unless ($FORM{'first'}) { $FORM{'first'} = 1; }
unless ($FORM{'last'}) { $FORM{'last'} = $FORM{'hits'}; }

if ($matchcount == 0) {
	print "<P ALIGN=CENTER>No documents match your search criteria!";
	print "<BR>You might want to revise them and try again.</P>\n";
}
else {
	print "<P ALIGN=CENTER><STRONG>Matches $FORM{'first'} ";
	if ($matchcount < $FORM{'last'}) {
		print "- $matchcount</STRONG></P>\n";
	}
	else {
		print "- $FORM{'last'}</STRONG></P>\n";
	}
	$Count = 0;
	print "<P><UL>\n";
	if ($DisplayByDate > 0) {
		foreach $key (sort ByDate keys %truval) {
			&PrintEntry;
		}
	}
	else {
		foreach $key (sort ByValue keys %truval) {
			&PrintEntry;
		}
	}
	print "</UL></P>\n";
	if (($FORM{'first'} > 1) || ($FORM{'last'} < $matchcount)) {
		print "<P><CENTER><TABLE><TR>\n";
	}
	if ($FORM{'first'} > 1) {
		print "<TD><FORM METHOD=POST ACTION=\"$cgiurl\">\n";
		print "<INPUT TYPE=HIDDEN NAME=\"terms\" VALUE=\"";
		foreach $term (@terms) {
			print "$term ";
		}
		print "\">\n";
		print "<INPUT TYPE=HIDDEN NAME=\"boolean\" ";
		print "VALUE=\"$FORM{'boolean'}\">\n";
		print "<INPUT TYPE=HIDDEN NAME=\"case\" ";
		print "VALUE=\"$FORM{'case'}\">\n";
		print "<INPUT TYPE=HIDDEN NAME=\"hits\" ";
		print "VALUE=\"$FORM{'hits'}\">\n";
		print "<INPUT TYPE=HIDDEN NAME=\"first\" ";
		print "VALUE=\"",($FORM{'first'}-$FORM{'hits'}),"\">\n";
		print "<INPUT TYPE=HIDDEN NAME=\"last\" ";
		print "VALUE=\"",($FORM{'last'}-$FORM{'hits'}),"\">\n";
		print "<INPUT TYPE=SUBMIT ";
		print "VALUE=\"Last $FORM{'hits'} Matches\">\n";
		print "</FORM></TD>\n";
	}
	if ($FORM{'last'} < $matchcount) {
		print "<TD><FORM METHOD=POST ACTION=\"$cgiurl\">\n";
		print "<INPUT TYPE=HIDDEN NAME=\"terms\" VALUE=\"";
		foreach $term (@terms) {
			print "$term ";
		}
		print "\">\n";
		print "<INPUT TYPE=HIDDEN NAME=\"boolean\" ";
		print "VALUE=\"$FORM{'boolean'}\">\n";
		print "<INPUT TYPE=HIDDEN NAME=\"case\" ";
		print "VALUE=\"$FORM{'case'}\">\n";
		print "<INPUT TYPE=HIDDEN NAME=\"hits\" ";
		print "VALUE=\"$FORM{'hits'}\">\n";
		print "<INPUT TYPE=HIDDEN NAME=\"first\" ";
		print "VALUE=\"",($FORM{'first'}+$FORM{'hits'}),"\">\n";
		print "<INPUT TYPE=HIDDEN NAME=\"last\" ";
		print "VALUE=\"",($FORM{'last'}+$FORM{'hits'}),"\">\n";
		print "<INPUT TYPE=SUBMIT VALUE=\"";
		$nextset = $matchcount-$FORM{'last'};
		if ($nextset == 1) {
			print "Next Match";
		}
		elsif ($nextset < $FORM{'hits'}) {
			print "Next $nextset Matches";
		}
		else {
			print "Next $FORM{'hits'} Matches";
		}
		print "\">\n</FORM></TD>\n";
	}
	if (($FORM{'first'} > 1) || ($FORM{'last'} < $matchcount)) {
		print "</TR></TABLE></CENTER></P>\n";
	}
}

&PrintForm;
&Footer;
exit;

sub commas {
	local($_)=@_;
	1 while s/(.*\d)(\d\d\d)/$1,$2/;
	$_;
}

sub Get_Date {
	($mday,$mon,$yr) = (localtime($mtime))[3,4,5];
	$yr += 1900;
	$date = "$mday $month[$mon] $yr";
	return $date;
}

sub PrintEntry {
	$Count++;
	next if ($Count < $FORM{'first'});
	last if ($Count > $FORM{'last'});
	$fileurl = $key;
	if (%otherurls) {
		foreach $path (keys %otherurls) {
			$fileurl =~ s/$path/$otherurls{$path}/i;
			$title{$key} =~ s/$path/$otherurls{$path}/i;
		}
	}
	$fileurl =~ s/$basepath/$baseurl/i;
	$title{$key} =~ s/$basepath/$baseurl/i;
	print "<LI><STRONG><A HREF=\"$fileurl\">";
	print "$title{$key}</A></STRONG>";
	if ($poster{$key}) {
		print " (posted by $poster{$key})";
	}
	print "<BR><SMALL>Keyword Matches: ";
	print "<STRONG>$truval{$key}</STRONG>; ";
	print "Size: <STRONG>$kbytesize{$key} kb</STRONG>; ";
	print "Last Updated: ";
	print "<STRONG>$update{$key}</STRONG></SMALL>\n";
	if ($description{$key}) {
		print "<BR><EM>$description{$key}</EM>\n";
	}
	print "<P>\n";
}

sub ByDate {
	$aval = $mtime{$a};
	$bval = $mtime{$b};
	$bval <=> $aval;
}

sub ByValue {
	$aval = $truval{$a};
	$bval = $truval{$b};
	$bval <=> $aval;
}

sub wanted {
	(push (@AllFiles, $name)) && -f $_;
}

sub PrintForm {
	print "<P><CENTER><TABLE BORDER CELLPADDING=12><TR><TD>\n";
	print "<H2 ALIGN=CENTER>New Search</H2>\n";
	print "<FORM METHOD=POST ACTION=\"$cgiurl\">\n";
	print "<P><CENTER>Terms for which to Search:\n";
	print "<BR><INPUT TYPE=TEXT NAME=\"terms\" SIZE=60 VALUE=\"";
	foreach $term (@terms) {
		print "$term ";
	}
	print "\">\n<P>Find: <SELECT NAME=\"boolean\"> ";
	if ($FORM{'boolean'} eq 'any terms') {
		print "<OPTION SELECTED>any terms<OPTION>all terms";
		print "<OPTION>as a phrase</SELECT> ";
	}
	elsif ($FORM{'boolean'} eq 'all terms') {
		print "<OPTION>any terms<OPTION SELECTED>all terms";
		print "<OPTION>as a phrase</SELECT> ";
	}
	else {
		print "<OPTION>any terms<OPTION>all terms";
		print "<OPTION SELECTED>as a phrase</SELECT> ";
	}
	print "Case: <SELECT NAME=\"case\"> ";
	if ($FORM{'case'} eq 'insensitive') {
		print "<OPTION SELECTED>insensitive";
		print "<OPTION>sensitive</SELECT> ";
	}
	else {
		print "<OPTION>insensitive";
		print "<OPTION SELECTED>sensitive</SELECT> ";
	}
	print "Display: <SELECT NAME=\"hits\"> ";
	print "<OPTION";
	if ($FORM{'hits'} == 10) {
		print " SELECTED";
	}
	print ">10<OPTION";
	if ($FORM{'hits'} == 25) {
		print " SELECTED";
	}
	print ">25<OPTION";
	if ($FORM{'hits'} == 50) {
		print " SELECTED";
	}
	print ">50<OPTION";
	if ($FORM{'hits'} == 100) {
		print " SELECTED";
	}
	print ">100</SELECT>\n";
	print "<P><INPUT TYPE=SUBMIT VALUE=\"Search\">";
	print "</CENTER></FORM></P>\n";
	print "<P ALIGN=CENTER><SMALL>The search terms you input ";
	print "do not have to be complete words.";
	print "<BR>&quot;Wash,&quot; for example, will match ";
	print "occurrences of wash, washer, Washington, etc.";
	print "<BR>Do not include asterisks or other non-alphanumeric ";
	print "characters in your search terms";
	print "<BR>unless you actually want them included (as with ";
	print "&quot;C++&quot;) as part of your search.\n";
	print "<P ALIGN=CENTER>";
	print "Maintained with <STRONG>";
	print "<A HREF=\"http://awsd.com/scripts/websearch/\">";
	print "WebSearch $version</A></STRONG>.</SMALL></P>\n";
	print "</TD></TR></TABLE></CENTER></P>\n";
}

sub Header {
	($title) = @_;
	print "<HTML><HEAD><TITLE>$title</TITLE></HEAD>\n";
	print "<BODY $bodyspec>\n";
	if ($header_file) {
		open (HEADER,"$header_file");
		@header = <HEADER>;
		close (HEADER);
		foreach $line (@header) {
			if ($line =~ /<!--InsertAdvert\s*(.*)-->/i) {
				&insertadvert($1);
			}
			else {
				print "$line";
			}
		}
	}
}

sub Footer {
	if ($footer_file) {
		open (FOOTER,"$footer_file");
		@footer = <FOOTER>;
		close (FOOTER);
		foreach $line (@footer) {
			if ($line =~ /<!--InsertAdvert\s*(.*)-->/i) {
				&insertadvert($1);
			}
			else {
				print "$line";
			}
		}
	}
	print "</BODY></HTML>\n";
}

sub insertadvert {
	require "/u2/www/users/dburgdor/scripts/ads/ads_display.pl";
	$adverts_dir = "/u2/www/users/dburgdor/scripts/ads/ads";
	$display_cgi = "http://awsd.com/scripts/ads/ads.pl";
	$advertzone = $_[0];
	$ADVUseBackup = 1;
	$ADVUseLocking = 1;
	$NonSSI = 0;
	$ADVNoPrint = 1;
	&ADVsetup;
}
