#!/usr/bin/perl
# design:
# Man skall kunna söka (fritext/fält) och få upp en lista med resultat
# Man skall kunna klicka på ett av listelementen och 
# få ett resultat i form av en mall (listnamn.out).
# <html><head><title>$1</title></head>
# 
#  In: DO LISTNAME NR SEARCH COLUMN TPLT
#

require "config.dat";
$mviewurl = "mview.cgi";
use lib '.';
require "cgi-lib.pl";


print "Content-type: text/html\n\n";
&ReadParse();
($listname=$in{LISTNAME}) =~ s/(.*):(.*)/$2/;

if ($in{'NR'}) { &browse }
elsif ($in{'EXTRACT'} || $in{'STR'}) { &listmatch }
else { &searchpage }


sub searchpage {
    open(DATA,"$rootdir/lib/" . $in{'LISTNAME'} . ".preform")  || &printbegin("Search $listname");
    while(<DATA>) {print}
    close(DATA);

    print "<form action=$mviewurl method=get>\n";
    print &formenv;
    open(DATA,"$rootdir/lib/" . $in{'LISTNAME'} . ".form") 
	|| print "<input type=text name=regnr1><input type=submit value='Tryck för att Söka!'><input type=reset value='Återställ'><input type=hidden name=EXTRACT value=2>\n";
    while(<DATA>) {print}
    close(DATA);
    print "</form>\n";
    &printend;
}

