#!/usr/bin/perl -- -*-perl-*-

# Set constants, parameters, config values etc
#
# Updated to v4 February 2007
#
$AP_version="4.0a"; # software version number version 4.0 (a=anon only)
$AP_for=5;        # default number of entries returned in search
$AP_from=0;        # default starting entry in search
$BodyShown=0;      # flag to know whether we've shown off our body yet
$TableShown=0;     # flag to know whether we've shown off our tabletop
#
#  Text messages in english and french - choose at runtime
#

$msgSearch   = 0;
$msgSearch4  = 1;
$msgSearchby = 2;
$msgViewby   = 3;
$msgChoose   = 4;
$msgShow     = 5;
$msgClick    = 6;
$msgPrev     = 7;
$msgNext     = 8;
$msgAlpha    = 9;
$msgResult   = 10;
$msgFound	 = 11;
$msgTo	     = 12;
$msgOf	     = 13;
$msgAuthor	 = 14;
$msgYear	 = 15;
$msgPages	 = 16;
$msgDescr	 = 17;
$msgPrice	 = 18;
$msgCat	     = 19;
$msgCatno	 = 20;
$msgTitle	 = 21;
$msgGet      = 22;
$msgHere     = 23;
$msgResults  = 24;
$msgThanks   = 25;
$msgMissing  = 26;
$msgOrder    = 27;
$msgOr       = 28;
$msgNoString = 29;
$msgPrevpost = 30;
$msgNextpost = 31;
$msgToOfpre  = 32;
$msgAddBask  = 33;
$msgViewBask = 34;

@englishmsgs = ("Search","Search for","Search by book title","View books by category",
                "Choose category from list","Show Category","Click","Previous",
                "Next","View alphabetic list of books by author",
                "resulted in the following","books found","to","of",
                "Author","Year","Pages","Description","Price","Category","Cat no","Title",
                "Get Details","here","to return to your search results",
                "Thank you for using this search facility","Unfortunately some data was missing",
                "Order this title","OR","Missing search string","","","",
                "Add to shopping basket","View shopping basket");

@frenchmsgs =  ("Recherche","Recherche pour","Bien recherchez-les par titre",
                "Cherchez les livres par cat&eacute;gorie",
                "Choisissez la cat&eacute;gorie de la liste","D&eacute;tails de la cat&eacute;gorie",
                "Cliquez","","",
                "Consultez la liste alphab&eacute;tique des livres par auteurs",
                "aboutis &agrave;","enregistrements trouv&eacute;s","&agrave;","<br>",
                "Auteur","An","Pages","Description","Prix","Cat&eacute;gorie","Cat no","Titre",
                "Voir les d&eacute;tails","ici","pour retourner a votre r&eacute;sultats",
                "Merci pour utiliser cette facilit&eacute; de recherche",
                "Malheureusement quelque donn&eacute;es &eacute;taient manquant",
                "Passer la commande de ce titre","OU","Cha&icirc;ne de recherche manquant",
                "pr&eacute;c&eacute;dente","suivant","r&eacute;sultats de la recherche",
                "Ajoutez au panier","Regardez le panier");

@msgtxt = ();

#
%accents = ();

#  $accents{""} = "&aacute;";
#  $accents{""} = "&agrave;";
#  $accents{""} = "&eacute;";
#  $accents{""} = "&egrave;";
#  $accents{""} = "&iacute;";
#  $accents{""} = "&igrave;";
#  $accents{""} = "&oacute;";
#  $accents{""} = "&ograve;";
#  $accents{""} = "&uacute;";
#  $accents{""} = "&ugrave;";
#  $accents{""} = "&acirc;";
#  $accents{""} = "&ecirc;";
#  $accents{""} = "&icirc;";
#  $accents{""} = "&ocirc;";
#  $accents{""} = "&ucirc;";
#  $accents{""} = "&ccedil;";
#  $accents{""} = "&Aacute;";
#  $accents{""} = "&Agrave;";
#  $accents{""} = "&Eacute;";
#  $accents{""} = "&Egrave;";
#  $accents{""} = "&Iacute;";
#  $accents{""} = "&Igrave;";
#  $accents{""} = "&Oacute;";
#  $accents{""} = "&Ograve;";
#  $accents{""} = "&Uacute;";
#  $accents{""} = "&Ugrave;";
#  $accents{""} = "&Acirc;";
#  $accents{""} = "&Ecirc;";
#  $accents{""} = "&Icirc;";
#  $accents{""} = "&Ocirc;";
#  $accents{""} = "&Ucirc;";
#  $accents{""} = "&Ccedil;";
#  $accents{""} = "&pound;";
#  $accents{""} = "&ldquo;";
#  $accents{""} = "&rdquo;";
#  $accents{""} = "&lsquo;";
#  $accents{""} = "&rsquo;";

%accents = ();
$accents{""} = "&aacute;";
$accents{""} = "&agrave;";
$accents{""} = "&eacute;";
$accents{""} = "&egrave;";
$accents{""} = "&iacute;";
$accents{""} = "&igrave;";
$accents{""} = "&oacute;";
$accents{""} = "&ograve;";
$accents{""} = "&uacute;";
$accents{""} = "&ugrave;";
$accents{""} = "&acirc;";
$accents{""} = "&ecirc;";
$accents{""} = "&icirc;";
$accents{""} = "&ocirc;";
$accents{""} = "&ucirc;";
$accents{""} = "&ccedil;";
$accents{""} = "&Aacute;";
$accents{""} = "&Agrave;";
$accents{""} = "&Eacute;";
$accents{""} = "&Egrave;";
$accents{""} = "&Iacute;";
$accents{""} = "&Igrave;";
$accents{""} = "&Oacute;";
$accents{""} = "&Ograve;";
$accents{""} = "&Uacute;";
$accents{""} = "&Ugrave;";
$accents{""} = "&Acirc;";
$accents{""} = "&Ecirc;";
$accents{""} = "&Icirc;";
$accents{""} = "&Ocirc;";
$accents{""} = "&Ucirc;";
$accents{""} = "&Ccedil;";
$accents{""} = "&pound;";
$accents{""} = "&ldquo;";
$accents{""} = "&rdquo;";
$accents{""} = "&lsquo;";
$accents{""} = "&rsquo;";


#

