#!/usr/bin/perl -w

# schnueffel.pl v1.07 by ML 02.06.2013
# copyright © Manfred Lechner, m.lechner@hobby-sommer.com
# Feldreihenfolge der Artikel-Textdatei:
# 0=inet,1=hst,2=grp,3=spur,4=anr,5=PL,6=bez,7=lim,8=hspreis_in_cent,
# 9=lager,10=lieStat,11=sort,12=lieSeit,13=info
# care for utf8: use utf8; script ist utf-8 encoded, &param; subroutine needs decoding
# form fields set to accept utf-8 only, data are utf-8 (to be read-in with decoding)

use CGI::Carp qw( fatalsToBrowser );

use utf8;  # weil im script utf-8 chars hard encoded sind
use Encode qw(encode decode); $enc = 'utf-8'; # (needed to read-in and put-out)

&param_in;   # enthält hier hier auch decode utf-8 !

$in{'base'} = "art000819.txt";        # Übergabe Artikelstamm

# --- session ---------------
length($in{'sid'})==17 or $in{'sid'} = "0000000000000inde";    # sid, preis, sprache
$sid13 = substr($in{'sid'},0,13);     # session-ID
if ($sid13 eq "0000000000000") {                   # wenn Erstaufruf, make_session-ID
 # check if a cookie hs been set; if yes, take it
 $found_cookie="";
 $found_cookie = $ENV{'HTTP_COOKIE'};
 if ($found_cookie gt "") {
  @cookies = split /;/, $found_cookie; # $ENV{'HTTP_COOKIE'} zB "start=Zeit; sid=seprHP2aawvjs"
  foreach $cookie (@cookies) {
   $cookie =~ s/ //; # kommen je nach Reihenfolge mit Leerzeichen in front
   if ($cookie =~ /^sid/) { $keks=substr($cookie,4,13); }
   $sid13=$keks; 
  }
 } else { # no cookie yet
   $sidbase=substr(time(),6,5).$ENV{'REMOTE_ADDR'};
   $sid13 = crypt($sidbase,"sessionID");   # Beispiel session-ID: SH9QOipb8exGIdein
   $expire=gmtime(time()+60*60)." GMT";  # (60 minutes)
   $cookie = "sid=$sid13; path=/; expires=$expire"; # sid=sepjtDgwetimk; path=/; expires=Sat Aug 16 15:55:13 2008 GMT
   print "Set-Cookie: " . $cookie . "\n"; # geht nur, weil vor dem html header !!!
 }
$in{'sid'}=$sid13.substr($in{'sid'},13,4);         # nachkorrigieren für $curr_url
}

print "Cache-Control: no-cache\nPragma: no-cache\n";

$in{'anf'} or $in{'anf'} = "0";       # AnzeigeBeginn mit x-tem zutreffenden Datensatz
$in{'max'} or $in{'max'} = "26";      # AnzeigeEnde bei x-tem zutreffenden Datensatz
 if ($in{'max'}<0) {$in{'max'}=0};    # zur Anzeige einzelner ArtNr
$in{'pr'} = substr($in{'sid'},13,2);  # oder 'ex' oder 'dm' - Preisangaben
$in{'pr'} or $in{'pr'} = "in";        # besser EU-intern als nix
$in{'hst'} or $in{'hst'} = "";        # definieren, falls noch nicht
$in{'spur'} or $in{'spur'} = "";      # generell... wenn leer, werden alle Sätze gefunden
$in{'sose'} or $in{'sose'} = "";
$in{'grp'} or $in{'grp'} = "";        # Waren-Gruppe
$in{'nh'} or $in{'nh'} = "";          # Neuheit, Auslaufmodell
$in{'lie'} or $in{'lie'} = "";        # Lieferstatus (OMG, NPR, FM-Feld10)
$in{'ls'} or $in{'ls'} = "";          # lieSeit (lieferbar seit aus FM)

$in{'wwas'} or $in{'wwas'} = "";      # sonst uninitialized
if ($in{'wwas'} eq "anr") { $in{'anr'} = $in{'this'}; }  # Text oder anr - Suche
if ($in{'wwas'} eq "bez") { $in{'bez'} = $in{'this'}; }  # Text oder anr - Suche

$in{'anr'} or $in{'anr'} = "";        # Artikelnummer
$in{'bez'} or $in{'bez'} = "";        # Textsuchfeld
$in{'pic'} or $in{'pic'} = "";        # Bildreferenz
$in{'mp'} or $in{'mp'} = "0";         # Standard = keine Minibilder
$in{'lg'} = substr($in{'sid'},15,2);
$in{'lg'} or $in{'lg'} = "de";        # besser deutsch als nix
($in{'floh'} eq "2" or $in{'floh'} eq "3") or $in{'floh'} = "";  # Flohmarkt = 3

# ------- Listenparameter (fixe Variable) -------------------------------------------