sub listmatch {
    &readdatabase(1);
    &printbegin("Searchresult");
    $url = "$mviewurl?" . &urlenv();
    $url =~ s/&STR=[^&]*//; 
    print "<a href=$url><img src=\"$picsdir/btar_up.gif\" alt=\"/UP\\\" border=0></a><br>"; 
    if (not $in{'STR'}) {
	$regstr="1";
	foreach $i (0..$in{'EXTRACT'}-1) {
	    $n="regnr$i";
	    $in{$n} =~ s/([\+\?\.\*\(\)\[\]\{\}\\])/\\$1/g;
	    $in{$n} =~ s/["']//g;
            foreach (split(/ /,$in{$n})) {
		$regstr = "($regstr && (\$_ =~ /\\b$_/i))" }
	}
	$in{'STR'} = $regstr;
    }
    @words = ($in{'STR'} =~  m?\$_ =~ /\\b([^/]*)/?g);
#    print "Sökning på - <b>";
 #   grep(s/(\w*)\|(\w*)/$1 ELLER $2/g,@words);
  #  foreach (@words) { $out .= "$_ OCH "; }
   # $out =~ s/OCH $//;
   #OA print "$out</b>- gav följande resultat:<br>\n";
    printsearchlog(@words);
    &extract;
    &sort;
    &printcompact;
    &printend();
}

sub printcompact {
    print "<ol>\n";
    foreach (@data) {
	@dat=split(/;/,$_);
        print "<li><a href=$mviewurl?NR=$dat[0]&" . &urlenv . ">$dat[2]</a>\n";
    }
    print "</ol>\n";
    print "Please, try again. No Match.\n" unless (@data);
}


sub extract {
    local(@match);
    foreach (@data) {
	if (eval($in{'STR'}) && (! m/^[^;]*;;/)) { push(@match,$_) }
    }  
    @data = @match;
}

sub sort {
    local(@sortarr);local(@sorted);

    foreach (@data) {
	@dat=split(/;/,$_);
        push(@sortarr,"$dat[2]###$_");
    }
    @data = sort @sortarr;
    foreach(@data) {
	($key,$data)=split(/###/,$_);
        push(@sorted,$data);
    }
    @data=@sorted;
}

sub browse {
    &readdatabase(1);
    &extract;
    &sort();
    
    foreach $i (0..$#data)
    {
	if ($data[$i] =~ /^$in{'NR'};/) { $hit=$i; $jepp++;}
    }
    $next=$data[($hit+1) % ($#data+1)] if (@data);
    $pre =$data[($hit+$#data) % ($#data+1)] if (@data);
    printtemplate($data[$hit],$pre,$next);   
}


#################
# MODULE: printtemplate
#################
# DESCRIPTION: Prints the specified string inside a template
# IN: The string,the previous hit, the next hit
# OUT:
# BUGS:
#################
sub printtemplate
{
  open(DATA,"$rootdir/lib/" . $in{'LISTNAME'} . $in{'TPLT'} . ".out") 
    || print "No!\n";
  @dat = split(/;/,$_[0]);
  @pre = split(/;/,$_[1]);
  $preurl="<a href=\"$mviewurl?NR=$pre[0]&" . &urlenv() . "\"><img src=\"$picsdir/btar_lft.gif\" border=0 alt=\"Previous\" align=\"middle\"></a>";
  @next = split(/;/,$_[2]);
  $nexturl="<a href=\"$mviewurl?NR=$next[0]&" . &urlenv() . "\"><img src=\"$picsdir/btar_rgt.gif\" border=0 alt=\"Next\" align=\"middle\"></a>";
  $upurl = "<a href=\"$mviewurl?" . &urlenv() . "\"><img src=\"$picsdir/btar_up.gif\" border=0 alt=\"/UPP\\\"></a>";
  $out = "";
  while(<DATA>) {
      if (/^%(.*)/) {
	  $subrules{"\$out =~ $1"}++ } 
      else {
	  if(/\$(\d+)/) {
	      $no=$1;
	      if ($dat[$no]) {
		  s/#(.*)\$$no(.*)#|\$$no/$1$dat[$no]$2/; 
	      }
	      else {
		  s/#.*#|\$$no//; 
	      }
	  }
	  $out .= $_; 
      }
  }
  close(DATA);
  $out =~ s/\$pre/$preurl/goi;
  $out =~ s/\$next/$nexturl/goi;
  $out =~ s/\$up/$upurl/goi;
      


  foreach (%subrules) {
      eval($_);
  }
  print $out;
}
      
#################
# MODULE: readdatabase
#################
# DESCRIPTION: Read the file that contins the data.
# IN: 1 - read data too 0 - read only head
# OUT: $head, $title, $headers, @data
# BUGS:
#################
sub readdatabase 
{
  @data=();
  @orderdef = ();
  @sortby = ();
  @compactdef = ();
  @firstsearch = ();
  @fieldsearch = ();
  open(DATA,"$rootdir/lib/" . $in{'LISTNAME'} . ".csv") || print "noooo\n";

  while (<DATA>) {
    chop;
    if (/^#(.*)/) { # Modechange
          if ($1 eq "TITLE") { $inputmode = $1; }
       elsif ($1 eq "FIRSTSEARCH") { $inputmode= $1; }
       elsif ($1 eq "FIELDSEARCH") { $inputmode= $1; }
       elsif ($1 eq "SHORTCUTS") { $inputmode= $1; }
       elsif ($1 eq "COMPACTLIST") { $inputmode= $1; }
       elsif ($1 eq "HEADDEF") { $inputmode= $1; }
       elsif ($1 eq "SORTBY") { $inputmode= $1; }
       elsif ($1 eq "INFO") { $inputmode= $1; }
       elsif ($1 eq "ADMIN") { $inputmode= $1; }
       elsif ($1 eq "ADMINEMAIL") { $inputmode= $1; }
       elsif ($1 eq "HEADNAME") { $inputmode= $1; }
       elsif ($1 eq "NODELETE") { $nodelete=1; }
       elsif ($1 eq "ORDER") { $inputmode= $1; }
       elsif ($1 eq "DATA") { $inputmode= $1; }
       else { die "Error in datafile...$in{'LISTNAME'}"; }
    }
    else {
      if ($inputmode eq "DATA" && $_[0] eq 0) { last} # terminate...
      push(@data,$_) if ($inputmode eq "DATA");
      $title = $_ if ($inputmode eq "TITLE");
      $admin = $_ if ($inputmode eq "ADMIN");
      $adminemail = $_ if ($inputmode eq "ADMINEMAIL");
      $headers = $_ if ($inputmode eq "HEADNAME");
      $headdef = $_ if ($inputmode eq "HEADDEF");
      if ($inputmode eq "SHORTCUTS") {
        ($reg,$label) = split(/\+\+\+/,$_);
        $shortcuts{$label} = $reg; }
      push(@sortby,$_) if ($inputmode eq "SORTBY");
      push(@compactdef,$_) if ($inputmode eq "COMPACTLIST");
      push(@orderdef,$_) if ($inputmode eq "ORDER");
      push(@firstsearch,$_) if ($inputmode eq "FIRSTSEARCH");
      push(@fieldsearch,$_) if ($inputmode eq "FIELDSEARCH");
      push(@infolines,$_) if ($inputmode eq "INFO");

    }
  }
 
  @headlist = split(/;/,$headers);
  @headtypelist = split(/;/,$headdef);
  close(DATA);

  &read_personal_env($in{'LISTNAME'}) if ($_[1]);

}
### readdatabase


#################
# MODULE: urlenv
#################
# DESCRIPTION: To inherit the Environment variables through an url.
# IN: 
# OUT: A string ready to put in an url
# BUGS:
#################
sub urlenv {
    $url="LISTNAME=" . &urlclean($in{'LISTNAME'});
    $url = $url . "&STR=" . &urlclean($in{'STR'});
    $url = $url . "&TPLT=" . &urlclean($in{'TPLT'});

}
### urlenv

#################
# MODULE: formenv
#################
# DESCRIPTION: To inherit the Environment variables through 
#              hidden variables i a form.
# IN: 
# OUT: A string ready to put in a form
# BUGS:
#################
sub formenv {
  return
     "<input type=\"hidden\" " .
     "name=LISTNAME  value=\"$in{'LISTNAME'}\">\n"; 
}
### formenv

#################
# MODULE: urlclean
#################
# DESCRIPTION: return a proper url-verision of the string
# IN: string
# OUT: string
# BUGS:
#################
sub urlclean {
  local($tmp) = $_[0];
  $tmp =~ s/(\W)/sprintf("%%%02x",unpack("C",$1))/ge;
  $tmp =~ s/%20/\+/g;
  return $tmp;
}
### urlclean


sub printbegin {
    print "<html><head><title>c-pageguide - $_[0]</title></head>\n";
    print "<body bgcolor=white text=black>\n";
    print "<h1>$_[0]</h1>\n";
}


sub printend {
    print "</body></html>\n";
}


sub printsearchlog {
    ($sec,$min,$hou,$day,$mon,$ye)= localtime(time);
    open(DATA,">>$rootdir/lib/" . $in{'LISTNAME'} . ".log") || print "no log\n";
    print DATA "@_ <-> $ENV{'REMOTE_HOST'} [$day/",$mon+1,"-$ye]\n";
    close(DATA);
}