# IMPORTANT - Include our logo/link - local version for testing, must comment out and replace with live version below for live use
#
#$APlogo="<a href=\"http://www.alnpete.co.uk/fromdlite.html\" target=\"_blank\" onMouseOver=\"MM_displayStatusMsg(\'Click here to find out more about Alnpete\');return document.MM_returnValue\"><img src=\"http://10.0.1.6/MaghrebReview/pix/databaselite.gif\" align=\"right\" width=\"88\" height=\"31\" alt=\"powered\" border=\"0\"></a>\n";
$APlogo="<a href=\"http://www.alnpete.co.uk/fromdlite.html\" target=\"_blank\" onMouseOver=\"MM_displayStatusMsg(\'Click here to find out more about Alnpete\');return document.MM_returnValue\"><img src=\"http://www.alnpete.co.uk/home/pix/databaselite.gif\" align=\"right\" width=\"88\" height=\"31\" alt=\"powered\" border=\"0\"></a>\n";

# Set local values for off-line testing - must be commented out for live use
#
#
#
#
#
#
#
&database_main;
&parse_Action;
#
#
#
#
#
sub database_main 
{
  $cfgfile=&my_filename; # determine config file name
  &setup_cfgfields;   # populate configuration details from config file
  &setup_postfields;  # populate $FORM from POST fields
  &setup_querystring; # populate $FORM from GET  fields
  
  if ($use_language eq 'fr')
       {@msgtxt = @frenchmsgs;}
  else {@msgtxt = @englishmsgs;}
  
  $DBLogo="<img src=\"$custLogo\" align=\"right\" name=\"custlogo\">";
  $DBLogoc="<img src=\"$custLogo\" name=\"custlogo\">";
  
  print "Content-type: text/html; charset=iso-8859-1\n\n";
  print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">";
  print "<html lang=\"$use_language\"><head><title>$pagetitle</title>\n";
  
  $getAction='Anon' unless $FORM{'Action'}; # don't know what to do so treat like Anon
  
  $getAction=$FORM{'Action'};
  $getName=$FORM{'Name'};
  $getHash=$FORM{'_PassHash'};
  $getPass=$FORM{'_Pass'};
  $getPas2=$FORM{'_Pas2'};
  $getRec=$FORM{'Rec'};
  $from=$FORM{'From'};
  $for=$FORM{'For'};
  $now_string=&current_time;
  &write_log($now_string, $getAction);
}

sub parse_Action {
if    ($getAction eq 'Anon')        # ANON processing --------------<
  {if ($allow_anonymous eq 'Y')
   {&show_body;
    &display_search($getName,"");
    &show_unbody;
   }
  }

elsif ($getAction eq 'List')         # LIST processing ---------------<
  {&norec_response unless $FORM{'Rec'};        # search string missing so say so and exit
   if ($allow_anonymous ne 'Y')
      {&goaway_response unless $FORM{'Name'};      # name missing so say so and exit
       &badname_response if &check_email($getName);# name invalid so say so and exit
       &goaway_response if &check_clash($getName); # name invalid so say so and exit
      }
   $for=$AP_for unless $FORM{'For'};           # set default value if no parameter
   $from=$AP_from unless $FORM{'From'};        # set default value if no parameter

   &show_body;
   &display_search($getName, "");

   $first = $from+1;
   $last = $from+$for;
   $i=0;

   &list_records($getRec,$i,$first,$last,$getName);
   &next_buttons($i,$first,$last,$for,$getRec,$getName,$getAction);
   &show_blurb_table;
   &show_unbody;
  }

elsif ($getAction eq 'Category')         # SECTOR processing ---------------<
  {&norec_response unless $FORM{'Rec'};        # search string missing so say so and exit
   if ($allow_anonymous ne 'Y')
      {&goaway_response unless $FORM{'Name'};      # name missing so say so and exit
       &badname_response if &check_email($getName);# name invalid so say so and exit
       &goaway_response if &check_clash($getName); # name invalid so say so and exit
      }
   $for=$AP_for unless $FORM{'For'};           # set default value if no parameter
   $from=$AP_from unless $FORM{'From'};        # set default value if no parameter

   &show_body;
   &display_search($getName, "");

   $first = $from+1;
   $last = $from+$for;
   $i=0;

   &list_category($getRec,$i,$first,$last,$getName);
   &next_buttons($i,$first,$last,$for,$getRec,$getName,$getAction);
   &show_blurb_table;
   &show_unbody;
  }

elsif ($getAction eq 'Search')       # SEARCH processing -------------<
  {&norec_response unless $FORM{'Rec'};        # search string missing so say so and exit
   if ($allow_anonymous ne 'Y')
      {&goaway_response unless $FORM{'Name'};      # name missing so say so and exit
       &badname_response if &check_email($getName);# name invalid so say so and exit
       &goaway_response if &check_clash($getName); # name invalid so say so and exit
      }
   $for=$AP_for unless $FORM{'For'};           # set default value if no parameter
   $from=$AP_from unless $FORM{'From'};        # set default value if no parameter

   &show_body;
   &display_search($getName, $getRec);

   $first = $from+1;
   $last = $from+$for;
   $i=0;

   &search_records($getRec,$i,$first,$last,$getName);
   &next_buttons($i,$first,$last,$for,$getRec,$getName,$getAction);
   &show_blurb_table;
   &show_unbody;
  }

elsif ($getAction eq 'Detail')       # DETAIL processing -------------<
  {&norec_response unless $FORM{'Rec'};        # search string missing so say so and exit
   if ($allow_anonymous ne 'Y')
      {&goaway_response unless $FORM{'Name'};      # name missing so say so and exit
       &badname_response if &check_email($getName);# name invalid so say so and exit
       &goaway_response if &check_clash($getName); # name invalid so say so and exit
      }

   &show_body;
   &nodet_response if &display_detail($getRec);
   &show_unbody;
  }

elsif ($getAction eq 'Validate')      # VALIDATE processing ------------<
  {&nohash_response unless $FORM{'_PassHash'}; # hash missing so say so and exit
   $passHash="Caligula";
   &nohash_response unless ($passHash eq $getHash); # wrong hash so say so and exit
   &show_body;
   &show_info($now_string, $FORM{'_Seed'});
   &show_unbody;
  }

else  # some other undefined value so treat like ANON
  {if ($allow_anonymous eq 'Y')
   {&show_body;
    &display_search($getName,"");
    &show_unbody;
   }
  }
}

# ---------- Basic Subroutines --------------------------------

sub Oops
{$line1="$_[0] failed";
 $line2="There was a server error. Please inform the webmaster that $_[0] failed with $! at ";
 $line3=&current_time;
 &issue_response($line1,$line2,$line3);
}