@Tabwidth = ( 20, 28, 85, 28, 0, 25, 40, 40, 15 );   # Länge TabCells (ohne checkbox am Anfang)
$fontsatz=qq/<FONT SIZE="2" FACE="Arial,Helvetica,Verdana">/; # </FONT> nicht vergessen!
%gelbtexte = ( 
ACM=>'ACME', ALB=>'ALBEDO', ARN=>'ARNOLD', ATR=>'ALPHATRAIN', AUH=>'AUHAGEN', AWM=>'A W M', 
BAC=>'BACHMANN', BEM=>'BEMO', BRA=>'BRAWA', BRE=>'BREKINA', BUS=>'BUSCH', CON=>'CON-RAIL', 
DAT=>'&nbsp;', DIV=>'&nbsp;', DOL=>'DOLISCHO', ELE=>'ELECTROTREN', ESU=>'ESU', FAL=>'FALLER',
FLM=>'FLEISCHMANN', GEC=>'GECON - GECONVVM', GEL=>'GELI', GUE=>'G&Uuml;TZOLD', 
'H-S'=>'HOBBY-SOMMER', HAG=>'HAG', HEK=>'HEKI', HRS=>'HERIS-MODELLBAHN', HPA=>'HERPA', 
HBY=>'HORNBY-INTERNATIONAL (LIMA, RIVAROSSI, JOUEF)', HTN=>'HOBBYTRAIN', JAE=>'JAEGERNDORFER',
JOU=>'JOUEF', KAT=>'KATO', KIB=>'KIBRI', KLB=>'KLEIN MODELLBAHN', LEN=>'LENZ', 
LGB=>'LGB', LIL=>'LILIPUT', LIM=>'LIMA', LSM=>'LS-MODELS', MAE=>'M&Auml;RKLIN', 
MEH=>'MEHANO', NCH=>'NOCH', OHE=>'OHE', PIK=>'PIKO', POL=>'POLA', 
PRE=>'PREISER', 'R+H'=>'R & H', RIE=>'RIETZE', RIV=>'RIVAROSSI', RCT=>'ROCO ERSATZTEILE', 
ROC=>'ROCO', SAX=>'SACHSENMODELLE', SCO=>'SCHUCO', SEU=>'SEUTHE', SOM=>'SOMMERFELDT', TIL=>'TILLIG',
TIP=>'TIPPELT (Ti-H0)',  RTP=>'RAILTOP', TRI=>'TRIDENT', TRX=>'TRIX - MINITRIX',
UHL=>'UHLENBROCK', VID=>'VIDEOS, POSTKARTEN, KALENDER', VIE=>'VIESSMANN', VIT=>'VITRAINS', 
VOL=>'VOLLMER', WEI=>'WEINERT', WIK=>'WIKING', ZIM=>'ZIMO' 
);

%signal = ( 
AUS=>'Hp0', LIE=>'Hp1', NEU=>'Vr 1', NPR=>'NPR', OMG=>'Vr 0', WNL=>'Hp2', CHK=> 'Chk'
);
$flohsymbol = qq*<IMG SRC="../pic/arr_down.gif" WIDTH="11" HEIGHT="7">*;

$infile=$in{'base'};    # Übergabe flatfile-name
$curr_url .= $ENV{'SCRIPT_NAME'}."?sid=$in{'sid'}&hst=$in{'hst'}&spur=$in{'spur'}&sose=$in{'sose'}";
$curr_url .= "&nh=$in{'nh'}&anr=$in{'anr'}&bez=$in{'bez'}&anf=$in{'anf'}&grp=$in{'grp'}&mp=$in{'mp'}";
$curr_url .= "&floh=$in{'floh'}&ls=$in{'ls'}&lie=$in{'lie'}&max=$in{'max'}";
$curr_url =~ s/\s+/ /g;  # whitespaces retourkonvertieren
$curr_url =~ s/!";//g;  # Schutz vor bösen Jungs

$in{'hst'}=uc($in{'hst'}); # wenn ueber /hst mod-rewrite
&sprachwahl;
if ($in{'floh'} eq "2") { 
  $html_title=$htm2_title;
  $in{'floh'} = "[23]";   # Frage nach 2 soll 3er inkludieren !!!nein - inhalt in klammer war 23 geändert af auf 2 wieder zurück
}

@faktor=(0.137603,0.01);     # eu-cent*faktor = ATS,euro
if ($in{'pr'} eq "ex") {
 @faktor=(0.114665,0.008333); }

$bueber =""; # Marke als Schnüffels Bildüberschrift, wenn Bildanzeige

# ---- sonstige Variable initialisieren -----------------------------------------------

@anrs = ("");
@Zeilen = ("");
@fmfeld = ("");
@TabCell = ("");
($i,$j,$k,$h) = ("0", "0", "0", "0");

# ------- Suchmuster initialisieren ------------------------------------------------

