#!/usr/local/bin/perl
#
# susi-grep.pl: unified search index
# Version 0.1
# Date: Thu Jan  6 09:44:55 GMT 1994
#
# Martijn Koster ([email protected])

package susi;

# adjust this for your site.

$hostname = `hostname` =~/victor/ ? 'localweb' : 'web';
$hostname .= '.nexor.co.uk';

&main'debug("susi: hostname for local redirection = $hostname");

# adjust this to your preference
# the single space in the URL is replaced with the query string

%servers = (
           'ALIWEB',   "http://web.nexor.co.uk/aliwebsimple? ",
           'W3 Catalog at NEXOR',      "http://$hostname/w3catalog? ",
           'W3 Catalog',       'http://cui_www.unige.ch/w3catalog? ',
           'Sinbad', "http://$hostname/sinbadgw/read:mak/sinbad/index.db? ",
           'RBSE', 'http://rbse.jsc.nasa.gov/htbin/urlsearch? ',
           'JumpStation', 'http://www.stir.ac.uk/jsbin/h1_js? ',
           'WWW Nomad', 'http://www.rns.com/cgi-bin/parse?Topic= ',
           'Archie',   "http://$hostname/archieplex/server=archie.doc.ic.ac.uk/type=substring/order=host? ",
           'WAIS', 'wais://cnidr.org:210/directory-of-servers? ',
           'Windows Archive', 'gopher://micros.hensa.ac.uk/77/%2bgopher/%2bmicros/%2bibmpc/%2bwin/%2bwais/index? ',
           'Mac Archive', "http://$hostname/mac-archive-find/grep? ",
           'RFC Index', "http://$hostname/rfcindex? ",
           'ID Index', "http://$hostname/idindex? ",
           );

@fields = ('service', 'query');
@requiredfields = ('service', 'query');

sub main'do_susi
{
   local($query) = @_;

   $query ? &search($query) : &dialog;
}


sub dialog
{
    &main'MIME_header('ok', 'text/html');

   print <<'DIALOG';
<HEAD><TITLE>SUSI Search</TITLE></HEAD>
<BODY><H1>SUSI Search</H1>

This is a simple unified search interface for several search
engines in the Web.

<FORM ACTION="/susigrep">
Search term: <INPUT NAME="query">
<inPUT TYPE="submit" VALUE="Submit">
<P>
Search Engine:

<SELECT NAME="service">
DIALOG
foreach (sort keys %servers)
{
   print "<OPTION>$_\n";
}
print <<'DIALOG';
</SELECT>

<HR>
<ADDRESS><A HREF="/mak/mak.html">
Martijn Koster</A></ADDRESS>
</BODY>
DIALOG
}

sub search
{
   local($query) = @_;

   local(@terms) = split('&', $query);

   for(@terms)
   {
       local($tag, $value) = split('=', $_, 2);

       &main'error('bad_request', "Unknown tag: '$tag'. ") if (! grep(/^$tag$/, @fields));

       $value =~ s/\+/ /g;

       $value =~ s/%([\da-f]{1,2})/pack(C,hex($1))/eig;
       &main'error('bad_request', "Duplicate tag: '$tag'.") if ($tags{$tag});
       $tags{$tag} = $value;
   }

   # some specific checking to supply useful error messages
   # prevents user problems being reported as internal problems
   # There might be a better facility for this in Plexus 3.0

   if ($tags{'query'} eq '')
   {
       print 'Please specify a search term.';
       return;
   }
   # make sure required tags are there

   for (@requiredfields)
   {
       &main'error('bad_request', "Missing required tag '<code>$_</code>'.<P>\n" .
       'You probably have an browser that cannot handle forms properly.')
           if  (!$tags{$_});
   }

   &main'error('bad_request', "Please specify a search term.") if (!$query);

   $service = $tags{'service'}; # lookup what the user filled in
   $url = $servers{$service};

   &main'error('bad_request', "Unknown Server '<code>$service</code>'. \n")
           if (!$url);
   $query = $tags{'query'};
   $url =~ s/\s/$query/;
   &main'add_header(*main'out_headers, "Location: $url");
   &main'MIME_header('found', 'text/html');
   print "This document has moved to <A HREF=\"$url\">$service</A>";

   return;
}