sub Aargh
{# For use when no setup has been achieved at all yet - standalone error message
 $line1="$_[0] failed";
 $line2="There was a server error. Please inform the webmaster that $_[0] failed with $! at ";
 $line3=&current_time;
 print "Content-type: text/html; charset=iso-8859-1\n\n";
 print "<html><head><title>Oops</title>\n";
 print "</head><body bgcolor=\"#FFFFFF\">\n";
 &page_heading($line1);
 print "<BR>$line2<BR>\n";
 print "$line3";
 print "</body>\n</html>\n";
 exit;
}

sub setup_querystring
{$buffer = $ENV{'QUERY_STRING'};
 @pairs = split(/&/,$buffer);
 $fieldcount = 1;
 foreach $pair (sort(@pairs))
 {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
   $value =~ tr/\n/ /;
   $fieldcount = 1 unless $FORM{$name};
   if ($FORM{$name}) 
   { $name = join("_", $name,$fieldcount); 
     $fieldcount = $fieldcount + 1;};
   $FORM{$name} = $value;
 }
}

sub setup_postfields
{read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
 $ENV{'POST_STRING'} = $buffer;
 @pairs = split(/&/,$buffer);
 $fieldcount = 1;
 foreach $pair (sort(@pairs))
 {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
   $value =~ tr/\n/ /;
   $fieldcount = 1 unless $FORM{$name};
   if ($FORM{$name}) 
   { $name = join("_", $name,$fieldcount); 
     $fieldcount = $fieldcount + 1;};
   $FORM{$name} = $value;
 }
}

sub setup_cfgfields
{if (-e $cfgfile) # file exists, otherwise don't bother
 {
  open(CONFIG,"<$cfgfile") || &Aargh("Config");
  @lines = <CONFIG>;
  close(CONFIG);

  foreach $line (@lines) {
   if (index($line,"#")==-1)     # ignore comment lines
   {
    ($name, $value) = split(/=/, $line);
    $eol1 = index($value,"\n"); # end of line
    if ($eol1 > 0) {$value1=substr($value,0,$eol1);}	# chomp off newline
    $CONFIG{$name} = $value1;
   }
  }

  $FileDir=$CONFIG{'$FileDir'};

  $regfile=$FileDir.$CONFIG{'$regfile'};
  $loggingfile=$FileDir.$CONFIG{'$loggingfile'};
  $datafile=$FileDir.$CONFIG{'$datafile'};
  $blurbfile=$FileDir.$CONFIG{'$blurbfile'};
  $footerfile=$FileDir.$CONFIG{'$footerfile'};
  $categoryfile=$FileDir.$CONFIG{'$categoryfile'};

  $CgiURL=$CONFIG{'$CgiURL'};
  $OrdersURL=$CONFIG{'$OrdersURL'};
  $FrameURL=$CONFIG{'$FrameURL'};
  $CSSURL=$CONFIG{'$CSSURL'};
  $BaseURL=$CONFIG{'$BaseURL'};
  $ThanksURL=$CONFIG{'$ThanksURL'};
  $custLogo=$CONFIG{'$custLogo'};
  $pagetitle=$CONFIG{'$pagetitle'};
  $serial_no=$CONFIG{'$serial_no'};
  $customer=$CONFIG{'$customer'};
  $stored=$CONFIG{'$stored'};
  $adminhash=$CONFIG{'$admin'};
  $notify_mail=$CONFIG{'$notify_mail'};
  $allow_anonymous=$CONFIG{'$allow_anonymous'};
  $use_language=$CONFIG{'$use_language'};
  $postfirst=$CONFIG{'$postfirst'};
  $postrest=$CONFIG{'$postrest'};

 }
 else {&Aargh("Configuration setup");}
}

sub current_time
{
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
$year=$year+1900;
if ($yday<10) {$yday="0".$yday};
if ($hour<10) {$hour="0".$hour};
if ($min<10) {$min="0".$min};
if ($sec<10) {$sec="0".$sec};
return "$year:$yday $hour:$min:$sec";
}

sub my_filename
{
 $ind_name=rindex($ENV{'SCRIPT_NAME'},"/"); # finds filename at the end
 if ($ind_name >= 0) {$file_name=substr($ENV{'SCRIPT_NAME'}, $ind_name+1);}
 else {$file_name=$ENV{'SCRIPT_NAME'};}
 
 $ind_extn=rindex($file_name,"."); # finds extension (should be .pl)
 if ($ind_extn >=0) {substr($file_name,$ind_extn)=".cfg";}
 if (-e $file_name) {return $file_name;}
 else {return "databaselite.cfg";} 
}

sub handle_accents
{
 $localstring = $_[0];
 foreach $accent (keys (%accents)) {
 $localstring =~ s/$accent/$accents{$accent}/g;}
 return $localstring;
}

# ---------- Response Subroutines --------------------------------


sub nohash_response
{$line1="Missing response code";
 $line2="$msgtxt[$msgThanks].";
 $line3="$msgtxt[$msgMissing].";
 &issue_response($line1,$line2,$line3);
}

sub goaway_response
{$line1="Please login first";
 $line2="$msgtxt[$msgThanks].";
 $line3="$msgtxt[$msgMissing].";
 &issue_response($line1,$line2,$line3);
}

sub noname_response
{$line1="Missing name";
 $line2="$msgtxt[$msgThanks].";
 $line3="$msgtxt[$msgMissing].";
 &issue_response($line1,$line2,$line3);
}

sub badname_response
{$line1="Invalid name";
 $line2="$msgtxt[$msgThanks].";
 $line3="$msgtxt[$msgMissing].";
 &issue_response($line1,$line2,$line3);
}

sub norec_response
{$line1="$msgtxt[$msgNoString]";
 $line2="$msgtxt[$msgThanks].";
 $line3="$msgtxt[$msgMissing].";
 &issue_response($line1,$line2,$line3);
}

sub nodet_response
{$line1="Missing details";
 $line2="$msgtxt[$msgThanks].";
 $line3="$msgtxt[$msgMissing].";
 &issue_response($line1,$line2,$line3);
}

sub issue_response
{&show_body unless $BodyShown;      # show body if we haven't already
 &page_heading($_[0]);
 print "<p>$_[1]<br>\n";
 print "$_[2]</p>";
 if ($TableShown) {&show_unbody;}
 else {print "</body>\n</html>\n";}
 exit;
}