if ($in{'anr'}) {                         # entweder ArtNr oder Textsuche oder Anders
 $in{'anr'} =~ s/\n/ /g;                  # change CRs to Leerzeichens
 $in{'anr'} =~ s/,\s/ /g;                 # strip trailing ','s
 $in{'anr'} =~ s/[.]/,/g;                 # after that, change '.'s to ','s
 $in{'anr'} =~ s/[^ ,0-9a-zA-Z]//g;       # strip all except of Leerzeichen,0-9,a-z,A-Z und ','
 @anrs = split(/\s+/,$in{'anr'});         # an ein oder mehr whitespaces teilen
 @anrs = sort { $a <=> $b } @anrs;        # sortiere Artikelnummern numerisch in Array
}
elsif ($in{'bez'}) {
 $in{'bez'} =~ s/\s+/ /g;                 # any number of whitespaces (tab,CR,etc) to Leerzeichens
 $in{'bez'} =~ s/[^ -.&;0-9a-zA-ZÄ-ü]//g; # strip all except of .. Leerzeichen,minus,punkt,&; 0-9,a-z,etc
 if ($in{'bez'} =~ /\sODER\s/i) {         # groß-Klein egal; damit das geht: im Suchmuster GROSSSCHREIBUNG
   $in{'bez'} =~ s/\sODER\s/\.\*|/ig;     # [ oder ] gegen [.*|] tauschen (Perl-Suchmuster)
   $in{'bez'} = $in{'bez'}."\.\*";        # maus.*|haus.* ergänzt abschließendes [.*|] 
   }
 else {                                   # UND-Suche: build @bez array für alle Einzelworte
   @bez = split(/\s+/,$in{'bez'});        # an ein oder mehr whitespaces teilen
 }
}      # vorsicht Falle: der zugelassene Punkt = Wildcard; minus direkt vor 0 ließe nur Minuszahlen zu
else {
  # Restfrage, falls weder $in{'anr'} noch $in{'bez'}
  # 0=inet,1=hst,2=grp,3=spur,4=anr,5=PL,6=bez,7=lim,8=hspreis_in_cent,9=lager,10=lieStat,11=sort,12=lieSeit,13=info
  $qu ="";
  $in{'hst'}=uc($in{'hst'});
  if ($in{'floh'} gt "1") { $qu .= qq@^$in{'floh'}@; } else { $qu .= "\."; } # floh=Text!
  if ($in{'hst'})  { $qu .= qq@\t$in{'hst'}@; } else { $qu .= "\t\.*"; }
  if ($in{'grp'})  { $qu .= qq@\t$in{'grp'}@; } else { $qu .= "\t\.*"; }
  if ($in{'spur'})  { $qu .= qq@\t$in{'spur'}@; } else { $qu .= "\t\.*"; }
  $qu .= "\t\.*"; # irgendeine ArtNr
  if ($in{'nh'})  { $qu .= qq@\t$in{'nh'}@; } else { $qu .= "\t\.*"; }
  $qu .= "\t\.*"; # irgendeine Bezeichnung
  if ($in{'sose'})  { $qu .= qq@\t$in{'sose'}@; } else { $qu .= "\t\.*"; }
  $qu .= "\t\.*"; # jump over hspreis_in_cent
  $qu .= "\t\.*"; # jump over lager
  if ($in{'lie'})  { $qu .= qq@\t$in{'lie'}@; } else { $qu .= "\t\.*"; }  # liestat
  $qu .= "\t\.*"; # jump over sort
  if ($in{'ls'})  { $qu .= qq@\t$in{'ls'}@; } else { $qu .= "\t\.*"; }
    # Rest noch nicht implementiert, 13=info
  if ($qu) {$qu .="\t";} # weil 13=info noch fehlt, sonst wäre am Ende ein "\n" !!!
  }

# ------- Artikeldatei zeilenweise testen und in '@zeilen' sammeln ---------

-T $infile or die "$infile not an ASCII file";
open(TABTEXT, "<:encoding(UTF-8)",$infile) || die "Artikeldatei nicht gefunden\n";

$weiter=qq*<img src="../pic/bt_wei0$in{'lg'}.gif" width="77" height="22" border="0">*;  #inaktiv

while(<TABTEXT>) {                         # Datei zeilenweise in @Zeilen einlesen
 $test=$_;
 if ($j>$in{'max'}) {                      # Stop, wenn Zeilenmax. $in{'max'} erreicht
   $weiter=$curr_url;                      # wenn > max, dann aktivieren mit URL
   $weiter =~ /anf=(\d*)/;                 # Nummer der Anfangszeile herauskletzeln
   $x = $1+$in{'max'};                     # Klammerinhalt plus $in{'max'}
   $weiter = "$`anf=$x$'";                 # $` vorKlammer, $' nach der Klammer
   $weiter=qq*<a href="$weiter"><img src="../pic/bt_wei1$in{'lg'}.gif" width="77" height="22" border="0"></a>*;
   last;                                   # und hiermit while-Schleife beenden !
 }
  
 if ($in{'anr'}) {                    # wenn ArtNr, nix anderes
   if (@anrs==1 && (substr($test,1,32) =~ /\t$in{'hst'}\t.*\t$anrs[0]\t/)) {   # Folgenummern anzeigen, falls nur 1 ArtikelNr.
     $i++;
     if ($i>$in{'anf'}) {             # wenn Display-Startzeile erreicht ist
       $Zeilen[$j] = $test;
       $j++; }                        # erhöhe max-Zähler Zeilenarray
     $anrs[0]="";                     # damit ab jetzt alle weiteren $in{'hst'}
     }                                # aber @anrs ist immer noch ==1
   else {
     foreach $anrs (@anrs) {
       if (substr($test,1,32) =~ /\t$in{'hst'}\t.*\t$anrs\t/gi) {  # 32 Zeichen ab 1, damit nicht Inet oder Preis mit anr verwechselbar
       $i++;                          # erhöhe Zeilenfund-Zähler
       $anrs="found_item";
       if ($i>$in{'anf'}) {           # Display-Startzeile erreicht
         $Zeilen[$j] = $test;         # STDIN einlesen
         $j++; }                      # erhöhe max-Zähler Zeilenarray
       undef @verbliebene;
       foreach $anrs (@anrs) {        # reduziere @anrs um gefundenes Element
         if ($anrs ne "found_item") {
           push @verbliebene, $anrs; }
         }
       @anrs = @verbliebene;
       last;                          # falls Treffer, For-Schleifenende?
       }
     }                                # ende if(/mustersuche/)
   }                                  # ende for
   $not_founds=join '; ',@anrs;       # Anzeige fuer Humanoide
 }                                    # ende if ($in...

# ----- Anmerkungen zur Textsuche:
# fmfeld[6] enthält den Artikeltext; innerhalb foreach {} wird eine beliebige Übereinstimmung 
# mit beliebigem Ende gesucht. (dampf findet Dampflok, Tenderdampflok, etc.). Suche ist erfolgreich,
# wenn bei allen Durchläufen der Schleifenzähler bis @bez (=Anzahl arrayelemente) erhöht wurde.
# wäre Suche ab Wortbeginn gewünscht \s müsste vor untersuchte Zeile ein whitespace gesetzt werden
# - Achtung, /b geht nicht wegen &uuml; & ist kein Wortzeichen.


 elsif ($in{'bez'}) {                           # TEXTSUCHE
   if ($test =~ /\t$in{'hst'}\t/ && /\t$in{'spur'}\t/ && /\t$in{'sose'}\t/ && /\t$in{'nh'}\t/o) {  # /o compile only once
     @fmfeld = split(/\t/,$test);               # Datensatz an tab's splitten
     if (!$bez[0]) {                            # ODER-Suche ( --> wenn keine UND-Elemente)
       if ($fmfeld[6] =~ m/$in{'bez'}/i) {      # 1x finden genügt, ignoriere klein/Gross m/\Q$bez\E/i
       $i++;                                    # erhöhe Zeilenfund-Zähler
       if ($i>$in{'anf'}) {                     # und wenn die Startzeile erreicht ist
	        $Zeilen[$j] = $test;                # dann STDIN einlesen
         $j++;                                  # sowie Tabellenzeilenzähler-Array erhöhen
         }
       }
     }
     else {                                     # UND-Suche
       $k=0;
       foreach $bez (@bez) {
         if ($fmfeld[6] =~ m/$bez[$k]/i) {      # Suchwort Bestandteil der Testzeile?
         $k++; }
       }
       if ($k==@bez) {                          # falls also alle durchlaufen
         $i++;                                  # Zeilenfund-Zähler
         if ($i>$in{'anf'}) {                   # und wenn die Startzeile erreicht ist
	         $Zeilen[$j] = $test;               # dann STDIN einlesen
         $j++;                                  # Tabellen-Zeilenzähler
         }
       }
     }
   }
 }
 elsif ( m/$qu/io ) {           # definiert oben
   $i++;                        # Zeilenfund-Zähler
   if ($i>$in{'anf'}) {         # und wenn die Startzeile erreicht ist
     $Zeilen[$j] = $test;       # dann STDIN einlesen
     $j++;                      # Tabellen-Zeilenzähler
   }
 }
}                               # und weiter mit while-schleife
close(TABTEXT);


# ------ register the query ---------------------------------------------------------

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time); # Server-Zeit
undef $wday;
undef $yday;
undef $isdst;
$timestamp_check=substr($year,1,2);
$mon++;                                 # weil bei 'localtime(time)' die Monate mit 0 beginnen
length($mon)==2 or $mon="0".$mon;
length($mday)==2 or $mday="0".$mday;
length($hour)==2 or $hour="0".$hour;
length($min)==2 or $min="0".$min;
length($sec)==2 or $sec="0".$sec;
$timestamp_check="$timestamp_check-$mon-$mday $hour-$min";

$msg = "$in{'sid'}\t$in{'anf'}\t$in{'hst'}\t$in{'grp'}\t$in{'floh'}\t$in{'anr'}\t$in{'bez'}\t$in{'spur'}\t$in{'sose'}\t$in{'nh'}";

open (OUTFILE,">>suchlog.log");
binmode OUTFILE, ':encoding(UTF-8)';
print OUTFILE "$timestamp_check\t$ENV{'REMOTE_ADDR'}\t$msg\n";
close (OUTFILE);

# ------ Seitenaufbau ---------------------------------------------------------------

binmode STDOUT, ':encoding(UTF-8)';    # alle Ausgaben zB für browser wieder utf-8 codieren

print <<sugosugo;       # print alles bis End-Markierung 'sugosugo' charset=iso-8859-1
Content-type: text/html; charset=utf-8

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
  <TITLE>$html_title</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</HEAD>
<BODY BGCOLOR="#FFFFFF" LINK="#CC0000" ALINK="#00BB00" VLINK="#CC0000">
<BASEFONT FACE="Verdana,Arial,Helvetica,sans-serif" SIZE=2>

sugosugo

%changes = ( '#MARKE#' => "$gelbtexte{$in{'hst'}}" );
&einbauen("../inc/rahmen_$in{'lg'}.txt","oberteil","change","$sid13");

# ------ Debugging  ---------

# print "$in{'bez'}<br>$curr_url\n<br>";
# print "req: $qu<br>";         # Test Anzeige Suchmuster
# for (@Zeilen) { print "$_<br>\n"; }  # Test Anzeige um gefundene Zeilen zusehen

# ------ falls kein Ergebnis ... ----------------------------------------------------

if ($i==0) {                              # kein Treffer
  %changes = ( '#HST#' => "$gelbtexte{$in{'hst'}}", '#SPUR#' => "$in{'spur'}",
   '#SOSE#' => "$in{'sose'}", '#NH#' => "$in{'nh'}", '#ANR#' => "$not_founds",
   '#BEZ#' => "$in{'bez'}" );
 &einbauen("../inc/rahmen_$in{'lg'}.txt","keintreffer","change","$sid13");
 &einbauen("../inc/rahmen_$in{'lg'}.txt","unterteil","no","$sid13");
 print "</BODY></HTML>";
 exit(0);
}

# ------ Rundschreiben Test-Insert, temporär nur für RS

if ($in{'grp'} eq "chrs") {
  &einbauen("../inc/3chrs_$in{'lg'}.txt","rs-insert","no","$sid13");
}

# ------ falls doch ein Ergebnis, suchen, ob für das Ergebnis ein Bild existiert ----

if ($in{'pic'} eq "") {
 for (@Zeilen) {                       # solange Daten im Zeilen-Array sind
   @fmfeld = split(/\t/,$_);           # Datensatz an tab's splitten
   $itemname=$fmfeld[1].$fmfeld[4];
   $test= lc($fmfeld[1])."/$fmfeld[4]";
   if (-e "../pic/3itm/$test.jpg") {
     $in{'pic'}="$itemname.jpg"; }
   elsif (-e "../pic/3itm/$test.gif") {
     $in{'pic'}="$itemname.gif"; }
   if ($in{'pic'} gt "") {
   last;
   }
 }
}