sub page_heading
{print "<h2> $_[0] </h2>\n";
}

sub page_subheading
{print "<h4> $_[0] </h4>\n";
}

sub show_body
{&MM_status;
 print "<meta name=\"GENERATOR\" content=\"databaselite v $AP_version\">\n";
 print "<link rel=\"stylesheet\" href=\"$CSSURL\">\n";
 print "<base href=\"$BaseURL\">\n";
 print "</head><body bgcolor=\"#FFFFFF\">\n";
 $BodyShown=1;      # flag that we've shown off our body
 &show_tabletop;
}

sub show_tabletop
{print "<div align=\"left\">\n";
 print "<table border=\"0\" width=\"95%\" align=\"center\">\n";
 print "<tr>\n";
 print "<td width=\"5%\">&nbsp;</td>\n";
 print "<td width=\"90%\">\n";
 $TableShown=1;    # flag that we've shown our tabletop
}

sub show_unbody
{print "</td>\n";
 print "<td width=\"5%\">&nbsp;</td>\n";
 print "</tr>\n";
 print "<tr>\n";
 print "<td width=\"5%\">&nbsp;</td>\n";
 print "<td width=\"90%\">\n";
 &show_footer;
 print "</td>\n";
 print "<td width=\"5%\">&nbsp;</td>\n";
 print "</tr>\n";
 print "</table>\n";
 print "</div>\n";
 print "</body>\n</html>\n";
}

# ---------- Logging file Subroutines --------------------------------

sub write_log
{open(LOGFILE,">>$loggingfile") || &Oops("Logging");
 print LOGFILE "$_[0]\t"; # time/date
 print LOGFILE "$_[1]\t"; # record type
 print LOGFILE "$AP_version\t"; # script version
# print LOGFILE "QUERY_STRING = $ENV{'QUERY_STRING'}\t";
# print LOGFILE "POST_STRING = $ENV{'POST_STRING'}\t";
# print LOGFILE "HTTP_REFERER = $ENV{'HTTP_REFERER'}\t";
 print LOGFILE "HTTP_USER_AGENT = $ENV{'HTTP_USER_AGENT'}\t";
 print LOGFILE "REMOTE_ADDR = $ENV{'REMOTE_ADDR'}\t";
 print LOGFILE "REMOTE_HOST = $ENV{'REMOTE_HOST'}\t";

 foreach $key (sort(keys %FORM))
 {
  if (index($key,"_")!=0) {print LOGFILE "$key = $FORM{$key}:\t"};
 }

 print LOGFILE "End\n";
 close (LOGFILE);
}


# ---------- Positive response Subroutines --------------------------------


sub display_search
{print "<center>\n";
 print "<table width=\"95%\" border=\"0\" cellspacing=\"5\" cellpadding=\"5\">\n";
 print "<tr><td width=\"20%\" align=\"right\"><p class=\"smallright\">$msgtxt[$msgAlpha]</p></td>\n";
 print "<td width=\"79%\" align=\"left\">\n";
 print "<FORM NAME=\"listForm\" ACTION=\"$CgiURL\" METHOD=POST>\n";
 print "<INPUT TYPE=\"hidden\" NAME=\"Action\" VALUE=\"List\">\n";
 print "<INPUT TYPE=\"hidden\" NAME=\"Name\" VALUE=\"$_[0]\">\n";
 print "<INPUT TYPE=\"hidden\" NAME=\"From\" VALUE=\"0\">\n";
 print "<INPUT TYPE=\"hidden\" NAME=\"For\" VALUE=\"$AP_for\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"a\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"b\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"c\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"d\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"e\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"f\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"g\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"h\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"i\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"j\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"k\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"l\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"m\">\n";
 print "<br>\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"n\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"o\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"p\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"q\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"r\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"s\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"t\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"u\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"v\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"w\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"x\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"y\">\n";
 print "<INPUT TYPE=\"submit\" NAME=\"Rec\" VALUE=\"z\">\n";
 print "</FORM>\n";
 print "</td></tr>\n";
 
 print "<tr><td width=\"20%\" align=\"center\" valign=\"middle\"><p class=\"smallright\">$msgtxt[$msgOr]</p></td>\n";
 print "<td width=\"79%\" align=\"left\"><hr></td></tr>\n";

 print "<tr><td width=\"20%\" align=\"right\"><p class=\"smallright\">$msgtxt[$msgViewby]</p></td>\n";
 print "<td width=\"79%\" align=\"left\">\n";
 print "<FORM NAME=\"categoryForm\" ACTION=\"$CgiURL\" METHOD=POST>\n";
 &build_categorylist;
 print "<INPUT TYPE=\"hidden\" NAME=\"Action\" VALUE=\"Category\">\n";
 print "<INPUT TYPE=\"hidden\" NAME=\"Name\" VALUE=\"$_[0]\">\n";
 print "<INPUT TYPE=\"hidden\" NAME=\"From\" VALUE=\"0\">\n";
 print "<INPUT TYPE=\"hidden\" NAME=\"For\" VALUE=\"$AP_for\">\n";
 print "<INPUT TYPE=\"submit\" VALUE=\"$msgtxt[$msgShow]\">\n";
 print "</FORM>\n";
 print "</td></tr>\n";
 
 print "<tr><td width=\"20%\" align=\"center\" valign=\"middle\"><p class=\"smallright\">$msgtxt[$msgOr]</p></td>\n";
 print "<td width=\"79%\" align=\"left\"><hr></td></tr>\n";

 print "<tr><td width=\"20%\" align=\"right\"><p class=\"smallright\">$msgtxt[$msgSearchby]</p></td>\n";
 print "<td width=\"79%\" align=\"left\">\n";
 print "$APlogo";
 print "<FORM NAME=\"searchForm\" ACTION=\"$CgiURL\" METHOD=POST>\n";
 print "<INPUT TYPE=\"text\" NAME=\"Rec\" VALUE=\"$_[1]\" SIZE=12 MAXLENGTH=32 class=\"biggerpright\">\n";
 print "<INPUT TYPE=\"hidden\" NAME=\"Action\" VALUE=\"Search\">\n";
 print "<INPUT TYPE=\"hidden\" NAME=\"Name\" VALUE=\"$_[0]\">\n";
 print "<INPUT TYPE=\"hidden\" NAME=\"From\" VALUE=\"0\">\n";
 print "<INPUT TYPE=\"hidden\" NAME=\"For\" VALUE=\"$AP_for\">\n";
 print "<INPUT TYPE=\"submit\" VALUE=\"$msgtxt[$msgSearch]\">\n";
 print "</FORM>\n";
 print "</td></tr></table>\n";
 print "<HR>\n";
 print "</center>\n";
}

sub build_categorylist
{
  open(GENRES,"<$categoryfile") || &Oops("CategoryList");
  @lines = <GENRES>;
  close(GENRES);
  
  print "<select name=\"Rec\">";
  print "<option value=\"\">$msgtxt[$msgChoose]</option>";

  foreach $line (@lines) {
    $delim1 = index($line,"\t"); # end of category name
   	$category = substr($line,0,$delim1);	# get category name
    $delim2 = index($line,"\n", $delim1+1); # end of category value
   	$catvalue = substr($line,$delim1+1,$delim2-$delim1-1);	# get category name
    print "<option value=\"$catvalue\">$category</option>";
  }

  print "</select>";
}


# ---------- Pagebuilding component Subroutines --------------------------------

sub MM_status
{print "<script language=\"JavaScript\">\n";
 print "<!--\n";
 print "function MM_displayStatusMsg(msgStr) { //v1.2\n";
 print "  status=msgStr;\n";
 print "  document.MM_returnValue = true;\n";
 print "}\n";
 print "function AP_MAddress() { //v1.0\n";
 print "  wibble='maghreb';\n";
 print "  wibble=(wibble + '&#064;');\n";
 print "  wibble=(wibble + 'maghrebreview.com');\n";
 print "  wobble='a href=\"mail';\n";
 print "  document.write('<' + wobble + 'to:' + wibble + '\" class=\"embeddedlink\">' + wibble + '</a>');\n";
 print "}\n";
 print "//-->\n";
 print "</script>\n";
}

sub show_redirect
{print "<META HTTP-EQUIV=REFRESH CONTENT=\"15; URL=$FrameURL\">\n";
 print "<link rel=\"stylesheet\" href=\"$CSSURL\">\n";
 print "</head>\n";
 print "<body bgcolor=\"#FFFFFF\">\n";
 $BodyShown=1;      # flag that we've shown off our body
 &show_tabletop;
}

sub next_buttons
{print "<p class=\"smallcentre\">\n";
 $remaining=$_[3];
 $prev=$_[1]-$_[3]-1;
 if ($_[0]<$_[2]) {$_[2]=$_[0];}
 if (($_[2]+$_[3])>$_[0]) {$remaining=$_[0]-$_[2];}
 if ($_[0]>0) {print "$msgtxt[$msgToOfpre] $_[1] $msgtxt[$msgTo] $_[2] $msgtxt[$msgOf] ";}
 print "$_[0] $msgtxt[$msgFound]</p>\n";
 print "<TABLE align=\"center\"><TR><TD WIDTH=\"100\"> \n";
 if ($_[1]>1) {
  print "<FORM ACTION=\"$CgiURL\" METHOD=POST>\n";
  print "<INPUT TYPE=\"hidden\" NAME=\"Action\" VALUE=\"$_[6]\">\n";
  print "<INPUT TYPE=\"hidden\" NAME=\"Rec\" VALUE=\"$_[4]\">\n";
  print "<INPUT TYPE=\"hidden\" NAME=\"From\" VALUE=\"$prev\">\n";
  print "<INPUT TYPE=\"hidden\" NAME=\"For\" VALUE=\"$_[3]\">\n";
  print "<INPUT TYPE=\"hidden\" NAME=\"Name\" VALUE=\"$_[5]\">\n";
  print "<INPUT TYPE=\"submit\" VALUE=\"$msgtxt[$msgPrev] $_[3] $msgtxt[$msgPrevpost] ...\">\n";
  print "</FORM>\n";
 }
 print "</TD><TD WIDTH=\"100\"> \n";
 if ($_[2]<$_[0]) {
  print "<FORM ACTION=\"$CgiURL\" METHOD=POST>\n";
  print "<INPUT TYPE=\"hidden\" NAME=\"Action\" VALUE=\"$_[6]\">\n";
  print "<INPUT TYPE=\"hidden\" NAME=\"Rec\" VALUE=\"$_[4]\">\n";
  print "<INPUT TYPE=\"hidden\" NAME=\"From\" VALUE=\"$_[2]\">\n";
  print "<INPUT TYPE=\"hidden\" NAME=\"For\" VALUE=\"$_[3]\">\n";
  print "<INPUT TYPE=\"hidden\" NAME=\"Name\" VALUE=\"$_[5]\">\n";
  print "<INPUT TYPE=\"submit\" VALUE=\"$msgtxt[$msgNext] $remaining $msgtxt[$msgNextpost] ...\">\n";
  print "</FORM>\n";
 }
 print "</TD></TR></TABLE>\n";
}

sub show_entry
{&page_heading($pagetitle);
 print "<br><table><tr><td width=\"50%\" align=\"left\">\n";
 &page_subheading($_[2]);  
 &page_subheading("$msgtxt[$msgAuthor]: $_[1]");
 &page_subheading("$msgtxt[$msgYear]: $_[3]");
 &page_subheading("$msgtxt[$msgPages]: $_[4]");
 &page_subheading("$msgtxt[$msgDescr]: $_[5]");
 &page_subheading("$msgtxt[$msgPrice]: ".$accents{""}."$_[6]");
 #&page_subheading("$msgtxt[$msgCat]: $_[7]");
 #&order_button($_[2],$_[0],$_[6]);
 &paypal_button($_[2],$_[0],$_[6],$_[1]);
 &back_button;
 print "</td><td width=\"50%\" align=\"center\">\n";
 print "$DBLogoc\n";
 &show_blurb;
 &basket_button; 
 print "</td></tr></table>\n";
}

sub show_blurb_table
{print "<br><table align=\"center\"><tr align=\"center\"><td width=\"50%\">\n";
 print "$DBLogoc\n";
 &basket_button; 
 print "</td><td width=\"50%\">\n";
 &show_blurb;
 print "</td></tr></table>\n";
}


sub show_blurb
{if (-e $blurbfile) # file exists, otherwise don't bother
 {
  open(BLURB,"<$blurbfile") || &Oops("Disclaimer");
  @lines = <BLURB>;
  close(BLURB);
  
  foreach $line (@lines) {
  print $line;
  }
 }
}