# Warenkorb-Steuerleiste vorbereiten -----------------------------------------------------

$retour=qq*<img src="../pic/bt_bak0$in{'lg'}.gif" width="77" height="22">*;   # $weiter gibts schon !!
if ($in{'anf'} >= $in{'max'}) {       # gibts schon mehr als $in {'max'} Zeilen?
 $retour = $curr_url;                 # generieren Rückwärts-URL
 $retour =~ /anf=(\d*)/;              # Nummer der Anfangszeile herauskletzeln
 $x = $1-$in{'max'};                  # Klammerinhalt minus $in{'max'}
 $retour= "$`anf=$x$'";               # gefundenes vor Klammerinhalt, $x, nach Kl.inhalt
 $retour=qq*<a href="$retour"><img src="../pic/bt_bak1$in{'lg'}.gif" width="77" height="22" border="0"></a>*;
 }

$curr_url =~ /sid=$sid13(..)/;  # $1= (..)-Inhalt; dm|in|ex; Ende bei Nichtwort

if ($1 eq "ex") {   # vars: $` Inhalt vor m/muster/, $1=(..), $' Inhalt nach m/muster/
  $insert_zeig=$przeig_ex;
  $insert_wahl1=qq*<A HREF="$`sid=$sid13*."in".qq*$'">$prwahl_in</a>*;
}
if ($1 eq (""|"in")) {
  $insert_zeig=$przeig_in;
  $insert_wahl1=qq*<A HREF="$`sid=$sid13*."ex".qq*$'">$prwahl_ex</a>*;
}

$wbar = qq*<table width="100%" border="0" cellspacing="0" cellpadding="1">\n*;
$wbar .= qq*<tr><td width="182" bgcolor="#FFCC00">\n*;
$wbar .= qq*<INPUT TYPE=image SRC="../pic/bt_krb$in{'lg'}.gif" width="180" height="22"></td>\n*;
if ($in{'floh'} eq "[23]") {
  $weiter= qq*"../mbcgi/schnueffel_v1.pl?&sid=$in{'sid'}&hst=$in{'hst'}"*;
  $wbar .= qq*<td width="79" bgcolor="#FFCC00"><a href=$weiter>*;
  $wbar .= qq*<img src="../pic/bt_all$in{'lg'}.gif" width="154" height="22" border="0"></a></td>\n*;
}
else {
 $wbar .= qq*<td width="79" bgcolor="#FFCC00">$retour</td><td width="79" bgcolor="#FFCC00">$weiter</td>\n*;
}
$wbar .= qq*<td width="79" bgcolor="#FFCC00"><a href="../mbcgi/nav.pl?sid=$in{'sid'}&jump=suchen.shtml">\n*;
$wbar .= qq*<img src="../pic/bt_s$in{'lg'}.gif" width="77" height="24" border="0"></a></td>\n*;
$wbar .= qq*<td align=right><font face="Verdana, Arial, Helvetica, sans-serif" size="1">\n*;
$wbar .= qq* $insert_wahl1</font></td></tr></table>\n*;


if ($in{'pic'} =~ /inc\/(.*)/ ) {  # zB $in{'pic'} = "inc/flmAT";
  &einbauen("../inc/2$1_$in{'lg'}.txt","text_oben","no","$sid13"); 
}
else {
  if ($in{'hst'} gt "" && $in{'bez'} eq "") {  # Schnüffels Bildüberschrift
   $bueber = ucfirst(lc($gelbtexte{$in{'hst'}}));
   $bueber=qq*$fontsatz<FONT SIZE=5 color="#9A9A9A"><B>*.uc($bueber)."</FONT></FONT><BR>";
  };
  $picshow=qq*$bueber<IMG SRC="../pic/dogrun.gif" WIDTH="200" HEIGHT="35">*;
  if ($in{'pic'} gt "") {
    $hst = lc(substr($in{'pic'},0,3));
    $anr = substr($in{'pic'},3,length($in{'pic'})-7);
    $insert = ucfirst(lc($gelbtexte{substr($in{'pic'},0,3)}))." $anr";
    if (-e "../pic/3itm/$hst/$anr.jpg") {
      $picshow=qq*$bueber<IMG SRC="../pic/3itm/$hst/$anr.jpg" ALT="$insert"><BR>*;
    }
    elsif (-e "../pic/3itm/$hst/$anr.gif") {
      $picshow=qq*<IMG SRC="../pic/3itm/$hst/$anr.gif" ALT="$insert"><BR>*;
    }
    $insert = qq*$fontsatz<B>$insert</B></FONT><BR>*; # nach! ALT-txt
  }
  if ($in{'hst'} gt "") {$bueber = ucfirst(lc($gelbtexte{$in{'hst'}}))};
  print qq*$picshow $insert*;
  if ($anrs[0] ne (""|undef)) {      # zeige nicht gefundene Artikelnummern, nur im Suchmodus
    # $not_founds=join '; ',@anrs;   # schon oben
    if ($in{'hst'} eq "") {
      print "$fontsatz<A HREF=\"$ENV{'HTTP_REFERER'}\"><BR>$anrs_nix[0]</A><BR>$anrs_nix[1]</FONT><P>";
    }
    print "<BR>$fontsatz $anrs_nix[2] $gelbtexte{$in{'hst'}} $not_founds</FONT>";
  }
}

# print "|$qu|</p>"; # würde Suchmuster zeigen

# ------- HTML-Code für TABLE include erzeugen --------------------------------------

# ACTION="../mbcgi/korb.pl" ist wegen der mod-rewrites nötig (zB aus /reg )

if ($in{'hst'} gt "") {
  $sins[4]=qq*<option value="anr" selected="selected">$sins[1]</option>
   <option value="bez">$sins[2]</option>*;
 } else {
  $sins[4]=qq*<option value="bez" selected="selected">$sins[2]</option>*;
 };
print <<sugosugo;        # print Such-Insert, $wbar und start Table
<br>
<table width="100%" border="0" cellspacing="0" cellpadding="1">
<tr><td colspan="3" valign="top">
 <form method="GET" action="../mbcgi/schnueffel_v1.pl" name="ArtSuch" accept-charset="UTF-8">
  <input type="hidden" name="dummyChar" value="♥" /> <!--wegen IE sonst utf-8 problem-->
  <font size="3" face="Verdana, Arial, Helvetica, sans-serif"><b>$sins[0]</b></font>
  <input name="sid" value="$in{'sid'}" type="hidden">
  <input name="hst" value="$in{'hst'}" type="hidden">
  <select name="wwas">
   $sins[4]
  </select>
 <input name="this" size="28" value="" maxlength="30" type="text">
 <input value="$sins[3]" name="action" type="submit">
 <!-- <input value="$sins[5]" name="action" type="submit"> -->
 </form>
</td></tr>
<FORM ACTION="../mbcgi/korb.pl" METHOD="POST" accept-charset="UTF-8">
<tr><td><FONT SIZE="1" FACE="Arial,Helvetica,Verdana">$wbartext</font></td>
<td><div align="right"><FONT SIZE="1" FACE="Arial,Helvetica,Verdana">$insert_zeig</font></div></td></tr>
</table>
$wbar<BR>
<INPUT TYPE=hidden NAME="sid" VALUE="$in{'sid'}">
<TABLE BORDER=0 CELLSPACING=1 WIDTH=560>
<TR BGCOLOR="#EEEEEE" ALIGN="CENTER">
<TD WIDTH=$Tabwidth[0]><B>$fontsatz$headline[0]</FONT></B></TD>    
<TD WIDTH=$Tabwidth[1]><B>$fontsatz$headline[1]</FONT></B></TD>
<TD WIDTH=$Tabwidth[2]><B>$fontsatz$headline[2]</FONT></B></TD>
<TD WIDTH=$Tabwidth[3]><B>$fontsatz$headline[3]</FONT></B></TD>
<TD><B>$fontsatz$headline[4]</FONT></B></TD>
<TD WIDTH=$Tabwidth[5]><B>$fontsatz$headline[5]</FONT></B></TD>
<TD ALIGN=right WIDTH=$Tabwidth[6]><B>$fontsatz$headline[6]</FONT></B></TD>
<TD ALIGN=right WIDTH=$Tabwidth[7]><B>$fontsatz$headline[7]</FONT></B></TD>
<TD WIDTH=$Tabwidth[8]>$headline[8]</TD>
</TR>
sugosugo

# ------- Zeilen aus Filemaker aufdröseln -------------------------------------