sub show_footer
{if (-e $footerfile) # file exists, otherwise don't bother
 {
  open(FOOTER,"<$footerfile") || &Oops("Footer");
  @lines = <FOOTER>;
  close(FOOTER);
  
  foreach $line (@lines) {
  print $line;
  }
 }
}


sub show_info
{print "<center><TABLE border=\"1\">\n";
 print "<TR><TD bgcolor=\"#c0c0c0\">Parameter</TD><TD bgcolor=\"#c0c0c0\">Value</TD></TR>\n";

 print  "<TR><TD>Now</TD><TD> $_[0]</TD></TR>\n";
 print  "<TR><TD>Version</TD><TD> $AP_version</TD></TR>\n";
 print  "<TR><TD>Serial no</TD><TD> $serial_no</TD></TR>\n";
 print  "<TR><TD>Customer</TD><TD> $customer</TD></TR>\n";
 print  "<TR><TD>Checkhash</TD><TD> <font color=\"blue\">$_[1]$stored</font></TD></TR>\n";
 
 $valtarget = $serial_no.$customer.$ENV{'SERVER_NAME'};
 $valtoken="";
 $valcount=0;
 do {
 $valtoken = $valtoken ^ substr($valtarget,$valcount,8);
 $valcount+=8;
 } until $valcount > length($valtarget);
 $valhash = crypt($valtoken,$_[1]);
 print  "<TR><TD>Calculate</TD><TD> <font color=\"red\">$valhash</font></TD></TR>\n";
 if ($adminhash)
    {print  "<TR><TD>Administration</TD><TD> <font color=\"blue\">$_[1]$adminhash</font></TD></TR>\n";
     $valhash=crypt($getHash,$_[1]);
     print  "<TR><TD>Calculate</TD><TD> <font color=\"red\">$valhash</font></TD></TR>\n";
    }

 print  "<TR><TD>Filing</TD><TD> $FileDir</TD></TR>\n";

 print  "<TR><TD>Config</TD><TD> $cfgfile</TD></TR>\n";
 print  "<TR><TD>Register</TD><TD> $regfile</TD></TR>\n";
 print  "<TR><TD>Logging</TD><TD> $loggingfile</TD></TR>\n";
 print  "<TR><TD>Database</TD><TD> $datafile</TD></TR>\n";
 print  "<TR><TD>Blurb</TD><TD> $blurbfile</TD></TR>\n";
 print  "<TR><TD>Footer</TD><TD> $footerfile</TD></TR>\n";
 print  "<TR><TD>Categorys</TD><TD> $categoryfile</TD></TR>\n";
 
 print  "<TR><TD>Our Logo</TD><TD> $APlogo</TD></TR>\n";
 print  "<TR><TD>Script</TD><TD> $CgiURL</TD></TR>\n";
 print  "<TR><TD>Frame</TD><TD> $FrameURL</TD></TR>\n";
 print  "<TR><TD>Orders</TD><TD> $OrdersURL</TD></TR>\n";
 print  "<TR><TD>Styles</TD><TD> $CSSURL</TD></TR>\n";
 print  "<TR><TD>Logo</TD><TD> $DBLogo</TD></TR>\n";
 print  "<TR><TD>Pagetitle</TD><TD> $pagetitle</TD></TR>\n";
 print  "<TR><TD>Notify email</TD><TD> $notify_mail</TD></TR>\n";
 print  "<TR><TD>Anonymous flag</TD><TD> $allow_anonymous</TD></TR>\n";
 print  "<TR><TD>Language</TD><TD> $use_language</TD></TR>\n";
 
 
 
 foreach $ekey (sort keys %ENV) {
    print "<TR><TD>$ekey</TD><TD>$ENV{$ekey}</TD></TR>\n";}
 print  "</TABLE></center>\n";
}

sub back_button
{$backButt = $CgiURL . "?" . $FORM{'Return'};
 print "<p>$msgtxt[$msgClick] <a href=\"$backButt\" class=\"embeddedlink\">$msgtxt[$msgHere]</a> $msgtxt[$msgResults]</p>\n";
}

sub order_button
{print "<FORM ACTION=\"$OrdersURL\" METHOD=GET>\n";
 print "<INPUT TYPE=\"hidden\" NAME=\"Title\" VALUE=\"$_[0]\">\n";
 print "<INPUT TYPE=\"hidden\" NAME=\"CatNo\" VALUE=\"$_[1]\">\n";
 print "<INPUT TYPE=\"hidden\" NAME=\"Price\" VALUE=\"$_[2]\">\n";
 print "<INPUT TYPE=\"hidden\" NAME=\"_Language\" VALUE=\"$use_language\">\n";
 print "<INPUT TYPE=\"submit\" VALUE=\"$msgtxt[$msgOrder]\">\n";
 print "</FORM>\n";
}

sub paypal_button
{print "<form target=\"paypal\" action=\"https://www.paypal.com/cgi-bin/webscr\" method=\"post\">\n";
 print "<input type=\"submit\" name=\"submit\" value=\"$msgtxt[$msgAddBask]\" alt=\"Make payments with PayPal - it's fast, free and secure!\">\n";
 print "<img alt=\"\" border=\"0\" src=\"https://www.paypal.com/en_GB/i/scr/pixel.gif\" width=\"1\" height=\"1\">\n";
 print "<input type=\"hidden\" name=\"add\" value=\"1\">\n";
 print "<input type=\"hidden\" name=\"cmd\" value=\"_cart\">\n";
 print "<input type=\"hidden\" name=\"business\" value=\"maghreb\@maghrebreview.com\">\n";
 print "<input type=\"hidden\" name=\"item_name\" value=\"$_[0] by $_[3]\">\n";
 print "<input type=\"hidden\" name=\"item_number\" value=\": $_[1]\">\n";
 print "<input type=\"hidden\" name=\"amount\" value=\"$_[2]\">\n";
 print "<input type=\"hidden\" name=\"no_shipping\" value=\"2\">\n";
 print "<input type=\"hidden\" name=\"handling_cart\" value=\"$postfirst\">\n";
 print "<input type=\"hidden\" name=\"shipping\" value=\"$postrest\">\n";
 print "<input type=\"hidden\" name=\"shipping2\" value=\"$postrest\">\n";
 print "<input type=\"hidden\" name=\"invoice\" value=\"$now_string\">\n";
 print "<input type=\"hidden\" name=\"return\" value=\"$ThanksURL\">\n";
 print "<input type=\"hidden\" name=\"currency_code\" value=\"GBP\">\n";

if ($use_language eq 'fr') {$paypal_lc = "FR"} else {$paypal_lc = "GB"}
 print "<input type=\"hidden\" name=\"lc\" value=\"$paypal_lc\">\n";
 
 print "<input type=\"hidden\" name=\"bn\" value=\"PP-ShopCartBF\">\n";
 print "</form>\n";
}