$marke="";
$j = 0;
for (@Zeilen) {                     # solange Daten im Zeilen-Array sind
 @fmfeld = split(/\t/,$_);          # Datensatz an tab's splitten
 $fot="&nbsp;";
 
# --- $TabCells aus @fmfeldern der @Zeile generieren ------------------
#     Filemaker liefert 15 Felder, wir brauchen checkbox plus 8

 $TabCell[0] = qq/<INPUT TYPE="checkbox" NAME="00$fmfeld[1]$fmfeld[4]" VALUE="">/;
 $TabCell[1] = $fmfeld[3];                   # Spur
 $TabCell[2] = "";                           # Marke ArtNr. LEER-init
 $itemname=$fmfeld[1].$fmfeld[4];
 $_ = "$fmfeld[1] $fmfeld[4]";
 $mini_url="";
 
 if ($in{'mp'} == 1) {
   $Tabwidth[2]=96;
   $mini_url=qq*<img src="../pic/3imi/0.gif" width="96" border="0"><br>*;
   $test="../pic/3imi/".lc($fmfeld[1])."/$fmfeld[4].jpg"; # gibts ein Bild?
   if (-e $test) {
     $mini_url=qq*<img src="$test" width="96" border="0"><br>*;
   }
 } 
 $test="../pic/3itm/".lc($fmfeld[1])."/$fmfeld[4]";
 if (-e "$test.jpg") {
   $TabCell[2] = qq*<A HREF="$curr_url&pic=$itemname.jpg">$mini_url$_</A>*;
   $fot=qq*<img src="../pic/cam1.gif" width="18" height="13" border="0">*;
 }
 elsif (-e "$test.gif") {
   $TabCell[2] = qq*<A HREF="$curr_url&pic=$itemname.gif">$mini_url$_</A>*;
   $fot=qq*<img src="../pic/cam1.gif" width="18" height="13" border="0">*;
  }
 else {
   $TabCell[2] .= "$mini_url$_";         # Marke ArtNr
 }
 $TabCell[3] = $fot;                     # was: $fmfeld[5]; # PL (NH oder OMG)
 $TabCell[4] = $fmfeld[6];               # Bezeichnung
 $TabCell[5] = $fmfeld[7];               # lim. Sonderserie
 $TabCell[6] = "&nbsp;";                 # Euro, falls noch kein Preis ...
 if ($fmfeld[8] ne "") {
   $TabCell[6] = sprintf("%.2f",$fmfeld[8] * $faktor[1]);
 $TabCell[7] = "Chk";                 # falls noch keine Lieferbarkeit ...
 if ($fmfeld[10] gt " ") {
   $TabCell[7] = $signal{$fmfeld[10]}; }
 $TabCell[8] = "&nbsp;";                 # falls kein Floh ...
 if ($fmfeld[0] >= 3) {
   $TabCell[8] = $flohsymbol; }          # Flohmarktpreis (3) oder Lieferantenaktion (4)
}

# --- generieren Tabellenzeile (zusätzliche Gelbzeile bei Markenwechsel) ------

 if ($marke ne $fmfeld[1]) {  # not equal, Markenwechsel, daher Gelbzeile
   $Tabzeile= "<TR BGCOLOR='#FFCC00'>";
   $Tabzeile=$Tabzeile."<TD>&nbsp;</TD><TD>&nbsp;</TD><TD>&nbsp;</TD><TD>&nbsp;</TD>";
   $gelbtexte{$fmfeld[1]} or $gelbtexte{$fmfeld[1]} = $fmfeld[1].".....";
   $Tabzeile=$Tabzeile."<TD>$fontsatz<B>$gelbtexte{$fmfeld[1]}</B></FONT></TD>";
   $Tabzeile=$Tabzeile."<TD>&nbsp;</TD><TD>&nbsp;</TD><TD>&nbsp;</TD><TD>&nbsp;</TD>";
   print $Tabzeile;
   }

 if ( $j%2 > 0 ) {              # modulo-Division
   $color = "CCCCCC"; }         # codiere als mittelgrau
 else {
   $color = "EEEEEE"; }         # codiere als hellgrau

 $marke = $fmfeld[1];        # für Prüfung Markenwechsel nächster Durchlauf
 $j++;


 $Tabzeile= "<TR BGCOLOR=#$color>";
 for ($i=0;$i<=8;$i++)   # soviel elemente wie in @TabCell (@Zeilenarray) minus eins (dzt. 8)
   {
   ($TabCell[$i] gt " ") or $TabCell[$i]="&nbsp;";  # falls [$i] (fast)leer
     
   $Tabzeile=$Tabzeile."<TD";
   if ( $Tabwidth[$i] > 0 ) {                         # width-tag if >0 in array
     $Tabzeile=$Tabzeile." WIDTH=$Tabwidth[$i]"; }
   if ( $i>@Tabwidth-4 ) {                            # last 2 tabs = Preis, daher
     $Tabzeile=$Tabzeile."><P ALIGN=right";     }     # rechtsbündig
       
   $Tabzeile=$Tabzeile.">$fontsatz$TabCell[$i]</FONT></TD>\n";
     
   }
 print $Tabzeile."</TR>\n";           # Abschluß generieren Tabellenzeile
 }                                    # Abschluß for-Schleife zum @Zeileneinlesen
  

# ------------- Tabelle beenden und einfügen, was danach stehen soll .... -----------------

print "</TABLE><P>\n $wbar\n</FORM>";

if ($in{'pic'} =~ /inc\/(.*)/ ) {  # zB $in{'pic'} = "inc/flmAT";
  &einbauen("../inc/2$1_$in{'lg'}.txt","text_unten","no","$sid13");
}
else {                             # allg. Schnueffel-ende
  &einbauen("../inc/rahmen_$in{'lg'}.txt","schnueffende","no","$sid13");
}

&einbauen("../inc/rahmen_$in{'lg'}.txt","unterteil","no","$sid13");

print "</BODY></HTML>";

exit(0);