sub basket_button
{print "<form target=\"paypal\" action=\"https://www.paypal.com/cgi-bin/webscr\" method=\"post\">\n";
 print "<input type=\"hidden\" name=\"cmd\" value=\"_cart\">\n";
 print "<input type=\"hidden\" name=\"business\" value=\"maghreb\@maghrebreview.com\">\n";
 print "<input type=\"submit\" name=\"submit\" value=\"$msgtxt[$msgViewBask]\" alt=\"Make payments with PayPal - it's fast, free and secure!\">\n";
 print "<input type=\"hidden\" name=\"display\" value=\"1\">\n";
 print "</form>\n";
}
# ---------- Database file Subroutines --------------------------------

sub list_records
{print "<p class=\"smallcentre\">$msgtxt[$msgSearch4] \"$_[0]\" $msgtxt[$msgResult]: </p>\n";
 print "<TABLE align=\"center\" border=\"1\">\n";
 print "<TR><TH>$msgtxt[$msgCatno]</TH><TH>$msgtxt[$msgAuthor]</TH><TH>$msgtxt[$msgTitle]</TH><TH>$msgtxt[$msgYear]</TH><TH>&nbsp;</TH></TR>\n";
 $getRecU = $_[0];
 $getRecU =~ tr/a-z/A-Z/;
 if (-e $datafile) # file exists, otherwise don't bother
 {
  open(BOOKLIST,"<$datafile") || &Oops("Database");
  @lines = <BOOKLIST>;
  close(BOOKLIST);

  foreach $line (@lines) {
   if (index($line,"#")==-1)     # ignore comment lines
   {
     $delim1 = index($line,"\t");            # end of catno
     $delim2 = index($line,"\t", $delim1+1); # end of author
     $delim3 = index($line,"\t", $delim2+1); # end of title
     $delim4 = index($line,"\t", $delim3+1); # end of year
     $delim5 = index($line,"\t", $delim4+1); # end of pagecount
     $delim6 = index($line,"\t", $delim5+1); # end of comments
     $delim7 = index($line,"\t", $delim6+1); # end of price
     $delim8 = index($line,"\n", $delim7+1); # end of category
     $dbcatno   = substr($line,0,$delim1);	                 # get catno
     $dbauthor  = substr($line,$delim1+1,$delim2-$delim1-1); # get author
     $dbtitle   = substr($line,$delim2+1,$delim3-$delim2-1); # get title
     $dbyear    = substr($line,$delim3+1,$delim4-$delim3-1); # get year
     $dbpages   = substr($line,$delim4+1,$delim5-$delim4-1); # get pagecount
     $dbcomment = substr($line,$delim5+1,$delim6-$delim5-1); # get comemnts
     $dbprice   = substr($line,$delim6+1,$delim7-$delim6-1); # get price
     $dbcategory   = substr($line,$delim7+1,$delim8-$delim7-1); # get category
     $dbauthor =~ tr/a-z/A-Z/;
   	if (index($dbauthor,$getRecU)==0)  # name starts with list search character
   	{++$_[1];
   		if (($_[1]>=$_[2])&&($_[1]<=($_[3])))
   		{
         &list_entry($dbcatno,$line,$_[0],$_[2],$_[3],"List");
  	 	}
  	 } 
   }	
  }
 }
 print "</TABLE>\n";
}

sub search_records
{print "<p class=\"smallcentre\">$msgtxt[$msgSearch4] \"$_[0]\" $msgtxt[$msgResult]: </p>\n";
 print "<TABLE align=\"center\" border=\"1\">\n";
 print "<TR><TH>$msgtxt[$msgCatno]</TH><TH>$msgtxt[$msgAuthor]</TH><TH>$msgtxt[$msgTitle]</TH><TH>$msgtxt[$msgYear]</TH><TH>&nbsp;</TH></TR>\n";
 $getRecU = $_[0];
 $getRecU = &handle_accents($getRecU);
 $getRecU =~ tr/a-z/A-Z/;
 if (-e $datafile) # file exists, otherwise don't bother
 {
  open(BOOKLIST,"<$datafile") || &Oops("Database");
  @lines = <BOOKLIST>;
  close(BOOKLIST);

  foreach $line (@lines) {
   if (index($line,"#")==-1)     # ignore comment lines
   {
     $delim1 = index($line,"\t");            # end of catno
     $delim2 = index($line,"\t", $delim1+1); # end of author
     $delim3 = index($line,"\t", $delim2+1); # end of title
     $delim4 = index($line,"\t", $delim3+1); # end of year
     $delim5 = index($line,"\t", $delim4+1); # end of pagecount
     $delim6 = index($line,"\t", $delim5+1); # end of comments
     $delim7 = index($line,"\t", $delim6+1); # end of price
     $delim8 = index($line,"\n", $delim7+1); # end of category
     $dbcatno   = substr($line,0,$delim1);	                 # get catno
     $dbauthor  = substr($line,$delim1+1,$delim2-$delim1-1); # get author
     $dbtitle   = substr($line,$delim2+1,$delim3-$delim2-1); # get title
     $dbyear    = substr($line,$delim3+1,$delim4-$delim3-1); # get year
     $dbpages   = substr($line,$delim4+1,$delim5-$delim4-1); # get pagecount
     $dbcomment = substr($line,$delim5+1,$delim6-$delim5-1); # get comemnts
     $dbprice   = substr($line,$delim6+1,$delim7-$delim6-1); # get price
     $dbcategory   = substr($line,$delim7+1,$delim8-$delim7-1); # get category
     $dbtitle =~ tr/a-z/A-Z/;
   	if (index($dbtitle,$getRecU)!=-1)  # title contains search string
   	{++$_[1];
   		if (($_[1]>=$_[2])&&($_[1]<=($_[3])))
   		{
         &list_entry($dbcatno,$line,$_[0],$_[2],$_[3],"Search");
  	 	}
  	 } 
   }	
  }
 }
 print "</TABLE>\n";
}