##############################################################################
sub param_in {                     # Uebergabe der Parameter im Online-Betrieb
  if ($ENV{'REQUEST_METHOD'} eq "GET") {
    $buffer = $ENV{'QUERY_STRING'}; }
  else { 
    read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }
  @nvpairs = split(/&/,$buffer);
  foreach $pair (@nvpairs) { 
    ($name, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    $in{$name} = decode($enc, $value); # hier für utf-8. was: $in{$name} = $value;
  }
}

##############################################################################
# params: htmlfile, breakpoint, changeflag, session-ID
# Aufruf: &einbauen("../inc/test.txt","intro","change",sid13)
# "change" benötigt einen '%changes'-hash zum Platzhalteraustausch (a=>b, c=>d)

sub einbauen {
  my ($htmlfile, $breakpoint, $chg, $sid13) =@_;
  my $check ="";  # my ($check); waere ok, aber uninitialisiert, das gibt err_log eintraege
  my $ssi=qq*#include virtual="../*;
  if (-T $htmlfile) {                        # check ob Textfile !
    open(TABTEXT, "<:encoding(UTF-8)",$htmlfile) || die "$htmlfile nicht gefunden\n";
    while(<TABTEXT>)  {
      if ($_ =~ /<!--beginn_$breakpoint-->/i) {
        $check = "OK";
      }
      if ($_ =~ /<!--ende_$breakpoint-->/i) {
        print $_;
        last;
      }
      if ($check eq "OK") {
        if ($chg eq "change") {
          foreach $key (keys %changes) {
            $_ =~ s/$key/$changes{$key}/gi;
          }
        }
        $_ =~ s/0{13}..../$sid13$in{'pr'}$in{'lg'}/go;  # 0{13}: 0,13mal (nur in Mustern)
        if ($_ =~ /$ssi(.*)\"/) {
          open(INCFILE, "<../$1") || die "../$1 [-hstmenu-] nicht gefunden\n";
          @zeilen=<INCFILE>;                   # print <INCFILE>; geht auch !
            for (@zeilen) {
            $zeilen[$h++] =~ s/0{13}..../$sid13$in{'pr'}$in{'lg'}/go;
            }
          print "@zeilen<br>";
        }
        print $_;
      }
    }
  }
}

##############################################################################
sub sprachwahl {

$maker="\u\L$gelbtexte{$in{'hst'}}";
if ($in{'grp'} eq "qxdol") { $maker = "Dolischo";}

if ($in{'lg'} eq "de")
{
@headline = qw(&nbsp; Spur ArtNr Foto Beschreibung lim<BR>Serie Preis<BR>Euro Signal &nbsp;); #quote-word
if ($in{'pr'} eq "ex") {
 @headline = qw(&nbsp; Spur ArtNr Foto Beschreibung lim<BR>Serie Export<BR>Euro Signal &nbsp;); }
$html_title="Hobby-Sommer Modellbahnversand - the modeltrain mailorderhouse";
$htm2_title="Hobby-Sommer $maker Preisliste - hobbysommer Modellbahn Versand";
#$html_descr = "";
#$html_keywd = "";
$sins[0]="Suche "; $sins[1]="Artikelnummer"; $sins[2]="Bezeichung"; $sins[3]="Finden !"; $sins[5]="Gesamtliste";
$wbartext=qq*Artikelzeile </font><IMG SRC="../pic/hakerl.gif" WIDTH="14" HEIGHT="14">
      <FONT SIZE="1" FACE="Arial,Helvetica,Verdana"> ankreuzen und ...*;
$przeig_ex="Exportpreise f&uuml;r ausserhalb der *EU* (z.B. CH, NO, ..)";
$prwahl_ex="Exportpreise zeigen";
$przeig_in="Preisanzeige f&uuml;r alle *EU* L&auml;nder.";
$prwahl_in="*EU* Preise zeigen";
$anrs_nix[0]="Hersteller-Eingabe vergessen ! - zur&uuml;ck zur Eingabe";
$anrs_nix[1]="ohne Hersteller-Angabe ist die folgende Liste m&ouml;glicherweise unvollst&auml;ndig!";
$anrs_nix[2]="nicht gefunden:";
$btn_shop[0]="zur&uuml;ck";
$btn_shop[1]="Artikelzeile ankreuzen, dann hier klicken";
$btn_shop[2]="vor";
$btn_shop[3]="suchen";
} # deutsch ende

if ($in{'lg'} eq "en")
{
@headline = qw(&nbsp; scale item.no. foto description lim<BR>series price<BR>Euro signal &nbsp;); #quote-word
if ($in{'pr'} eq "ex") {
 @headline = qw(&nbsp; scale item.no. foto description lim<BR>series Export<BR>Euro signal &nbsp;); }
$html_title="Hobby-Sommer modeltrains -&gt; Search-results";
$htm2_title="Hobby-Sommer $maker pricelist - hobbysommer modeltrain mailorder";
#$html_descr = "";
#$html_keywd = "";
$sins[0]="Search "; $sins[1]="item number"; $sins[2]="description"; $sins[3]="Find !"; $sins[5]="complete list";
$wbartext=qq*Check </font><IMG SRC="../pic/hakerl.gif" WIDTH="14" HEIGHT="14">
      <FONT SIZE="1" FACE="Arial,Helvetica,Verdana">item line and ...*;
$przeig_ex="indicated export prices apply only outside the EU/EEC: (e.g. CH, NO, ..)";
$prwahl_ex="show export prices</a>";
$przeig_in="Indicated prices apply in all EU/EEC-countries.";
$prwahl_in="show inside EU/EEC prices</a>";
$anrs_nix[0]="no manufacturer supplied ! - back to input page";
$anrs_nix[1]="without a manufacturer defined this listing will most likely be incomplete!";
$anrs_nix[2]="not found:";
$btn_shop[0]="back";
$btn_shop[1]="put checked items into shopping cart";
$btn_shop[2]="onwards";
$btn_shop[3]="search";
} # englisch ende

if ($in{'lg'} eq "it")
{
@headline = qw(&nbsp; Scala codice foto descrizione Serie<BR>limit. Prezzo<BR>Euro sema-<BR>foro &nbsp;); #quote-word
if ($in{'pr'} eq "ex") {
 @headline = qw(&nbsp; Scala NrArt foto descrizione Serie<BR>limit. Export<BR>Euro sema-<BR>foro &nbsp;); }
$html_title="hobbysommer | risultato della ricerca";
$htm2_title="Hobby-Sommer $maker prezzi vendita - hobbysommer: trenini e fermodellismo";
#$html_descr = "";
#$html_keywd = "";
$sins[0]="Cerca "; $sins[1]="codice"; $sins[2]="descrizione"; $sins[3]="Trova !"; $sins[5]="listino completo";
$wbartext=qq*Indica </font><IMG SRC="../pic/hakerl.gif" WIDTH="14" HEIGHT="14">
       <FONT SIZE="1" FACE="Arial,Helvetica,Verdana"> l'articolo e ...*;
$przeig_ex="Prezzi indicati tax-free per l'esportazione (non CEE p.e: CH, NO, ..)";
$prwahl_ex="mostrami prezzi tax-free";
$przeig_in="Prezzi indicati sono valido nella tutta CEE.";
$prwahl_in="mostrami prezzi CEE (IVA incl.)";
$anrs_nix[0]="hai dimenticato di indicare il produttore! - reinserisci i dati";
$anrs_nix[1]="senza l'indicazione del produttore questa lista potrebbe essere incompleta!";
$anrs_nix[2]="non trovato:";
$btn_shop[0]="indietro";
$btn_shop[1]="metti gli articoli selezionati nel carrello";
$btn_shop[2]="avanti";
$btn_shop[3]="ricerca";
} # italiano finito

} # sprachwahl ende