sub list_category
{print "<p class=\"smallcentre\">$msgtxt[$msgSearch4] \"$_[0]\" $msgtxt[$msgResult]: </p>\n";
 print "<TABLE align=\"center\" border=\"1\">\n";
 print "<TR><TH>$msgtxt[$msgCatno]</TH><TH>$msgtxt[$msgAuthor]</TH><TH>$msgtxt[$msgTitle]</TH><TH>$msgtxt[$msgYear]</TH><TH>&nbsp;</TH></TR>\n";
 $getRecU = $_[0];
 $getRecU =~ tr/a-z/A-Z/;
 if (-e $datafile) # file exists, otherwise don't bother
 {
  open(BOOKLIST,"<$datafile") || &Oops("Database");
  @lines = <BOOKLIST>;
  close(BOOKLIST);

  foreach $line (@lines) {
   if (index($line,"#")==-1)     # ignore comment lines
   {
     $delim1 = index($line,"\t");            # end of catno
     $delim2 = index($line,"\t", $delim1+1); # end of author
     $delim3 = index($line,"\t", $delim2+1); # end of title
     $delim4 = index($line,"\t", $delim3+1); # end of year
     $delim5 = index($line,"\t", $delim4+1); # end of pagecount
     $delim6 = index($line,"\t", $delim5+1); # end of comments
     $delim7 = index($line,"\t", $delim6+1); # end of price
     $delim8 = index($line,"\n", $delim7+1); # end of category
     $dbcatno   = substr($line,0,$delim1);	                 # get catno
     $dbauthor  = substr($line,$delim1+1,$delim2-$delim1-1); # get author
     $dbtitle   = substr($line,$delim2+1,$delim3-$delim2-1); # get title
     $dbyear    = substr($line,$delim3+1,$delim4-$delim3-1); # get year
     $dbpages   = substr($line,$delim4+1,$delim5-$delim4-1); # get pagecount
     $dbcomment = substr($line,$delim5+1,$delim6-$delim5-1); # get comemnts
     $dbprice   = substr($line,$delim6+1,$delim7-$delim6-1); # get price
     $dbcategory   = substr($line,$delim7+1,$delim8-$delim7-1); # get category
     $dbcategory =~ tr/a-z/A-Z/;
   	if (index($dbcategory,$getRecU)!=-1)  # category contains search string
   	{++$_[1];
   		if (($_[1]>=$_[2])&&($_[1]<=($_[3])))
   		{
         &list_entry($dbcatno,$line,$_[0],$_[2],$_[3],"Category");
  	 	}
  	 } 
   }	
  }
 }
 print "</TABLE>\n";
}

sub list_entry
{$oldFrom = $_[3]-1;
 $oldFor = $_[4]-$oldFrom;
 $returnParam = "Rec=$_[2]&Action=$_[5]&From=$oldFrom&For=$oldFor";
 $delim1 = index($_[1],"\t"); # end of catno
 $delim2 = index($_[1],"\t", $delim1+1); # end of author
 $delim3 = index($_[1],"\t", $delim2+1); # end of title
 $delim4 = index($_[1],"\t", $delim3+1); # end of year
 $author = substr($_[1],$delim1+1,$delim2-$delim1-1);	# get author
 $title = substr($_[1],$delim2+1,$delim3-$delim2-1);	# get title
 $year = substr($_[1],$delim3+1,$delim4-$delim3-1); # get year
 print "<tr><td><p class=\"results\">$_[0]</p></td><td><p class=\"results\"><B>$author</B></p></td><td><p class=\"results\">$title</p></td><td><p class=\"results\"><B>$year</B></p></td><td>";
 print "<FORM NAME=\"detailForm\" ACTION=\"$CgiURL\" METHOD=POST>\n";
 print "<INPUT TYPE=\"hidden\" NAME=\"Rec\" VALUE=\"$_[0]\">\n";
 print "<INPUT TYPE=\"hidden\" NAME=\"Action\" VALUE=\"Detail\">\n";
 print "<INPUT TYPE=\"hidden\" NAME=\"From\" VALUE=\"0\">\n";
 print "<INPUT TYPE=\"hidden\" NAME=\"For\" VALUE=\"$AP_for\">\n";
 print "<INPUT TYPE=\"hidden\" NAME=\"Return\" VALUE=\"$returnParam\">\n";
 print "<INPUT TYPE=\"submit\" VALUE=\"$msgtxt[$msgGet]\">\n";
 print "</FORM>\n";
 print "</td></tr>\n";
}

sub display_detail
{$failed=1;
 $getRecU = $_[0];
 $getRecU =~ tr/a-z/A-Z/;
 if (-e $datafile) # file exists, otherwise don't bother
 {
  open(BOOKLIST,"<$datafile") || &Oops("Database");
  @lines = <BOOKLIST>;
  close(BOOKLIST);

		foreach $line (@lines) {
   if (index($line,"#")==-1)     # ignore comment lines
   {
    $delim1 = index($line,"\t"); # end of catno
   	$dbcatno = substr($line,0,$delim1);	# get catno
    $dbcatno =~ tr/a-z/A-Z/;
   	if ($dbcatno eq $getRecU)  # catno equals search string
   	{
     $delim2 = index($line,"\t", $delim1+1); # end of author
     $delim3 = index($line,"\t", $delim2+1); # end of title
     $delim4 = index($line,"\t", $delim3+1); # end of year
     $delim5 = index($line,"\t", $delim4+1); # end of pagecount
     $delim6 = index($line,"\t", $delim5+1); # end of comments
     $delim7 = index($line,"\t", $delim6+1); # end of price
     $delim8 = index($line,"\n", $delim7+1); # end of category
     $dbauthor  = substr($line,$delim1+1,$delim2-$delim1-1); # get author
     $dbtitle   = substr($line,$delim2+1,$delim3-$delim2-1); # get title
     $dbyear    = substr($line,$delim3+1,$delim4-$delim3-1); # get year
     $dbpages   = substr($line,$delim4+1,$delim5-$delim4-1); # get pagecount
     $dbcomment = substr($line,$delim5+1,$delim6-$delim5-1); # get comemnts
     $dbprice   = substr($line,$delim6+1,$delim7-$delim6-1); # get price
     $dbcategory   = substr($line,$delim7+1,$delim8-$delim7-1); # get category
     $dbcurrency = index($dbprice,";");
     $dbrawprice = substr($dbprice,$dbcurrency+1);
     &show_entry($dbcatno,$dbauthor,$dbtitle,$dbyear,$dbpages,$dbcomment,$dbrawprice,$dbcategory);
     $failed=0;
  	 } 
   }	
  }
 }
}



1;
