#!/usr/bin/perl
use CGI::Carp qw(fatalsToBrowser);


# ==========================================================================================
# Copyright (c) 1998-2009 HIS Internet Soft GmbH, info@his-webshop.de. All rights reserved.
# https://his-webshop.de/
# ..........................................................................................
# HIS WebShop 2.50 -- Online Shop mit Warenkorbsystem
# Version: 30.08.2004
#
# ----- LIZENZBESTIMMUNG ------
#
# 1. Dieses Programm (HIS WebShop) darf nur unter folgenden Bedingungen eingesetzt
#    werden:
#    (1) Die Internet Domain des Shops muss für das HIS WebShop Shopsystem
#        lizensiert sein (Ausstellung bei: info@his-webshop.de).
#    (2) Eine Lizenz ist immer gültig für nur einen Shop. Werden mehrere Shops
#        unterschiedlicher Firmen auf einer Domain betrieben, so muss für jeden
#        einzelnen Shop das Shopsystem lizensiert werden (Rabatte sind möglich!).
#
#    Der unbegrenzte Einsatz des Shopsystems ist erst nach Eingabe eines Registrier Keys
#    möglich. Ein Registrier Key gilt dabei immer für eine bestimmte Domain.
#    Beim Erwerb einer Lizenz erhalten Sie den gültigen Registrier Key für die Domain.
#    Aktuelle Konditionen zum Erwerb einer Lizenz finden Sie auf der HIS WebShop
#    Homepage: https://his-webshop.de/
#
# 2. Der Konfigurations-Teil darf geändert werden. Alle anderen Teile des Quellcodes sind
#    urherberrechtlich geschützt. Eine Änderung bedarf der Einwilligung des Autors.
#
# 3. Die Weitergabe des Programms an Dritte ist nicht gestattet.
# ==========================================================================================

# ==============================KONFIGURATIONS-TEIL BEGINN==================================

# ==========================================================================================
# DIE FOLGENDEN VARIABLEN BITTE ANPASSEN!
# Wenn das Skript NICHT laufen sollte, liegt es meistens an fehlerhaften
# Konfigurationsvariablen.
# WICHTIG:
# Bei $email muessen fuer die Zuweisung 'einfache' Anfuehrungsstriche gesetzt werden.
# Bei allen anderen Strings genuegen "doppelte" Anfuehrungsstriche.
# ==========================================================================================

# ==============================KONFIGURATIONS-TEIL BEGINN==================================

# ==========================================================================================
# DIE FOLGENDEN VARIABLEN BITTE ANPASSEN!
# Wenn das Skript NICHT laufen sollte, liegt es meistens an fehlerhaften
# Konfigurationsvariablen.
# WICHTIG:
# Bei $email muessen fuer die Zuweisung 'einfache' Anfuehrungsstriche gesetzt werden.
# Bei allen anderen Strings genuegen "doppelte" Anfuehrungsstriche.
# ==========================================================================================

# Ersetzen Sie www.firma.de durch Ihre Domain!!!!

$rc{"www.shop.baudienst.com"}="560-149-011-5907";                     # Hier geben Sie Ihren 13-stelligen Registrier-Key ein!!!! WICHTIG !!!!
$rc{"https://shop.baudienst.com"}="332-230-236-4295";

$saferpay_accountid="99867-94913159";                   
$saferpay_accountid="98748-17795948";
$saferpay_email='kreditkarte@baudienst.com';
$saferpay_failed="https://shop.baudienst.com/cgi-bin/hws/his-webshop.pl?t=temsaferpay_failed";
$saferpay_ok="https://shop.baudienst.com/cgi-bin/hws/his-webshop.pl?ostcda_sp";

$basket_name_field="NAME";
$pp_username="paypal_api1.baudienst.com";
$pp_password="SLM4UV73Z77TGRQZ";
$pp_signature="AcqCA0iNQhMldeIwJoSqQMlzgUceAv1I.41bLFT8AS.t4hDrYkRVlo6o";


$paypal_item='Bestellung bei www.shop.baudienst.com';
$paypal_directory="../hws-temp/ppdata/"; 
$paypal_notify_url="https://shop.baudienst.com/cgi-bin/hws/his-webshop.pl?t=tempaypal";
$paypal_cancel_return="https://shop.baudienst.com/cgi-bin/hws/his-webshop.pl?t=tembaske";
no warnings;


$no_log=0;	# keine Log-Dateien schreiben

@all_dbs=(                                                # Hier werden alle Datenbanken angegeben!
  "artalle.csv"                                          # Falls keine Datenbank übergeben wird über "db=datenbank.txt",);
);

$trennzeichen=';';

$email='onlineshop@baudienst.com';                             # Ihre E-Mail (Wichtig fuer die Bestellungsmail)
$bcc_email='info@fairzone.de';                         # Die E-Mail an den Shopinhaber kann zusätzlich als BCC (Blind Carbon Copy)
$bcc_mail_email='onlineshop-kopie@baudienst.com';

                                                            # zum Beispiel an einen Administrator verschickt werden.

$profiledirectory="../hws-temp/kunden/";                              # Verzeichnis, wo Kundendaten (Profile fuer Warenkorb)
                                                            # gespeichert werden sollen.
$tempdirectory="./template/";                               # Verzeichnis, wo sich die Templates (HTML und Mail) befinden.
$datadirectory="./daten/";                                  # Verzeichnis, wo sich die aus einer Datenbank
                                                            # exportierte Textdatei befindet.


$globaltxt="./daten/global.txt";                            # Pfad zur Konfig. Datei mit globalen Variablen!
                                                            # Aufbau der Datei:
                                                            # MWST;16
                                                            # WAEHRUNG;DM
                                                            # usw.
                                                            # In den Templates können die Globalen Variablen dann so
                                                            # verwendet werden: [G_MWST] [G_WAEHRUNG] usw.

$max_minuten_inaktiv=2880;                                    # Wenn laenger als $max_minuten_inaktiv kein Zugriff auf einen
                                                            # Warenkorb registriert wurde, wird das Profil geloescht. Voreinstellung: 30 Minuten.
$min_userid=100000;                                           # Die minimale User-ID (Bestellnr.), die vergeben wird.
$max_userid=999999;                                           # Die max. User-ID (Bestellnr.), die vom System vergeben wird.

$sendmail_def=0;                                            # 0: Mails per UNIX-Programm Sendmail verschicken
                                                            # 1: Mails per SMTP-Server verschicken

# ------- Falls sendmail_def=0 ausgewählt ---------
$mailprog = "/usr/lib/sendmail";                            # Externes Mail-Programm sendmail. Pfad kann auch z.B. auf Ihrem
                                                            # Host auch "/usr/sbin/sendmail" sein.
# -------------------------------------------------

# ------- Falls sendmail_def=1 ausgewählt ---------
$mail_smtp_server="mail.IhreDomain.de";                     # Mail-Server für ausgehende (Bestellungs) Mails
                                                            # z.B. mail.IhreDomain.de
# -------------------------------------------------

$robots="Googlebot,msnbot,Yahoo! Slurp,Ask Jeeves,MJ12bot,twiceler,Yeti,gigabot,Exabot,Slurp,Teoma,seekbot,ShopWiki,Speedy,Nutch,MSRBot,TwengaBot,TurnitinBot,discobot,turnitinbot,Discobot";


$subject_user_mail='[IF_(($now_tage,$now_minuten,$mday,$month,$year,$hour,$minute)=&now)][IF_END][IF_(length($month)==1)][$month="0".$month][IF_END][IF_(length($mday)==1)][$mday="0".$mday][IF_END]Auftrag BAUDIENST ONLINEShop [PRINT($year)][PRINT($month)][PRINT($mday)]-[ORDERNR]';  # Betreff der Kundenmail. Alt>>  $subject_user_mail="Auftrag BAUDIENST ONLINEShop"
$subject_shop_mail='[IF_(($now_tage,$now_minuten,$mday,$month,$year,$hour,$minute)=&now)][IF_END][IF_(length($month)==1)][$month="0".$month][IF_END][IF_(length($mday)==1)][$mday="0".$mday][IF_END]Auftrag BAUDIENST ONLINEShop [PRINT($year)][PRINT($month)][PRINT($mday)]-[ORDERNR]';  # Betreff der Bestellungseingangsmail. Alt>> $subject_shop_mail="Auftrag Baudienst ONLINESHOP";

$dif_porto=1;                                               # Wählen Sie hier aus, ob die Versandkosten fest sind
                                                            # ($dif_porto=0), oder ob der Kunde selber die
                                                            # Versandkostenart über eine Combo-Box auswählen kann
                                                            # (z.B. Deutschland/Europa/Sonstige)

# ------- Falls dif_porto=0 ausgewählt ---------
$versandk_hoehe=6.90;                                       # Betrag der Versandkosten für dif_porto=0
                                                            # => feste Versandkosten

$versandk_frei_ab="4500.00";                                 # Mind. Bestellsumme ab der der Versand kostenlos ist.
                                                            # => nur für feste Versandkosten (dif_porto=0)
# -----------------------------------------------

# ------- Falls dif_porto=1 ausgewählt ----------

@porto_daten=(
# Betrag der Versandk. für dif_porto=1
# => Geben Sie in jeder Zeile
# => nur gültig wenn in basket_config.txt eine Bedingung nicht erfüllt ist

# "Lieferland;0.00;0.00",    
"(DE) Deutschland;0.00;100000",                                    
"(AL) Albanien;0.00;100000",
"(AD) Andorra;0.00;100000",
"(BE) Belgien;0.00;100000",
"(BA) Bosnien Herzegowina;0.00;100000",
"(BG) Bulgarien;0.00;100000",
"(DK) Dänemark;0.00;100000",
"(EE) Estland;0.00;100000",
"(FO) Färöer;0.00;100000",
"(FI) Finnland;0.00;100000",
"(FR) Frankreich;0.00;100000",
"(FR) Korsika;0.00;100000",
"(GI) Gibraltar;0.00;100000",
"(GR) Griechenland;0.00;100000",
"(GB) Großbritannien;0.00;100000",
"(GB) Nordirland;0.00;100000",
"(IE) Irland;0.00;100000",
"(IS) Island;0.00;100000",
"(IT) Italien;0.00;100000",
"(XK) Kosovo;0.00;100000",
"(HR) Kroatien;0.00;100000",
"(LV) Lettland;0.00;100000",
"(LI) Liechtenstein;0.00;100000",
"(LT) Litauen;0.00;100000",
"(LU) Luxemburg;0.00;100000",
"(MT) Malta;0.00;100000",
"(MK) Nordmazedonien;0.00;100000",
"(MC) Monaco;0.00;100000",
"(ME) Montenegro;0.00;100000",
"(NL) Niederlande;0.00;100000",
"(NO) Norwegen;0.00;100000",
"(AT) Österreich;0.00;100000",
"(PL) Polen;0.00;100000",
"(PT) Portugal;0.00;100000",
"(PT) Azoren Madeira;0.00;100000",
"(RO) Rumänien;0.00;100000",
"(SM) San Marino;0.00;100000",
"(SE) Schweden;0.00;100000",
"(CH) Schweiz;0.00;100000",
"(RS) Serbien;0.00;100000",
"(SK) Slowakei;0.00;100000",
"(SI) Slowenien;0.00;100000",
"(ES) Spanien;0.00;100000",
"(ES) Balearen;0.00;100000",
"(ES) Kanaren;0.00;100000",
"(ES) Ceuta & Melilla;0.00;100000",
"(CZ) Tschechien;0.00;100000",
"(TR) Türkei;0.00;100000",
"(HU) Ungarn;0.00;100000",
"(VA) Vatikanstadt;0.00;100000",
"(CY) Zypern;0.00;100000",
"(Z2) Zone2;0.00;100000",
"(Z3) Zone3 EU;0.00;100000",
"(Z3nEU) Zone3 non EU;0.00;100000",
"(Z4) Zone 4;0.00;100000",
"(Z5) Zone 5;0.00;100000",
"(Z6) Zone 6;0.00;100000"

);

# "NAME DER VERSANDKOSTENART;PREIS;VERSANDKOSTEN FREI AB"
# an!

# -----------------------------------------------


$min_order_typ=2;                                           # Wählen Sie hier:
                                                            # 0: Mindestbestellmengen werden ignoriert
                                                            # 1: Mindestbestellmenge darf nicht unterschritten werden,
                                                            #    sonst Fehlermeldung!
                                                            # 2: Wenn Mindestbestellmenge unterschritten wird, wird
                                                            #    ein Mindermengen-Zuschlag erhoben.
$min_order="30.00";                                         # Mindestbestellmenge
$min_order_zuschlag="10.00";                                # Mindermengen-Zuschlag!



@currency=(                                                 			# Währungsumrechnungskurse
"Euro=1.00",                                                			# => Geben Sie in jeder Zeile
"Dollar=0.511292");                                         			# "WÄHRUNG=UMRECHNUNGSKURS"
                                                            			# an! Ausgabe: [PREIS_DM], [PREIS_Euro] etc.

@pichttp=(                                                  			# HTTP-Verzeichnis für Bilder (also URL aus der Sicht des CGI-Verzeichnisses)
"https://shop.baudienst.com/bilder/katalog/db/");	 	# Server-Verzeichnis für Bilder (also Pfad aus der Sicht des CGI-Verzeichnisses)
                                                                # Alle Bilder werden in der Form ArtNr.gif hochgeladen, bei Art.Nr 3333 => 3333.gif
                                                          	# Falls Sie versch. Bildertypen anlegen möchten (z.B. ein Verz. für leine Bilder, ein anderes für grosses Bilder), geben Sie diese durch Komma getrennt jeweils in doppelten Anführungsstrichen
                                                          	# In den Vorlagen können sie Bilder so einbinden: [PIC1], [PIC2], [PIC3] usw.
  
                                                            


@picverz=(						# => muss an die Variable @pichttp angepasst werden.
"../../bilder/katalog/db/");                                    			# das Skript kontrolliert anhand des Server-Verz., ob das Bild Art.Nr existiert und gibt dann das HTML-Verzeichnis in der Ausgabe-HTML aus.
 
                               


@pic_field_name=(						# Geben Sie hier das Datenbankfeld an, in dem die Namen
  "NR",							# der Produktgrafiken angegeben sind. Einfachste Lösung:
  "NR",							# Verwenden Sie die Artikel-Nr. "NR" als Name der Grafik
  "NR",							# Die Grafik könnte dann z.B. heissen: 3456.gif
  "NR",
  "NR",
  "NR");                                                 
                                                            
                                                            
                                                            

$default_pic="ohnebild.jpg";                                		# Bild, das geladen wird, falls das Bild ArtNr.gif nicht vorhanden sind

$use_default_pic=2;                                         		# Wenn ein Artikel-Bild nicht vorhanden ist, soll dann
                                                            			# Default-Pic geladen werden, oder gar kein Bild?
                                                            			# 1: Default-Pic laden!
                                                           			# 2: kein Bild ausgeben!

$bestand_verwaltung=0;                                      		# 1: Bestand-Verwaltung benutzen
                                                            			# 0: keine Bestand-Verwaltung

$fehlermeldung_bei_bestand_von_null=1;                      # Hier wird angegeben, ob z.B. eine Bestellung von Menge "1"
                                                            # bei einem Bestand von "0" nicht zugelassen werden soll,
                                                            # oder trotzdem toleriert werden soll. Letzteres kann z.b.
                                                            # sinnvoll sein, wenn der Shopinhaber sehr schnell das
                                                            # Produkt nachbestellen kann!

$mengen_im_warenkorb_addieren=0;                            # Beispiel:
                                                            # Artikel 3456 ist bereits mit der Menge 1 im Warenkorb
                                                            # und wird nochmals in den Warenkorb gelegt.
                                                            # Soll die Menge addiert werden ( = Menge 2) oder soll
                                                            # die Menge bei 1 bleiben?

$admin_passwort="bofair";                                   # Admin-Passwort!
                                                            # Das Admin.Menü kann gestartet werden über:
                                                            # /cgi-bin/hws/his-webshop.pl?admin=<admin passwort>

$no_variants="BESCHREIBUNG,NAME,PREIS,ANR";                          # Geben Sie hier die Felder ein, die generell keine Artikel-Varianten
                                                            # (werden mit / oder mit * getrennt) enthalten.


$gutschein_code_chars="23456789ABCDEFGHJKLMNPQRSTUVWXYZ";    # Falls Sie mit Gutscheinen arbeiten möchten, geben Sie hier
                                                              # an, welche Zeichen im Gutschein-Code gültig sein sollen
$gutschein_code_length=7;                                     # Wieviele Zeichen soll ein Gutschein-Code enthalten?
$subject_gutschein_mail="Gutschein";                          # Wie soll der Betreff der Gutschein-Mail lauten?




@html_convert=(                                             # Geben Sie hier an, welche "Sonderzeichen" in HTML-Entitäten konvertiert
  "ä=&auml;",                                               # werden sollen. Die Ausgabe muss dann über NAME_HTML bzw. VARIABLE_HTML
  "ü=&uuml;",                                               # erfolgen
  "ö=&ouml;",
  "Ä=&Auml;",
  "Ü=&Uuml;",
  "Ö=&Ouml;",
  "ß=&szlig;"
);

$use_multiline_csv=0;                                       # Geben Sie hier an, ob in der CSV Datei ein Artikel
                                                            # (z.B. durch die Beschreibung) mehrere Zeilen umfasst.
                                                            # Wenn Sie sicher sind, dass ein Artikel immer genau innerhalb
                                                            # einer Zeile definiert ist, kann die Einstellung auch auf 0
                                                            # gestellt werden (Datenbank arbeitet dann deutlich schneller!!!)

$shoppl="/cgi-bin/hws/his-webshop.pl";                          # URL zum Skript


$post_order_mail_to_script_url="";                          # Wird hier eine URL zu einem Script angegeben, so wird keine
                                                            # Bestellmail an den Shopbetreiber geschickt. Stattdessen wird
                                                            # der Text an das Script geschickt (POST).
                                                            # Der Inhalt der Mail wird in der Variablen "mailtext" übermittelt




# ==========================================================================================
# Hier muessen die Felder der Datenbank IN DER KORREKTEN REIHENFOLGE definiert werden.
# Reservierte Felder, die exakt so geschrieben werden muessen sind:
# NR und PREIS
# Alle übrigen Felder aus Ihrer Datenbank koennen frei benannt werden. In den
# Templates kann man dann auf die Variablen jeweils mit [VARIABLE] zugreifen.
# ==========================================================================================

@keyw=(
  "AGR",
  "NR",
   "NUMMER",
  "GESTRICHEN",
  "PREIS", 
  "PREISEINHEIT",
  "VERKAUFSMENGENEINHEIT",
  "VPME",
  "GEWICHT",
  "VERSANDKOSTENFIX",
  "AKTION",
  "NAME",
  "BESTELLUNGSINFO",
  "BESCHREIBUNG",
  "AUSWAHL",
  "OPTTEXT",
  "OPTION1",
  "OPTION2",
  "OPTION3",
  "OPTION4",
  "OPTION5",
  "OPTION6",
  "OPTION7",
  "OPT8",
  "OPTION9",
  "BILD",
  "ERSATZ",
  "OPTIONEN",
  "OPTION",
  "ANR",
  "OPTION10",
  "OPTION11",
  "OPTION12",
  "OPTION13",
  "OPTION14",
  "OPTION15",
  "OPTION16",
  "OPTION17",
  "OPTION18",
  "OPTION19",
  "OPTION20",
  "OPTION8"

 );

# ==========================================================================================
# Hier muessen die Felder der Kunden-Datenbank IN DER KORREKTEN REIHENFOLGE definiert werden.
# Alle Felder aus Ihrer Datenbank koennen frei benannt werden. In allen
# Templates kann man dann auf die Variablen jeweils mit [VARIABLE] zugreifen.
#
# Sind Sie interessiert am "HIS WebShop Kunden Modul"? Das Kunden-Modul können Sie zur
# besseren Kundenbindung für Ihre Stammkunden einsetzen. Optionaler Login in den Shop,
# namentliche Begrüssung, bereits vorausgefüllte Bestellformulare etc.
# Kosten für das Kunden-Modul: 150,00 DM + MwSt. (Preis vom 24.01.00, ohne Gewähr!)
# Kontaktieren Sie uns: his-soft@shoppark.de
# ==========================================================================================

$use_kunden_db=1;                    # Geben Sie hier an, ob Sie das Kundenmodul nutzen
                                     # möchten!
                                     # 0: kein Kundenmodul nutzen
                                     # 1: Kundenmodul für Stammkunden nutzen!
                                     #    (das Kundenmodul muss dazu unbedingt installiert
                                     #     werden!)
@userf= (
  "U_PASS",
  "U_USER",
  "U_STATUS",
  "U_UMSATZ",
  "U_ZUGRIFF",
  "U_NAME1",
  "U_NAME2",
  "U_STRASSE1",
  "U_STRASSE2",
  "U_LAND1",
  "U_LAND2",
  "U_PLZ1",
  "U_PLZ2",
  "U_ORT1",
  "U_ORT2",
  "U_BESTELLER",
  "U_ANREDE",
  "U_EMAIL",
  "U_EMAIL2",
  "U_TELEFON1",
  "U_TELEFON2",
  "U_FAX1",
  "U_FAX2",
  "U_USTIDNR",
  "U_ZAHLUNG",
  "U_KDNR",
  "U_RK",
  "U_KUNDENSTATUS1",
  "U_KUNDENSTATUS2",
  "U_KUNDENSTATUS3",
  "U_KUNDENSTATUS4",
  "U_KUNDENSTATUS5",
  "U_FIRMA1",
  "U_FIRMA2",
  "U_BESTELLER_VORNAME",
  "U_BESTELLER2",
  "U_BESTELLER_VORNAME2",
  "U_TELEFON1PRE",
  "U_TELEFON1VORWAHL",
  "U_TELEFON1REST",
  "U_TELEFON2PRE",
  "U_TELEFON2VORWAHL",
  "U_TELEFON2REST",
  "U_FAX1PRE",
  "U_FAX1VORWAHL",
  "U_FAX1REST",
  "U_FAX2PRE",
  "U_FAX2VORWAHL",
  "U_FAX2REST",
  "U_ANREDE2"

);

$user_login_field="U_USER";
$user_pass_field="U_PASS";

# ==========================================================================================
# Hier muessen die Felder der Partner-Datenbank IN DER KORREKTEN REIHENFOLGE definiert
# werden. Alle Felder koennen frei benannt werden.
#
# Sind Sie interessiert am "HIS WebShop Partnerprogramm Modul"? Das Partnerprogramm-Modul
# können Sie zur Einrichtung eines professionellen Partner-Programms einsetzen.
# Kosten für das Partnerprogramm-Modul: 150,00 DM + MwSt. (Preis vom 24.01.00, ohne Gewähr!)
# Kontaktieren Sie uns: his-soft@shoppark.de
# ==========================================================================================

$use_partner_db=0;                   # Geben Sie hier an, ob Sie das Partnerprogramm-Modul nutzen
                                     # möchten!
                                     # 0: kein Partnerprogramm-Modul nutzen
                                     # 1: Partnerprogramm-Modul nutzen!
                                     #    (das Partnerprogramm-Modul muss dazu unbedingt installiert
                                     #     werden!)


$partner_provision=5;                # Provison in Prozent!

@puserf= (
  "P_USER",
  "P_PASS",
  "P_ANREDE",
  "P_NAME",
  "P_EMAIL",
  "P_STRASSE",
  "P_PLZ",
  "P_ORT",
  "P_LAND",
  "P_LISTE",
  "P_ORDERS"
);

$partner_login_field="P_USER";
$partner_pass_field="P_PASS";

# ==============================KONFIGURATIONS-TEIL ENDE====================================



# =================================HAUPTPROGRAMM BEGINN=====================================


use HTML::Entities;

if ($use_kunden_db==1) {                                    # Falls Stamm-Kunden Modul...
  require "kunde.pl";                                       # Modul einbinden!
}

if ($use_partner_db==1) {                                    # Falls Stamm-Kunden Modul...
  require "partner.pl";                                      # Modul einbinden!
}

$fe[0]="Content-type: text/html\n\n<html><body>Für den Server wurde kein Registrier Key angegeben.\nBitte kontaktieren Sie HIS-Software his-soft\@shoppark.de, um einen gültigen Registrier Key zu erhalten.\nUm die Software zu testen, können Sie den Shop OHNE Registrier Key mit max. 10 Artikeln betreiben. Begrenzen Sie dazu die Artikel Datenbank.</body></html>";
$fe[1]="Content-type: text/html\n\n<html><body>Der Registrier Key ist nicht für den Server gültig.\nBitte kontaktieren Sie HIS-Software his-soft\@shoppark.de, um einen gültigen Registrier Key zu erhalten.\nUm die Software zu testen, können Sie den Shop OHNE Registrier Key mit max. 10 Artikeln betreiben. Begrenzen Sie dazu die Artikel Datenbank.</body></html>";
$fe[2]="Content-type: text/html\n\n<html><body>Der Registrier Key ist ungültig.\nBitte kontaktieren Sie HIS-Software his-soft\@shoppark.de, um einen gültigen Registrier Key für den Server zu erhalten.\nUm die Software zu testen, können Sie den Shop OHNE Registrier Key mit max. 10 Artikeln betreiben. Begrenzen Sie dazu die Artikel Datenbank.</body></html>";

$start_tage = 2450902;                                      # Absolute Tage

# Vorlagen befinden sich in dem Verzeichnis $tempdirectory und haben bis auf
# $template_mail die Endung ".htm"
$template_error="temerror";                                 # Fehler-Vorlage
$template_send="temsend";                                   # "Danke für Ihre Bestellung"-Template
$template_basket="tembaske";                                # Warenkorb-Template
$template_order="temorder";                                 # Bestellugsseite-Template
$template_shop_mail="order.htm";                            # Bestellungsmail-Template für Shop-Inhaber
$template_user_mail="mail.htm";                             # Bestellungsmail-Template für User
$template_partner_mail="mpartner.txt";

$articledat=$datadirectory."artalle.csv";                   # Artikel-Datenbank
$kundetxt=$datadirectory."kunden.txt";                      # Stammkunden-Datenbank
$partnertxt=$datadirectory."partner.txt";                   # Partner-Datenbank
$kundedat=$profiledirectory."kunden.dat";                   # Kunden-Datenbank
$statistikdat=$datadirectory."statistik.txt";
$orderstat=$datadirectory."orderstat.txt";

($id_article_quantity,                                      # Zusaetzliche Arrayindizes fuer Artikel
 $id_article_newquantity,
 $id_article_apreis,
 $id_article_sum,
 $id_article_binfo,
 $id_article_opreis,
  $id_article_mpreis)=$#keyw+1..$#keyw+7;

$max_keyw=$#keyw+5;



($id_global_skript,                                         # Index fuer globale Variablen Array
 $id_global_userid,
 $id_global_remotehost,
 $id_global_versandkosten,
 $id_global_versandkfreiab,
 $id_global_sumall,
 $id_global_sumallv,
 $id_global_hit_start,
 $id_global_hit_end,
 $id_global_hit_max,
 $id_global_hit_menu,
 $id_global_hit_forward,
 $id_global_hit_back,
 $id_global_artikel_anz,
 $id_global_content,
 $id_global_porto_auswahl,
 $id_global_porto,
 $id_global_error,
 $id_global_referer,
 $id_global_shopemail,
 $id_global_ordernr,
 $id_global_min_order,
 $id_global_min_order_zuschlag,
 $id_global_query,
 $id_global_provision,
 $id_global_bonus_nr,
 $id_global_bonus_value,
 $id_global_bonus_pass,
 $id_global_bonus_email,
 $id_global_bonus_message,
 $id_global_happy_hour)=(0..30);
 $last_id_global=30;


($id_kunde_remotehost,                                      # Index fuer Kunden Array
 $id_kunde_kundennr,
 $id_kunde_tage,
 $id_kunde_minuten,
 $id_kunde_userdata,
 $id_kunde_partnerdata,
 $id_kunde_global)=(0..6);

($id_order_date,
 $id_order_ordernr,
 $id_order_sum,
 $id_order_provision,
 $id_order_pid,
 $id_order_status)=(0..5);

%multi= (
   "MENGE", 1,                  # Ok
   "NEUE_MENGE", 1,             # Ok
   "APREIS",1,
  "OPREIS",1,
  "MPREIS",1,
   "SUMME", 1,                  # Ok
   "BINFO",1,
   "SKRIPT",5,                  # Ok
   "USER_ID",5,                 # Ok
   "HOST",5,                    # Ok
   "VERSANDKOSTEN",5,           # Ok
   "VERSANDKOSTEN_FREI_AB",5,   # Ok
   "GESAMTSUMME",5,             # Ok
   "GESAMTSUMME_VERSAND",5,     # Ok
   "HIT_START",5,
   "HIT_END",5,
   "HIT_MAX",5,
   "HIT_MENU",5,
   "HIT_FORWARD",5,
   "HIT_BACK",5,
   "ARTIKEL_ANZ",5,
   "CONTENT",5,
   "PORTO_AUSWAHL",5,
   "PORTO",5,
   "ERROR_INHALT",5,            # Ok
   "REFERER",5,
   "SHOPEMAIL",5,
   "MIN_ORDER",5,
   "MIN_ORDER_ZUSCHLAG",5,
   "QUERY",5,
   "HAPPY_HOUR",5,
   "PROVISION",5,
   "BONUS_NR",5,
   "BONUS_PASS",5,
   "BONUS_VALUE",5,
   "BONUS_EMAIL",5,
   "BONUS_MESSAGE",5,
   "ORDERNR",5,
   "ORDERKEY",6,                # Ok
   "ORDERVALUE",6,               # Ok
   "RORDER_DATE",8,
   "RORDER_SUM",8,
   "RORDER_ORDERNR",8,
   "RORDER_PROVISION",8,
   "RORDER_STATUS",8,
   "RORDER_PID",8,
);

%index= (
  "MENGE",$id_article_quantity,
  "NEUE_MENGE",$id_article_newquantity,
  "APREIS",$id_article_apreis,
 "OPREIS",$id_article_opreis,
  "MPREIS",$id_article_mpreis,
  "SUMME",$id_article_sum,
  "BINFO",$id_article_binfo,
   "SKRIPT",$id_global_skript,
   "USER_ID",$id_global_userid,
   "HOST",$id_global_remotehost,
   "VERSANDKOSTEN",$id_global_versandkosten,
   "VERSANDKOSTEN_FREI_AB",$id_global_versandkfreiab,
   "GESAMTSUMME",$id_global_sumall,
   "GESAMTSUMME_VERSAND",$id_global_sumallv,
   "HIT_START",$id_global_hit_start,
   "HIT_END",$id_global_hit_end,
   "HIT_MAX",$id_global_hit_max,
   "HIT_MENU",$id_global_hit_menu,
   "HIT_FORWARD",$id_global_hit_forward,
   "HIT_BACK",$id_global_hit_back,
   "ARTIKEL_ANZ",$id_global_artikel_anz,
   "CONTENT",$id_global_content,
   "PORTO_AUSWAHL",$id_global_porto_auswahl,
   "PORTO",$id_global_porto,
   "ERROR_INHALT",$id_global_error,
   "REFERER",$id_global_referer,
   "SHOPEMAIL",$id_global_shopemail,
   "MIN_ORDER",$id_global_min_order,
   "MIN_ORDER_ZUSCHLAG",$id_global_min_order_zuschlag,
   "QUERY",$id_global_query,
   "HAPPY_HOUR",$id_global_happy_hour,
   "PROVISION",$id_global_provison,
   "BONUS_NR",$id_global_bonus_nr,
   "BONUS_PASS",$id_global_bonus_pass,
   "BONUS_VALUE",$id_global_bonus_value,
   "BONUS_EMAIL",$id_global_bonus_email,
   "BONUS_MESSAGE",$id_global_bonus_message,
   "ORDERNR",$id_global_ordernr,
   "ORDERKEY",0,
   "ORDERVALUE",1,
   "RORDER_DATE",$id_order_date,
   "RORDER_SUM",$id_order_sum,
   "RORDER_ORDERNR",$id_order_ordernr,
   "RORDER_PROVISION",$id_order_provision,
   "RORDER_STATUS",$id_order_status,
   "RORDER_PID",$id_order_pid,
);

for ($i=0;$i<=$#pichttp;$i++) {
   $j=$i+1;
   $multi{"PIC$j"}=5;
   $index{"PIC$j"}=$last_id_global+$j;
   $global[$last_id_global+$j]=$pichttp[$i];
}

if ($ENV{'REQUEST_METHOD'} eq "GET") { $buffer = $ENV{'QUERY_STRING'}; }
else { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});  }

if (!($buffer)) {$buffer=substr($ENV{'PATH_INFO'},1,length($ENV{'PATH_INFO'}));}
if (!($buffer)) {$buffer=@ARGV; }


for ($i=0;$i<=$#keyw;$i++) {                                # Reservierte Keywoerter suchen
  if ($keyw[$i] eq "NR")     {$id_article_id=$i;}           # Art. Nr
  elsif ($keyw[$i] eq "PREIS")   {$id_article_costs=$i;}    # Preis
  $multi{$keyw[$i]}=1;                                      # Typ speichern, immer "1"
  $index{$keyw[$i]}=$i;                                     # Feldindex speichern
}

for ($i=0;$i<=$#userf;$i++) {                               # Reservierte Keywoerter suchen
 $uindex{$userf[$i]}=$i;                                    # Feldindex speichern
}
for ($i=0;$i<=$#puserf;$i++) {                              # Reservierte Keywoerter suchen
 $pindex{$puserf[$i]}=$i;                                   # Feldindex speichern
}


$ip=$ENV{'REMOTE_ADDR'};if ($ip=~/\:/) {$ip=&ipv6_to_ipv4($ip);$ENV{'REMOTE_ADDR'}=$ip;}$ip=~s/unknown, //g;if ($ip=~/unknown/) {$ip="127.0.0.1";}
if ($ENV{'HTTP_X_FORWARDED_FOR'} ne "") {$ip=$ENV{'HTTP_X_FORWARDED_FOR'};}
if ($input{"ip"} ne "") {$ip=$input{"ip"};}
@ips=split(/\./,$ip);
$first=$ips[0];
$second=$ips[1];
$kundedat=$profiledirectory."/$first/$second.dat";


$ENV{"SERVER_NAME"}="www.shop.baudienst.com";
@kunde_dat=&read_data($kundedat);                           # Einlesen der Kundendaten

$#nvpairs=-1;                                                         # Paare leeren
($now_tage,$now_minuten,$mday,$month,$year,$hour,$minute)=&now;       # Berechnung absoluter Tage und aktueller Minuten

if ($ENV{CONTENT_TYPE}=~/multipart\/form-data/i) {
   ($content,$ufile)=&Parse_Multi;
    if ($content ne "") {
     $ufile=&get_file($ufile);
   }
} else {
  $buffer=&ReadParse($buffer,*input);                                   # Einlesen der Formulareingaben
}

if ($input{"t"} eq "a_preis") {
  print "Content-Type: text/html\n\n";
  @a=&read_data("./daten/artalle.csv");$c=$input{"c"};
  foreach $a (@a) {
    @d=split(/\;/,$a);
    if ($d[1]=~/$c/) {
$preis=$d[4];
print qq!<table border="0" width="100%" cellspacing="0" cellpadding="0">
<tr>
<td>
<table border="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td>
</td>
</tr>
<tr>
<td valign="center" nowrap>
<p class="script4" align="center">$preis</p>
</td>
</tr>
</table>
		</td>
		</tr>
	</table>!;


    }
  }
   exit;
}



if (($buffer=~/\&\&/ || $buffer=~/hcounter/) && $ENV{'REQUEST_METHOD'} eq "GET") {
  $newurl="https://shop.baudienst.com/";
  print "Status: 301 Moved Permanently\n";print "Location: $newurl\n\n";exit;

}

#print "Content-Type: text/html\n\n";
#print $buffer."\n\n";

$ianz=0;
foreach $key (sort(keys %input)) {$ianz++;}
$#article_dat=-1;
if ($input{"t"} ne "warenkorb_artikel_extern" || $ianz>1) {
if ($input{"db"} eq "" || 1==1) {
  foreach $all_dbs (@all_dbs) {
    $articledat=$datadirectory.$all_dbs;
    @import=&read_data($articledat);
    shift(@import);
    push(@article_dat,@import);
  }
} else {
  @dblist=split(/\,/,$input{"db"});
  foreach $dblist (@dblist) {
    $articledat=$datadirectory.$dblist;                   # Artikel-Datenbank
    @a=&read_data($articledat);                       # Artikel holen
    shift(@a);
    push(@article_dat,@a);
  }
}
}

foreach $article_dat (@article_dat) {
  @d=split(/$trennzeichen/,$article_dat);
  $adata{$d[$index{"NR"}]}=$article_dat;
}

if ($input{"email"} ne "" || $input{"angebot_email"} ne "") {
  if ($input{"email"}=~/mib-hamburg\.de/i) {exit;}
 if ($input{"angebot_email"}=~/mib-hamburg\.de/i) {exit;}

}

$global[$id_global_artikel_anz]=$#article_dat+1;


$#nvpairs=-1;                                                         # Paare leeren
($now_tage,$now_minuten,$mday,$month,$year,$hour,$minute)=&now;       # Berechnung absoluter Tage und aktueller Minuten

%input=();

@happy=&read_data($datadirectory."happy.txt");
@happy_today=split(/\,/,$happy[$mday]);
foreach $happy_today (@happy_today) {
  if ($happy_today==$hour) {
    $global[$id_global_happy_hour]=$happy_today;
  }
}
                                                 # leerer Input

if ($ENV{CONTENT_TYPE}=~/multipart\/form-data/i) {
   ($content,$ufile)=&Parse_Multi;
    if ($content ne "") {
     $ufile=&get_file($ufile);
   }
} else {
  $buffer=&ReadParse($buffer,*input);                                   # Einlesen der Formulareingaben
}

#print "Content-Type: text/html\n\n";
#print $buffer;


if ($input{"token"} ne "" && $input{"PayerID"} ne "" && $input{"send_order"} eq "") {
  &paypal_checkout;
}
if ($input{"token"} ne "" && $input{"PayerID"} eq "" && $input{"send_order"} eq "") {
  &paypal_checkout;  # bei Abbruch auch checkout verwenden
}


$process_id=$$;
$input{"PROCESS_ID"}=$process_id;

#$input{"t"}="temdd";
#$input{"f2"}="PREIS";
#$input{"c2"}="";
#$input{"f1"}="*NAME";
#$input{"c1"}="epson";
#$input{"f"}="HERSTELLER";
#$input{"c"}="";
#$input{"t"}="temgroup";

foreach $key (sort(keys %input)) {
 if ($key=~/ZAHLUNG_(.*).x/) {
     $input{"ZAHLUNGSTYP"}=$1;$buffer.="&ZAHLUNGSTYP=".&url_encode($1);
  }
}
if ($input{"TELEFON1REST"} ne "" || $input{"TELEFON1PRE"} ne "" || $input{"TELEFON1VORWAHL"} ne "") {
  $input{"U_TELEFON1REST"}=$input{"TELEFON1REST"};$input{"U_TELEFON1PRE"}=$input{"TELEFON1PRE"};$input{"U_TELEFON1VORWAHL"}=$input{"TELEFON1VORWAHL"};
  $input{"TELEFON1"}=$input{"TELEFON1PRE"}." ".$input{"TELEFON1VORWAHL"}." ".$input{"TELEFON1REST"};
  $input{"TELEFON1"}=~s/^(\s+)//g;
}  
if ($input{"FAX1REST"} ne "" || $input{"FAX1PRE"} ne "" || $input{"FAX1VORWAHL"} ne "") {
  $input{"U_FAX1REST"}=$input{"FAX1REST"};$input{"U_FAX1PRE"}=$input{"FAX1PRE"};$input{"U_FAX1VORWAHL"}=$input{"FAX1VORWAHL"}; 
  $input{"FAX1"}=$input{"FAX1PRE"}." ".$input{"FAX1VORWAHL"}." ".$input{"FAX1REST"};
  $input{"FAX1"}=~s/^(\s+)//g;
}  
if ($input{"TELEFON2REST"} ne "" || $input{"TELEFON2PRE"} ne "" || $input{"TELEFON2VORWAHL"} ne "") {
  $input{"U_TELEFON2REST"}=$input{"TELEFON2REST"};$input{"U_TELEFON2PRE"}=$input{"TELEFON2PRE"};$input{"U_TELEFON2VORWAHL"}=$input{"TELEFON2VORWAHL"}; 
  $input{"TELEFON2"}=$input{"TELEFON2PRE"}." ".$input{"TELEFON2VORWAHL"}." ".$input{"TELEFON2REST"};
  $input{"TELEFON2"}=~s/^(\s+)//g;
}  
if ($input{"FAX2REST"} ne "" || $input{"FAX2PRE"} ne "" || $input{"FAX2VORWAHL"} ne "") {
  $input{"U_FAX2REST"}=$input{"FAX2REST"};$input{"U_FAX2PRE"}=$input{"FAX2PRE"};$input{"U_FAX2VORWAHL"}=$input{"FAX2VORWAHL"}; 
  $input{"FAX2"}=$input{"FAX2PRE"}." ".$input{"FAX2VORWAHL"}." ".$input{"FAX2REST"};
  $input{"FAX2"}=~s/^(\s+)//g;
}  


if ($input{"eref"} ne "") {
  $userid=$input{"userid"};$orderid=$input{"eref"};@h=split(/\-/,$orderid);if ($h[1] ne "") {$orderid=$h[1];}		# z.B. 20140317-17603
  @l=&read_data("../hws-temp/temporder/${userid}_$orderid.txt");
  @basket_dat=&read_data("../hws-temp/temporder/${userid}_$orderid.basket");
  @basket=&format_warenkorb; 
  $buffer=$l[0];
  $buffer=~s/saferpay_init\=1//g;
  $buffer=~s/send_order=1//g;
  $buffer=~s/t=temsend/t=tempayone_failed/g;
  $buffer=&ReadParse2;
}


$basket_loaded=0;
if ($input{"ref"} ne "") {
  $userid=$input{"userid"};$orderid=$input{"ref"};@h=split(/\-/,$orderid);if ($h[1] ne "") {$orderid=$h[1];}		# z.B. 20140317-17603
  @l=&read_data("../hws-temp/temporder/${userid}_$orderid.txt");
  @basket_dat=&read_data("../hws-temp/temporder/${userid}_$orderid.basket");
  @basket=&format_warenkorb; 
  if (&exist("../hws-temp/temporder/${userid}_$orderid.ok")) {&output_order;exit;}
  open(f,">../hws-temp/temporder/${userid}_$orderid.ok");
  print f "ok"; 
  close(f);
  $buffer=$l[0];
  $buffer=~s/saferpay_init\=1/send_order\=1/g;
  $buffer=~s/t\=temsaferpay_english/t\=temsend_english/g;
  $buffer=~s/t\=temsaferpay//g;
  $buffer=&ReadParse2;
  $fix_orderid=$orderid;
  $basket_loaded=1;
}
if ($input{"DATA"} ne "" && $input{"SIGNATURE"} ne "") {
 
  open(f,">>buflog.txt");
  print f qq!$mday.$month.$year|$input{"DATA"}|$input{"SIGNATURE"}\n!;
  close(f);


  $orderid=$input{"DATA"};
  $orderid=~/ORDERID\=\"(.*?)\"/;
  $orderid=$1;
  $userid=$1;
  $orderid=~s/(.*?)\-//g;
  $userid=~s/\-(.*)//g;
  
 
  $check_amount=$input{"DATA"};
  $check_amount=~/AMOUNT\=\"(.*?)\"/;
  $check_amount=$1;

  $gateway_success="https://saferpay.com/hosting/VerifyPayConfirm.asp";
  $attributes=qq!DATA=$input{"DATA"}&SIGNATURE=$input{"SIGNATURE"}!;
  $url="$gateway_success?$attributes";
  $ok=0;
  for ($i=1;$i<=3;$i++) {
    if ($ok==0) {
      $payverify_url=&get_url($url);
      $payverify_url=~s/\n//g;
      if ($payverify_url=~/^OK:/) {
        $ok=1;
      } else {
        open(f,">>saferpay_error.txt");
        print f $payverify_url."\n";
        close(f);
      }
    }
  }
  @l=&read_data("../hws-temp/temporder/${userid}_$orderid.txt");
  @basket_dat=&read_data("../hws-temp/temporder/${userid}_$orderid.basket");
  @basket=&format_warenkorb;  
  $buffer=$l[0];
  $buffer=~s/saferpay_init\=1/send_order\=1/g;
  $buffer=~s/t\=temsaferpay_english/t\=temsend_english/g;
  $buffer=~s/t\=temsaferpay//g;
  $buffer=&ReadParse2;

  if (&exist("../hws-temp/temporder/$orderid.ok")) {
#    &abbruch("Ihre Bestellung wurde bereits erfolgreich abgeschickt.");
  }

  open(f,">../hws-temp/temporder/$orderid.ok");
  print f "ja";
  close(f);
  $fix_orderid=$orderid;
  $basket_loaded=1;

}

$#basket_dat_new=-1;                                                  # leerer Array für neu in den Warenkorb gelegte Artikel

# Bereitgestellte Funktionen im Partnerprogramm-Modul
if ($input{"pid"} ne "") {
  $buffer.="&G_pid=".$input{"pid"};
  $input{"G_pid"}=&login_puser($input{"pid"});
}

# Speichern von globalen Variablen
@keyval=&get_input($buffer);

foreach $keyval (@keyval) {
  @field=split(/\;/,$keyval);                             # Felder ermitteln
  if ($field[0]=~/^G_(.*)/) {
    $global{$field[0]}=$field[1];
  }
}


if ($CGI{"update"} ne "") {
  &pic_update($CGI{"update"},$content,$ufile,$CGI{"pass"});exit;
}

$REMOTE_HOST=$ENV{'REMOTE_ADDR'};                           # Remote Host ermitteln
if ($ENV{'HTTP_X_FORWARDED_FOR'} ne "") {$REMOTE_HOST=$ENV{'HTTP_X_FORWARDED_FOR'};}


if ($ENV{'HTTP_REFERER'}=~/\.shtml/ || ($ENV{'HTTP_REFERER'}=~/t=s1/ && $ENV{'HTTP_REFERER'}!~/start=/)) {$e=$ENV{'HTTP_REFERER'};$e=~s/=/´/g;$input{"G_REFERER"}=$e;$global{"G_REFERER"}=$e;}

$global[$id_global_remotehost]=$REMOTE_HOST.'#'.$ENV{'HTTP_VIA'}.'#'.$ENV{'REMOTE_HOST'}.'#'.$ENV{'HTTP_USER_AGENT'};  # Zur Identifik. Remote Host und HTTP Via (proxys) verwenden
$global[$id_global_remotehost]=~s/\;/\,/g;
$global[$id_global_userid]=int(&get_user_id);                    # User-Id
$global[$id_global_versandkosten]=$versandk_hoehe;          # Versandkosten
$global[$id_global_versandkfreiab]=$versandk_frei_ab;       # Freibetrag fuer Versandkosten
$global[$id_global_skript]=$shoppl;                         # Name des Skripts
$global[$id_global_referer]=$ENV{'HTTP_REFERER'};
$global[$id_global_shopemail]=$email;
$global[$id_global_min_order]=$min_order;
$global[$id_global_min_order_zuschlag]=$min_order_zuschlag;
$global[$id_global_query]=$buffer;





$basketdat=&get_basketdat($global[$id_global_userid]);      # Name des Warenkorbs des Kunden ermitteln
if ($basket_loaded==0) {
  @basket_dat=&read_data($basketdat);                         # Warenkorb des Kunden einlesen
}
$#basket_dat_new=-1;                                        # Leeren Warenkorb für "neu in den Warenkorb gelegte Artikel"
if ($dif_porto!=0) {                                        # Falls Versandk. vom Kunden auswählbar...
  $portodat=&get_portodat($global[$id_global_userid]);      # Name des Files ermitteln, in dem die Versandk. gespeichert sind
  @porto=&read_data($portodat);                             # Daten einlesen
  $porto=$porto[0];                                         # Versandk.art = 1. Zeile
}



##########
## Gutschein
   if ($input{"AddBonus"}==1) {
      if ($input{"EmailFromBonus"}!~/^([a-zA-Z0-9\-\.\_]+)@([a-zA-Z0-9\-\.\_]+\.[a-zA-Z]+)$/) {
        &abbruch("Die E-Mail des Gutschein Ausstellers ist in einer ung&uuml;ltigen Form angegeben.");
      }
      if ($input{"EmailToBonus"}!~/^([a-zA-Z0-9\-\.\_]+)@([a-zA-Z0-9\-\.\_]+\.[a-zA-Z]+)$/) {
        &abbruch("Die E-Mail des Gutschein Empf&auml;ngers ist in einer ung&uuml;ltigen Form angegeben.");
      }
      $input{"EmailTextBonus"}=~ s/\cM\n/<br>/g;
      $gutschein_nr=&create_gutschein;
      $gutschein_wert=$input{"SumBonus"};
      $gutschein_pass="";
      $gutschein_bezahlt=0;
      $gutschein_ausgeloest=0;
      $gutschein_bestellt=0;
      $gutschein_absender=$input{"EmailFromBonus"};
      $gutschein_empfaenger=$input{"EmailToBonus"};
      $gutschein_text=$input{"EmailTextBonus"};
      $gutschein_aktiontyp=$input{"gutschein_aktiontyp"};
      $gutschein_aktionvon=$input{"gutschein_aktionvon"};
      $gutschein_aktionbis=$input{"gutschein_aktionbis"};
      &add_gutschein_to_db($gutschein_nr,$gutschein_wert,$gutschein_pass,$gutschein_bezahlt,$gutschein_ausgeloest,$gutschein_bestellt,$gutschein_absender,$gutschein_empfaenger,$gutschein_text);
      push(@keyval,join(';',"add_NR","G_".$gutschein_nr));
      push(@keyval,join(';',"add_MENGE",1));
      push(@keyval,join(';',"add_PREIS",$input{"SumBonus"}));      
   }

   if ($input{"UseBonusNr"} ne "") {
      $input{"UseBonusNr"}=~y/a-z/A-Z/;
      $gutschein_nr=$input{"UseBonusNr"};
      $check_process_order=1; &process_order;$process_order_ok=0;$check_process_order=0;

      ($gutschein_nr,$gutschein_wert,$gutschein_pass,$gutschein_bezahlt,$gutschein_ausgeloest,$gutschein_bestellt,$gutschein_absender,$gutschein_empfaenger,$gutschein_text,$gutschein_ordermin,$gutschein_gueltigkeit)=&get_gutschein_pass($gutschein_nr);
      if ($gutschein_gueltigkeit ne "") {
        ($gtag,$gmonat,$gjahr)=split(/\./,$gutschein_gueltigkeit);
        if ($gjahr<100) {$gjahr+=2000;} 
        $gtage=&jday($gmonat,$gtag,$gjahr)-$start_tage;
        if ($gtage<$now_tage) {&abbruch("Der Gutschein ist nur bis zum $gutschein_gueltigkeit g&uuml;ltig.");}
       }      

      if ($gutschein_nr eq "-1") {&abbruch("Diese Gutschein Nr. existiert nicht.")}
      if ($gutschein_bezahlt==0) {&abbruch("Der Gutschein $gutschein_nr ist noch nicht bezahlt.")}
      if ($gutschein_ausgeloest>0) {&abbruch("Der Gutschein $gutschein_nr ist bereits ausgelöst.")}
      @basket=&format_warenkorb();
      if ($global[$id_global_sumall]<$gutschein_ordermin) {
        &abbruch("Der Gutschein $gutschein_nr erfordert einen Mindestbestellwert von ".&format_sum($gutschein_ordermin)." EUR (im Warenkorb sind aktuell: ".&format_sum($global[$id_global_sumall])." EUR) . Bitte erh&ouml;hen Sie den Bestellwert, oder entfernen Sie den Gutschein aus dem Warenkorb.");
      }

      push(@keyval,join(';',"add_NAME","Gutschein ".$input{"UseBonusNr"}." einlösen"));
    
      push(@keyval,join(';',"add_NR","GE_".$input{"UseBonusNr"}));
      push(@keyval,join(';',"add_MENGE",1));
      push(@keyval,join(';',"add_PREIS",-$gutschein_wert));
   }


if ( ($input{"pass"} eq "" || $input{"send_orderreminder"} ne "") && $input{"admin"} eq "" && $input{"geraete_upload"} eq "") {
  if (length($mday)==1) {$mday="0".$mday;}
  if (length($month)==1) {$month="0".$month;}

  ($sec,$xmin,$xhour,$xmday,$xmonth,$xyear,$xwday,$xyday,$xisdst)=localtime(time);$banz=$#basket_dat+1;$bpreis=0;
  foreach $basket_dat (@basket_dat) {
    @d=split(/\;/,$basket_dat);
    $bpreis+=$d[$id_article_costs]*$d[$id_article_quantity];
  }
  open(f,">>../hws-temp/logall/$year-$month-$mday.txt");
  print f "$mday.$month.$year $hour:$minute:$sec;$global[$id_global_userid];$buffer;$global[$id_global_remotehost];$banz;$bpreis;".$ENV{"REQUEST_URI"}."\n";
  close(f);
}

if ($input{"pic_show"}==1) {&pic_show_or_kill(0);exit}
if ($input{"pic_kill"}==1) {&pic_show_or_kill(1);exit}
if ($input{"empty"} ne "") {unlink "$basketdat";$#basket_dat=-1}

if ($input{"required"} ne "") {
   &kontrolliere_required;                                   # benötigte Felder kontrollieren
}

if (defined($input{"u_login"})) {                           # Falls Login....
  &kunde_login($input{"u_login"},$input{"u_pass"});         # Funktion kunde_login aufrufen!
}

if (defined($input{"p_login"})) {                           # Falls Login....
  &partner_login($input{"p_login"},$input{"p_pass"});         # Funktion kunde_login aufrufen!
}


@glob=&read_data($globaltxt);
foreach $glob (@glob) {
  @d=split(/\;/,$glob);
  $input{"G_$d[0]"}=$d[1];
}
if ($year>=2021) {$input{"G_MWST"}=19;$global{"G_MWST"}=19;}

# Bereitgestellte Funktionen im Kunden-Modul
if ($input{"setkundencookie"}>0) {
   &set_kunden_cookie($input{"setkundencookie"});
}


if ($input{"send_pw_login"} ne "" || $input{"send_pw_email"} ne "") {&send_pw($input{"send_pw_login"},$input{"send_pw_email"});}
if ($input{"deletekundencookie"}==1) {&delete_kunden_cookie;}
if ($input{"readkundencookie"}==1) {&read_kunden_cookie;}

if ($input{"kunde_admin"} ne "" && $input{"pass"} eq $admin_passwort) {&kunde_admin;}
if ($input{"kunde_edit"} ne "" && $input{"pass"} eq $admin_passwort) {&kunde_edit($input{"kunde_edit"})}
if ($input{"kunde_new"} ne "" && $input{"pass"} eq $admin_passwort) {&kunde_new;}



if ($input{"adduser"}==1)   {                               # Anmeldung eines neuen Kunden
   &adduser;
}
if ($input{"deleteuser"}==1) {                              # Kunde löschen
   &deleteuser;
}
if ($input{"edituser"}==1) {                                # Kunde editieren
   &edituser;
}
if ($input{"logout"}==1)   {                                # Kunde Logout
   &logout;
}
if ($input{"adduser_partner"}==1)   {&adduser_partner;}
if ($input{"deleteuser_partner"}==1) {&deleteuser_partner;}
if ($input{"edituser_partner"}==1) {&edituser_partner;}
if ($input{"logout_partner"}==1)   {&logout_partner;}


srand(time);
if (int(rand(1000))==1) {


  opendir (VERZ, "../hws-temp/logall/");
  @datei= grep (!/^\.\.?$/, readdir VERZ);
  closedir VERZ;
  foreach $datei (@datei) {
    if ($datei!~/.txt/) {next;} 
    $age=-M "../hws-temp/logall/".$datei;
    if ($age>30) {
      unlink "../hws-temp/logall/".$datei;
    }
  }


  opendir (VERZ, "../hws-temp/temporder/");
  @datei= grep (!/^\.\.?$/, readdir VERZ);
  closedir VERZ;
  foreach $datei (@datei) {
    if ($datei!~/.dat/ && $datei!~/.txt/  && $datei!~/.ok/  && $datei!~/.basket/) {next;} 
    $age=-M "../hws-temp/temporder/".$datei;
    if ($age>30*3) {
      unlink "../hws-temp/temporder/".$datei;
    }
  }


  opendir (VERZ, "$profiledirectory");
  @datei= grep (!/^\.\.?$/, readdir VERZ);
  closedir VERZ;
  foreach $datei (@datei) {
    if ($datei!~/.dat/ && $datei!~/.txt/)  {next;} 
    $age=-M $profiledirectory.$datei;
    if ($age>0.5) {
      unlink $profiledirectory.$datei;
    }
  }

  for ($i=0;$i<=255;$i++) {
    opendir (VERZ, "$profiledirectory".$i."/");
    @datei= grep (!/^\.\.?$/, readdir VERZ);
    closedir VERZ;
    foreach $datei (@datei) {
      if ($datei!~/.dat/ && $datei!~/.txt/) {next;} 
      $age=-M $profiledirectory.$i."/".$datei;
      if ($age>1) {
       unlink $profiledirectory.$i."/".$datei;
      }
    }
 }

}

if ($input{"update"} ne "") {&update($input{"update"},$input{"pass"})}
if ($input{"admindelete"} ne "") {&admindelete($input{"pass"});}
if ($input{"add_to_db"} ne "") {&add_to_db($input{"add_to_db"})}
if ($input{"admin"} eq $admin_passwort && $admin_passwort ne "") {&admin;}

if ($input{"show_prov"} ne "") {

   $code=qq!<html><body><h1>Partner-Bestellungen in $input{"month"}/$input{"year"}</h1>!;
   $code.="<table width=800><tr><td>Datum</td><td>Nr</td><td>Status</td><td>Summe</td><td>Provis.</td><td>Beschreibung</td><td>PID</td></tr>";
   $code.="[REPEAT_RORDER]";
   $code.="<tr><td>[RORDER_DATE]</td><td>[IF_('[RORDER_ORDERNR]'>0)][RORDER_ORDERNR][IF_END]</td><td>[RORDER_STATUS]</td><td>[RORDER_SUM]</td><td>[PRINTF([RORDER_SUM]*[RORDER_PROVISION]/100)]</td><td>[IF_('[RORDER_ORDERNR]' eq '-')]Gutschrift[IF_END][IF_('[RORDER_ORDERNR]' ne '-')][RORDER_ORDERNR][IF_END]</td><td>[RORDER_PID]</td></tr>";
   $code.="[REPEAT_RORDER_END]";
   $code.="</table><p>";

    if ($input{"show_prov_pid"} eq "ALL") {
     $all_partner="ALL";
   } else  {
     $all_partner=$input{"show_prov_pid"};
   }
   print "Content-type: text/html\n\n";
   print &parse_line($code);
   exit;
}


if ($input{"pay_partner"} ne "") {
  if ($input{"pass"} ne $admin_passwort) {&abbruch("Falsches Passwort");}
  &pay_partner($input{"pay_partner"},$input{"sum_pay_partner"});
}
if ($input{"correct_prov"} ne "") {
  if ($input{"pass"} ne $admin_passwort) {&abbruch("Falsches Passwort");}
  &pay_partner($input{"correct_prov"},&format_sum($input{"minus_prov"}*$partner_provision/100),$input{"reason_prov"});
}

if ($input{"status_ordernr"} ne "") {
  if ($input{"pass"} ne $admin_passwort) {&abbruch("Falsches Passwort");}
  &set_status($input{"status_ordernr"},$input{"new_status"});
}
if ($input{"merke"} ne "" || $input{"merke_delete"} ne "") {&merke($input{"merke"},$input{"merke_delete"});}

if ($input{"ChangeBonusStatNr"} ne "") {
  &change_gutschein_status($input{"pass"},$input{"ChangeBonusStatNr"},$input{"BonusBezahlt"},$input{"BonusEingeloest"});
}
if ($input{"show_gutschein_text"} ne "") {&show_gutschein_text($input{"show_gutschein_text"});}
if ($input{"gutschein_verwaltung"} eq $admin_passwort) {
 &gutschein_verwaltung($input{"gutschein_nr"},$input{"gutschein_bezahlt"},$input{"gutschein_ausgeloest"},$input{"create_promo_gutschein"},$input{"gutschein_wert"},$input{"gutschein_ordermin"},$input{"gutschein_ausgeloest"},$input{"gutschein_gueltigkeit"});
}

if ($input{"mailangebot"} ne "") {$input{"t"}="mailangebot";}



# PAYPAL CODE
if ( $input{"t"}=~/temsaferpay/i) {
  &process_order; 
  &paypal_redirect; 
}
if ( ($input{"Paypal"} ne "" || $input{"ZAHLUNGSTYP"}=~/Paypal/i) && $input{"token"} eq "" && $input{"send_order"} ne "" && 1==1) {
  &process_order; 
  &paypal_redirect; 
}
if ($input{"token"} ne "" && $input{"PayerID"} ne "" && $input{"send_order"} ne "") {
  &process_order; 
  &paypal_send_order;
}



if ($input{"spid"} ne "") {
   
  @oldbuf=&read_data("../hws-temp/temporder/$global[$id_global_userid]_".$input{"spid"}.".txt");
  $buffer=$oldbuf[0];
  $buffer=~s/saferpay_init\=1//g;
  $buffer=~s/send_order\=1//g;
  $buffer=~s/ZAHLUNGSTYP/xxx/g;
  $buffer=&ReadParse2;
  $input{"t"}="temsaferpay_failed";

}

if ( ($input{"ZAHLUNGSTYP"}=~/Kreditkarte/ || $input{"ZAHLUNGSTYP"}=~/Online-Überweisung/  || $input{"ZAHLUNGSTYP"}=~/Giropay/  || $input{"ZAHLUNGSTYP"}=~/Sofort/  || $input{"ZAHLUNG_Online-Überweisung.x"} ne "") && $input{"DATA"} eq "" && $input{"order_neu"}==1 && $input{"ref"} eq "" && $input{"eref"} eq "") { 

  &process_order; 
  &paypal_redirect;exit;

  $input{"saferpay_init"}=1;$input{"send_order"}="";$input{"t"}="temsaferpay";


    if ($input{"ZAHLUNGSTYP"}=~/Kreditkarte/ && $input{"ZAHLUNGSTYP"}!~/Maestro/) {$input{"t"}="tempayone_kk";}   
    if ($input{"ZAHLUNGSTYP"}=~/Sofort/) {$input{"t"}="tempayone_su";}
    if ($input{"ZAHLUNGSTYP"}=~/Online-Überweisung/) {$input{"t"}="tempayone_gp";}    
    if ($input{"ZAHLUNGSTYP"} eq "PayPal") {$input{"t"}="tempayone_pp";}

  if ($input{"FIRMA1"}=~/Mustermann/i || $input{"NAME1"}=~/Mustermann/i) {
    $input{"t"}="ztempayone_kk";
  }

}
if ($input{"saferpay_init"} ne "" && $input{"DATA"} eq "") {
  &process_order;
  $gateway="https://saferpay.com/hosting/CreatePayInit.asp";

  $kunde_email=$input{"email"};                                         # E-Mail auf korrekte Form testen
  $kunde_email=~s/^(\s+)//g;$kunde_email=~s/(\s+)$//g;
  if ($kunde_email!~/^([a-zA-Z0-9\-\.\_]+)@([a-zA-Z0-9\-\.\_]+\.[a-zA-Z]+)$/) {
    if ($kunde_email ne "") {                                           # Falls keine leere Mail
	      &abbruch(qq!Die <B>E-Mail</B> wurde in einer falschen Form oder unvollst&auml;ndig angegeben. Bitte kontrollieren Sie Ihren Eintrag im Feld <B>E-Mail</B>. Wenn Sie keine E-Mail haben, lassen Sie das Feld bitte komplett leer!);
    }
  }
  @basket=&format_warenkorb;  
  if ($global[$id_global_sumall]==0) {
    &abbruch("Es befinden sich keine Artikel im Warenkorb. Ggf. haben Sie die Bestellung bereits abgeschickt. Bitte kontrollieren Sie, ob Sie per Mail eine Bestätigung erhalten haben.");
  } 
  if (length($input{"Gkarte_text"})>160) {
    &abbruch("Die Geschenkkarte darf maximal 160 Zeichen enthalten. Sie haben aber ".length($input{"Gkarte_text"})." Zeichen eingegeben.");
  }

 if (length($month)==1) {$month="0".$month;}
 if (length($mday)==1) {$mday="0".$mday;}


  @o=&read_data("$datadirectory"."order.dat");
  $o[0]++;
  $global[$id_global_ordernr]=$o[0];
  open(f,">$datadirectory"."order.dat");
  print f "$o[0]";
  close(f);
  if (length($mday)==1) {$mday="0".$mday;}
  if (length($month)==1) {$month="0".$month;}
  $input{"refnr"}="$year$month$mday-".$global[$id_global_ordernr];


  $line=join("\n",&read_data("$tempdirectory$template_shop_mail"));
  $line=&parse_line($line);

  
    $kunde_mail=$input{"email"};$subject_shop_mail='Nachricht: Weiterleitung zu Payone [IF_(($now_tage,$now_minuten,$mday,$month,$year,$hour,$minute)=&now)][IF_END][IF_(length($month)==1)][$month="0".$month][IF_END][IF_(length($mday)==1)][$mday="0".$mday][IF_END][PRINT($year)][PRINT($month)][PRINT($mday)]-[ORDERNR] '.$input{"BESTELLER_VORNAME"}." ".$input{"BESTELLER"};
   $subject_shop_mail=&parse_line($subject_shop_mail);
#    open (MAIL, "|$mailprog -t") || &abbruch("Fehler beim Versenden der Mails &uuml;ber Sendmail");
#    print MAIL qq!To: $email\n!;   
#    print MAIL qq!From: $kunde_email\n!;
 #   print MAIL qq!Subject: $subject_shop_mail\n!;
##    print MAIL qq!Content-Type: text/html\n\n!;   
#    print MAIL $line."\n";
#    close (MAIL);


  open(f,">../hws-temp/temporder/$global[$id_global_userid]_$global[$id_global_ordernr].txt");
  print f $buffer;
  close(f);
  $accountid=$saferpay_accountid;
  $orderid="$global[$id_global_userid]-$year$month$mday-$global[$id_global_ordernr]";


  open(f,">../hws-temp/temporder/$global[$id_global_userid]_$global[$id_global_ordernr].basket");
  foreach $basket_dat (@basket_dat){ 
    print f "$basket_dat\n";
  }
  close(f);  



  $amount=$HIS_SCRIPTendsumme_kreditkarte*100;
  if ($input{"ZAHLUNGSTYP"}=~/Visa/i) { $amount=$HIS_SCRIPTendsumme_visa*100;}
  if ($input{"ZAHLUNGSTYP"}=~/Mastercard/i) { $amount=$HIS_SCRIPTendsumme_mastercard*100;}
  if ($input{"ZAHLUNGSTYP"}=~/berweisung/i) { $amount=$HIS_SCRIPTendsumme_ou*100;}
  if ($input{"ZAHLUNGSTYP"}=~/maestro/i) { $amount=$HIS_SCRIPTendsumme_maestro*100;}


  $currency="EUR";
  $description="Bestellung www.shop.baudienst.com - ".$input{"TELEFON1"}." - ".$input{"NAME1"}." - ".$input{"email"};

  $successlink=$saferpay_ok;
  $faillink=$saferpay_failed."&spid=".$global[$id_global_ordernr];
  $backlink=$saferpay_failed."&spid=".$global[$id_global_ordernr];
  $faillink="https://shop.baudienst.com/cgi-bin/hws/his-webshop.pl?spid=".$global[$id_global_ordernr];
  $backlink="https://shop.baudienst.com/cgi-bin/hws/his-webshop.pl?spid=".$global[$id_global_ordernr];
  $attributes="ORDERID=$orderid&ACCOUNTID=$accountid&AMOUNT=$amount&CURRENCY=$currency&DESCRIPTION=".&url_encode(encode_entities($description))."&SUCCESSLINK=$successlink&FAILLINK=$faillink&BACKLINK=$backlink&NOTIFYADDRESS=$saferpay_email";



  if ($input{"t"} eq "temsaferpay_english") {$attributes.="&LANGID=en";}
  $url="$gateway?$attributes";


#  $payinit_url=&get_url($url);
  $payinit_url=~s/\n//g;
  $input{"SAFERPAY_URL"}=$payinit_url;

}

if ($input{"show_session"} ne "" && $input{"pass"} eq $admin_passwort) {&show_session($input{"show_session"});}
if ($input{"kaufabbruch"} ne "" && $input{"pass"} eq $admin_passwort) {&kaufabbruch($input{"kaufabbruch"});}
if ($input{"send_kaufabbruch"} ne "") {&send_kaufabbruch;}


if ($input{"send_order"}) {                                 # Falls Aktion "Mail verschicken"
  &process_order;
  
  &send_mail;                                               # Mails versenden
  &output_order;                                            # Nachricht ausgeben
  exit;

} elsif ($input{"order1"} ne "" || $input{"order1.x"} ne "") {                                # Falls Aktion "Bestellseite"
  &special_request("","","temorder1");                  # Bestellungsseite ausgeben
} elsif ($input{"order"} ne "" || $input{"order.x"} ne "") {                                # Falls Aktion "Bestellseite"
  &special_request("","",$template_order);                  # Bestellungsseite ausgeben
} else {
  if ($cdmodul_ist_aktiv==0) {
    &special_request($input{"f"},$input{"c"},$input{"t"},$input{"start"},$input{"dif"},$input{"aliste"});
  } else {
   1;
  }
}









sub show_session {
  local($sid)=@_;
  use Encode;
  if (length($sid)==6) {  # Bestellnummer
     $snext=0;
     open(f,$datadirectory."orderlog.txt");
     while (<f>) {      
       $s=$_;
      if ($snext==1) {
         $snext=0;
         $datum=$s;$datum=~s/Datum;//g;@help=split(/ /,$datum);($mday,$month,$year)=split(/\./,$help[0]);
       }
       if ($snext==2) {
         $snext=1;
         $sid=$s;$sid=~s/User\-ID;//g;$sid=int($sid);
       }
       if ($s eq "Bestellnummer;$sid\n")  {$snext=2;}      
     }
  } else {
    # tag davor kontrollieren

  
  }
  if (length($mday)==1) {$mday="0".$mday;}
  if (length($month)==1) {$month="0".$month;}

  print "Content-Type: text/html\n\n";
  print "<html><body>";

  $sok=0;$isfirst=0;
  for ($j=1;$j<=7;$j++) {
    if ($sok==1) {next;}
    if ($j>=2) {
      $help=$j-1;
      ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst)=localtime(time-60*60*24*$help);
      $month++;$year+=1900;
      if (length($month)==1) {$month="0".$month;}
      if (length($mday)==1) {$mday="0".$mday;}
    }

    @s=&read_data("../hws-temp/logall/$year-$month-$mday.txt");
    foreach $s (@s) {
      @d=split(/\;/,$s); 
      if ($d[1]==$sid) {  
        if ($isfirst==0) {$isfirst=1;
          print "<b>$mday.$month.$year</b><br>";
          print "<table width=100% cellpadding=5>";
        }
        ($dat,$zeit)=split(/ /,$d[0]);$brow=$d[3];$sok=1;$d[6]=~s/\&userid=(\d+)//g;
        $d[2] =~ tr/+/ /;
        $d[2] =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
        $d[2]=decode_utf8($d[2]);
        print qq!<tr><td width=50>$zeit</td><td width=50>($d[4])</td><td>$d[2]</td><td><a href="$d[6]" target="_top">$d[6]</a></td></tr>\n!; 
      }    
    } 
  }
  print "</table><br>";
  print "Browser: $brow<p>";
 
  exit;
}



sub send_kaufabbruch {


  if (length($month)==1) {$month="0".$month;}
  open(f,"../hws-temp/logall/$year-$month-$mday.txt");
  @data=<f>;
  close(f);chop(@data);

  $myquery="";
  foreach $data (@data){
    @d=split(/\;/,$data);
    $session=$d[1];
    $query=$d[2];
    $anz=$d[4];  
    if ($session==$global[$id_global_userid] && $query=~/FIRMA1/) {$myquery=$query;}   
  }

  if ($myquery ne "") {

    $buffer=$myquery;
    $buffer=&ReadParse2;

    $template_shop_mail="mailangebot.htm";
    @basket=&format_warenkorb;
    $line=join("\n",&read_data("$tempdirectory$template_shop_mail"));
    $line=&parse_line($line);  
#    $kunde_email='abc@shoppark.de';  $email='abc@shoppark.de';
    $kunde_email=$input{"email"};$subject_shop_mail='Nachricht: Kaufabbruch [IF_(($now_tage,$now_minuten,$mday,$month,$year,$hour,$minute)=&now)][IF_END][IF_(length($month)==1)][$month="0".$month][IF_END][IF_(length($mday)==1)][$mday="0".$mday][IF_END][PRINT($year)][PRINT($month)][PRINT($mday)]-[ORDERNR] '.$input{"BESTELLER_VORNAME"}." ".$input{"BESTELLER"};
    $subject_shop_mail=&parse_line($subject_shop_mail);
    $subject_shop_mail="Angebot BAUDIENST ONLINESHop - Kaufabbruch";
    open (MAIL, "|$mailprog -t") || &abbruch("Fehler beim Versenden der Mails &uuml;ber Sendmail");
    print MAIL qq!To: $kunde_email\n!;   
    print MAIL qq!Bcc: $email\n!;
    print MAIL qq!From: $email\n!;
    print MAIL qq!Subject: $subject_shop_mail\n!;
    print MAIL qq!Content-Type: text/html\n\n!;   
    print MAIL $line."\n";
    close (MAIL);
    

  }
  print "Content-Type: text/html\n\n";
  print "OK";exit;

}

sub kaufabbruch {
  $kdate=$input{"kdate"};
  if ($kdate ne "") {($mday,$month,$year)=split(/\./,$kdate);}  
  if (length($mday)==1) {$mday="0".$mday;}
  if (length($month)==1) {$month="0".$month;}
  open(f,"../hws-temp/logall/$year-$month-$mday.txt");
  @data=<f>;
  close(f);chop(@data);


  foreach $data (@data){
    @d=split(/\;/,$data);
    $session=$d[1];
    $query=$d[2];
    $anz=$d[4];  
    if ($anz>0 && $query=~/FIRMA1/) {$wk{$session}=1;$wktime{$session}=$d[0];}   
    if ($query=~/temsend/) {$wk{$session}=0;} 
   
  }

  print "Content-Type: text/html\n\n";
  print "<html><body>";
  print "<b>$mday.$month.$year</b><br>";

  foreach $key (sort(keys %wk)) {
    if ($wk{$key} eq "1") {
      print qq!<a href="$shoppl?show_session=$key&pass=$admin_passwort">$key</a> - $wktime{$key}<br>\n!;
    }
  }

  print qq!<br><form action="$shoppl" method="GET">!;
  print qq!<input type="hidden" name="kaufabbruch" value="1">!;
  print qq!<input type="hidden" name="pass" value="$admin_passwort">!;
  print qq!<input type="text" name="kdate" size="10" value="$mday.$month.$year"> <input type="submit" value="OK">!;
  print qq!</<form>!;
  print "</body></html>";
  exit;
}


# ****************************************************************
# Paypal Step 1
# ***************************************************************

sub paypal_redirect {
  use  Business::PayPal::NVP;
  use Encode;

  $pp_server="https://paypal.com/";  
  if ($pp_sandbox==1) {$pp_server="https://sandbox.paypal.com/";}
  $pp_url="https://api-3t.paypal.com/nvp";
  if ($pp_sandbox==1) { $pp_url="https://api-3t.sandbox.paypal.com/nvp"}
 
  open(f,">$paypal_directory/$global[$id_global_userid].var");
  foreach $keyval (@keyval) {
    print f "$keyval\n";
  }
  close(f);

  @basket=&format_warenkorb;
  @o=&read_data("$datadirectory"."order.dat");
  $o[0]++;$global[$id_global_ordernr]=$o[0];
   
  if (length($month)==1) {$month="0".$month;}
  if (length($mday)==1) {$mday="0".$mday;}
  $help="$year$month$mday-$global[$id_global_ordernr]";

  $kunde_email=$input{$shop_email_input};                                         # E-Mail auf korrekte Form testen
  $kunde_email=~s/^(\s+)//g;$kunde_email=~s/(\s+)$//g;
  if ($kunde_email!~/^([a-zA-Z0-9\-\.\_]+)@([a-zA-Z0-9\-\.\_]+\.[a-zA-Z]+)$/) {
    if ($kunde_email ne "") {                                           # Falls keine leere Mail
      &abbruch(qq!Die <B>E-Mail</B> wurde in einer falschen Form oder unvollst&auml;ndig angegeben. Bitte kontrollieren Sie Ihren Eintrag im Feld <B>E-Mail</B>. Wenn Sie keine E-Mail haben oder diese Meldung weiterhin erscheint, lassen Sie das Feld bitte komplett leer!);
    }
  }
  $OrderTotal=$global[$id_global_sumallv];
  if ($global[$id_global_sumall]==0) {&abbruch("Es befinden sich keine Artikel im Warenkorb.");}
 
  $BuyerEmail=$kunde_email;
  $InvoiceID=$global[$id_global_userid]."_".$help;
  $CancelURL=$paypal_cancel_return."&userid=".$global[$id_global_userid];
  $ReturnURL=$paypal_notify_url."&userid=".$global[$id_global_userid];

  # Authentifizierungsdaten an API-Modul übergeben
    my $nvp = new Business::PayPal::NVP( branch => 'live',
                                      live   => { user => $pp_username,
                                                  pwd  => $pp_password,
                                                  sig  => $pp_signature,
						  url => $pp_url } );

  $CancelURL=&parse_line($CancelURL);
  $ReturnURL=&parse_line($ReturnURL);
 
  $itemamt=$OrderTotal-$global[$id_global_versandkosten];

  $data{"DESC"}=&parse_line($paypal_item);
  $data{"CURRENCYCODE"}='EUR';
  $data{"CUSTOM"}=&parse_line($paypal_item);
  $data{"INVNUM"}=$InvoiceID;
  $data{"PAYMENTACTION"}='Sale';
  $data{"LOCALCODE"}='DE';
  $data{"NOSHIPPING"}='2';
  $data{"EMAIL"}=$input{"G_EMAIL"};
  $data{"RETURNURL"}=$ReturnURL;
  $data{"CANCELURL"}=$CancelURL;

  $countrycode="DE";
  if ($input{$shop_land_input} eq "Belgien") {$countrycode="BE";}
  if ($shop_land_input eq "Bulgarien") {$countrycode="BG";}
  if ($shop_land_input eq "Dänemark") {$countrycode="DK";}
  if ($shop_land_input eq "Estland") {$countrycode="EE";}
  if ($shop_land_input eq "Finnland") {$countrycode="FI";}
  if ($shop_land_input eq "Frankreich") {$countrycode="FR";}
  if ($shop_land_input eq "Griechenland") {$countrycode="GR";}
  if ($shop_land_input eq "Italien") {$countrycode="IT";}
  if ($shop_land_input eq "Lettland") {$countrycode="LV";}
  if ($shop_land_input eq "Litauen") {$countrycode="LT";}
  if ($shop_land_input eq "Luxemburg") {$countrycode="LU";}
  if ($shop_land_input eq "Malta") {$countrycode="MT";}
  if ($shop_land_input eq "Niederlande") {$countrycode="NL";}
  if ($shop_land_input eq "Norwegen") {$countrycode="NO";}
  if ($shop_land_input eq "Österreich") {$countrycode="AT";}
  if ($shop_land_input eq "Polen") {$countrycode="PO";}
  if ($shop_land_input eq "Portugal") {$countrycode="PT";}
  if ($shop_land_input eq "Rumänien") {$countrycode="RO";}
  if ($shop_land_input eq "Schweden") {$countrycode="SW";}
  if ($shop_land_input eq "Schweiz") {$countrycode="CH";}
  if ($shop_land_input eq "Slowakei") {$countrycode="SK";}
  if ($shop_land_input eq "Slowenien") {$countrycode="SI";}
  if ($shop_land_input eq "Spanien") {$countrycode="ES";}
  if ($shop_land_input eq "Tschechien") {$countrycode="CZ";}
  if ($shop_land_input eq "Ungarn") {$countrycode="HU";}
  if ($shop_land_input eq "Vereinigtes Königreich (UK)") {$countrycode="GB";}
  if ($shop_land_input eq "Zypern") {$countrycode="CY";}

  $tempname=$input{$shop_nachname_input};
  if ($input{$shop_vorname_input} ne "") {$tempname=$input{$shop_vorname_input}." ".$tempname;}
  $data{"PAYMENTREQUEST_0_SHIPTONAME"}=encode("utf8",$tempname);
  $data{"PAYMENTREQUEST_0_SHIPTOSTREET"}=encode("utf8",$input{$shop_strasse_input});
  $data{"PAYMENTREQUEST_0_SHIPTOSTREET2"}="";
  $data{"PAYMENTREQUEST_0_SHIPTOCITY"}=encode("utf8",$input{$shop_ort_input});
  $data{"PAYMENTREQUEST_0_SHIPTOCOUNTRYCODE"}=$countrycode;
  $data{"PAYMENTREQUEST_0_SHIPTOZIP"}=$input{$shop_plz_input};
  $data{"PAYMENTREQUEST_0_EMAIL"}=$input{$shop_email_input};
  $data{"PAYMENTREQUEST_0_SHIPTOPHONENUM"}=encode("utf8",$input{$shop_tel_input});

  if ($input{$shop_lieferabweichend_field} eq $shop_lieferabweichend_value) {
   $tempname=$input{$shop_leifernachname_input};
   if ($input{$shop_liefervorname_input} ne "") {$tempname=$input{$shop_liefervorname_input}." ".$tempname;}
   $data{"PAYMENTREQUEST_0_SHIPTONAME"}=encode("utf8",$tempname);
   $data{"PAYMENTREQUEST_0_SHIPTOSTREET"}=encode("utf8",$input{$shop_lieferstrasse_input});
   $data{"PAYMENTREQUEST_0_SHIPTOCITY"}=encode("utf8",$input{$shop_lieferort_input});
   $data{"PAYMENTREQUEST_0_SHIPTOZIP"}=$input{$shop_lieferplz_input}; 
  }

  $pmwst=&format_sum(($global[$id_global_sumallv]+$HIS_SCRIPTversandkosten_grundpauschale+$HIS_SCRIPTzoll_geb+$HIS_SCRITPeur1_geb+$HIS_SCRIPTpaypal_geb)/100*$HIS_SCRIPTmwst);
  $data{"PAYMENTREQUEST_0_ITEMAMT"}=$itemamt+$HIS_SCRIPTversandkosten_grundpauschale+$HIS_SCRIPTzoll_geb+$HIS_SCRIPTeur1_geb+$HIS_SCRIPTpaypal_geb+$pmwst;
  $data{"PAYMENTREQUEST_0_AMT"}=$OrderTotal+$HIS_SCRIPTversandkosten_grundpauschale+$HIS_SCRIPTzoll_geb+$HIS_SCRIPTeur1_geb+$HIS_SCRIPTpaypal_geb+$pmwst;
  $data{"PAYMENTREQUEST_0_CURRENCYCODE"}='EUR';
  $data{"PAYMENTREQUEST_0_PAYMENTACTION"}='Sale';
  $data{"PAYMENTREQUEST_0_SHIPPINGAMT"}=$global[$id_global_versandkosten];
  $data{"PAYMENTREQUEST_0_INVNUM"}=$InvoiceID;

  for ($i=0;$i<=$#basket_dat;$i++) {
    @d=split(/\;/,$basket_dat[$i]);
    $costs=$d[$id_article_costs];

    $aname=$d[$index{$basket_name_field}];
    $data{"L_PAYMENTREQUEST_0_NAME$i"}=encode("utf8", $aname);
    $data{"L_PAYMENTREQUEST_0_NUMBER$i"}=$d[$index{"NR"}],
    $data{"L_PAYMENTREQUEST_0_AMT$i"}=&format_sum($costs),
    $data{"L_PAYMENTREQUEST_0_QTY$i"}=$d[$id_article_quantity]
  }

  if ($global[$id_global_min_order_zuschlag]>0) {  
    $data{"L_PAYMENTREQUEST_0_NAME$i"}=encode("utf8", "Mindermengen-Zuschlag");
    $data{"L_PAYMENTREQUEST_0_NUMBER$i"}="MZ",
    $data{"L_PAYMENTREQUEST_0_AMT$i"}=&format_sum($global[$id_global_min_order_zuschlag]),
    $data{"L_PAYMENTREQUEST_0_QTY$i"}=1;
    $i++;
  }   
 
  if ($HIS_SCRIPTversandkosten_grundpauschale>0) {
    $data{"L_PAYMENTREQUEST_0_NAME$i"}=encode("utf8", "Versandkosten/Versicherung/Maut");
    $data{"L_PAYMENTREQUEST_0_NUMBER$i"}="VK",
    $data{"L_PAYMENTREQUEST_0_AMT$i"}=&format_sum($HIS_SCRIPTversandkosten_grundpauschale),
    $data{"L_PAYMENTREQUEST_0_QTY$i"}=1;
    $i++;
  }

  if ($HIS_SCRIPTzoll_geb>0) {
    $data{"L_PAYMENTREQUEST_0_NAME$i"}=encode("utf8", "Ausfuhranmeldung");
    $data{"L_PAYMENTREQUEST_0_NUMBER$i"}="ZO",
    $data{"L_PAYMENTREQUEST_0_AMT$i"}=&format_sum($HIS_SCRIPTzoll_geb),
    $data{"L_PAYMENTREQUEST_0_QTY$i"}=1;
    $i++;
  }

  if ($HIS_SCRIPTeur1_geb>0) {
    $data{"L_PAYMENTREQUEST_0_NAME$i"}=encode("utf8", "Erstellung EUR1");
    $data{"L_PAYMENTREQUEST_0_NUMBER$i"}="EU",
    $data{"L_PAYMENTREQUEST_0_AMT$i"}=&format_sum($HIS_SCRIPTeur1_geb),
    $data{"L_PAYMENTREQUEST_0_QTY$i"}=1;
    $i++;
  }

  if ($HIS_SCRIPTpaypal_geb>0) {
    $data{"L_PAYMENTREQUEST_0_NAME$i"}=encode("utf8", "PayPal-Gebühr");
    $data{"L_PAYMENTREQUEST_0_NUMBER$i"}="PP",
    $data{"L_PAYMENTREQUEST_0_AMT$i"}=&format_sum($HIS_SCRIPTpaypal_geb),
    $data{"L_PAYMENTREQUEST_0_QTY$i"}=1;
    $i++;
  }

  if ($pmwst>0) {
    $data{"L_PAYMENTREQUEST_0_NAME$i"}=encode("utf8", "MwSt. $HIS_SCRIPTmwst%");
    $data{"L_PAYMENTREQUEST_0_NUMBER$i"}="MW",
    $data{"L_PAYMENTREQUEST_0_AMT$i"}=&format_sum($pmwst),
    $data{"L_PAYMENTREQUEST_0_QTY$i"}=1;
    $i++;
  }

  %response = $nvp->SetExpressCheckout( %data );


 

  if ($response{'ACK'} ne "Success")   {
    &abbruch(qq!Leider hat uns PayPal mitgeteilt, dass die Zahlung nicht durchgeführt werden kann. Bitte gehen Sie zum <a href="$shoppl">Warenkorb</a> zurück und wählen Sie im weiteren Verlauf der Bestellung eine andere Zahlungsart.<br>Aus Datenschutzgründen teilt uns PayPal nicht mit, warum die Zahlung nicht erfolgreich war. Bei Rückfragen dazu wenden Sie sich bitte direkt an PayPal.!);
   
    &abbruch("PayPal hat \"". $response{'Ack'} ."\" gemeldet: (" .
                $response{'Errors'}[0]->{'ErrorCode'} .") ".
                $response{'Errors'}[0]->{'LongMessage'} ." (CorrelationID: ".
                $response{'CorrelationID'} .")",
                18
               );
  }
  my $token = $response{'TOKEN'};
  &redirect($pp_server."cgi-bin/webscr?cmd=_express-checkout&token=$token");
  exit;
}




# ****************************************************************
# Paypal Step 2
# ***************************************************************

sub paypal_checkout {
  use  Business::PayPal::NVP;
  use Encode;


  $pp_server="https://paypal.com/";  
  if ($pp_sandbox==1) {$pp_server="https://sandbox.paypal.com/";}
  $pp_url="https://api-3t.paypal.com/nvp";

  # Authentifizierungsdaten an API-Modul übergeben
  my $nvp = new Business::PayPal::NVP( branch => 'live',
                                      live   => { user => $pp_username,
                                                  pwd  => $pp_password,
                                                  sig  => $pp_signature,
						  url => $pp_url } );

  $data{"TOKEN"}=$input{"token"};
  %response = $nvp->GetExpressCheckoutDetails( %data );

  if ($response{'ACK'} ne "Success")   {
    &abbruch(qq!Leider hat uns PayPal mitgeteilt, dass die Zahlung nicht durchgeführt werden kann. Bitte gehen Sie zum <a href="$shoppl">Warenkorb</a> zurück und wählen Sie im weiteren Verlauf der Bestellung eine andere Zahlungsart.<br>Aus Datenschutzgründen teilt uns PayPal nicht mit, warum die Zahlung nicht erfolgreich war. Bei Rückfragen dazu wenden Sie sich bitte direkt an PayPal.!);
  }
   
  foreach $key (sort(keys %response)) {
    $response{$key} = decode("utf-8", $response{$key});
  }
 
  $userid=$response{"INVNUM"}; 
  $userid=~s/_(.*)//g;
  $input{"userid"}=$userid;
  $input{"PayerID"}=$response{"PAYERID"};

  $paypal_hidden_vars="";  
  $paypal_hidden_vars.=qq!<input type="hidden" name="token" value="$input{"token"}">!;
  $paypal_hidden_vars.=qq!<input type="hidden" name="PayerID" value="$input{"PayerID"}">!;     
  $input{"PAYPAL_HIDDEN_VARS"}=$paypal_hidden_vars;
      
  @old_keyval=&read_data("$paypal_directory/$userid.var");

  $ist_abweichend=0;
  foreach $old_keyval (@old_keyval) {
    @f=split(/\;/,$old_keyval); 
    if ($f[0] ne "t") {$input{$f[0]}=$f[1];}       
    if ($f[0] eq $shop_strasse_input && $response{"PAYMENTREQUEST_0_SHIPTOSTREET"} ne $f[1]) {
      $ist_abweichend=1;
    }
    $paypal_hidden_vars.=qq!<input type="hidden" name="$f[0]" value="$f[1]">\n!; 
  }
  

  if ($ist_abweichend==1) {
    $paypal_hidden_vars.=qq!<input type="hidden" name="$shop_lieferabweichend_field" value="$shop_lieferabweichend_value">\n!; 
    $tempname=$response{"PAYMENTREQUEST_0_SHIPTONAME"};
    $paypal_hidden_vars.=qq!<input type="hidden" name="$shop_liefernachname_input" value="$tempname">\n!; 
    $tempstrasse=$response{"PAYMENTREQUEST_0_SHIPTOSTREET"};
    $paypal_hidden_vars.=qq!<input type="hidden" name="$shop_lieferstrasse_input" value="$tempstrasse">\n!; 
    $paypal_hidden_vars.=qq!<input type="hidden" name="$shop_lieferort_input" value="!.$response{"PAYMENTREQUEST_0_SHIPTOCITY"}.qq!">\n!; 
    $paypal_hidden_vars.=qq!<input type="hidden" name="$shop_lieferplz_input" value="!.$response{"PAYMENTREQUEST_0_SHIPTOZIP"}.qq!">\n!;  
  }
  $input{"PAYPAL_HIDDEN_VARS"}=$paypal_hidden_vars;


 
  if (int(rand(500))==1) {  # cleanup function
    opendir (VERZ, "$paypal_directory");
    @datei= grep (!/^\.\.?$/, readdir VERZ);
    closedir VERZ;
    foreach $datei (@datei) {
      $age=-M $paypal_directory.$datei;
      if ($age>180) {
        unlink $paypal_directory.$datei;
      }
    }
  }
}




# ****************************************************************
# Paypal Step 3
# ***************************************************************

sub paypal_send_order  {
  use  Business::PayPal::NVP;
  use Encode;

  $pp_server="https://paypal.com/";  
  if ($pp_sandbox==1) {$pp_server="https://sandbox.paypal.com/";}
  $pp_url="https://api-3t.paypal.com/nvp";

  @basket=&format_warenkorb;
  @o=&read_data("$datadirectory"."order.dat");                        
  $o[0]++;$global[$id_global_ordernr]=$o[0];
 
  if (length($month)==1) {$month="0".$month;}
  if (length($mday)==1) {$mday="0".$mday;}
  $help="$year$month$mday-$global[$id_global_ordernr]";
  $InvoiceID=$global[$id_global_ordernr];


  # Authentifizierungsdaten an API-Modul übergeben
    my $nvp = new Business::PayPal::NVP( branch => 'live',
                                      live   => { user => $pp_username,
                                                  pwd  => $pp_password,
                                                  sig  => $pp_signature,
						  url => $pp_url } );

  open(f,">$paypal_directory$global[$id_global_userid]$help.info");
  foreach $basket_dat (@basket_dat){ 
    print f "$basket_dat\n";
  }
  close(f);  

  $data{"TOKEN"}=$input{"token"};
  $data{"PAYERID"}=$input{"PayerID"};
  $OrderTotal=$global[$id_global_sumallv];
  if ($global[$id_global_sumall]==0) {&abbruch("Es befinden sich keine Artikel im Warenkorb.");} 
  $itemamt=$OrderTotal-$global[$id_global_versandkosten];

  $data{"DESC"}=&parse_line($paypal_item);
  $data{"CURRENCYCODE"}='EUR';
  $data{"CUSTOM"}=&parse_line($paypal_item);
  $data{"INVNUM"}=$InvoiceID;
  $data{"PAYMENTACTION"}='Sale';
  $data{"LOCALCODE"}='DE';
  $data{"NOSHIPPING"}='2';
  $data{"EMAIL"}=$input{"G_EMAIL"};
  $data{"RETURNURL"}=$ReturnURL;
  $data{"CANCELURL"}=$CancelURL;

  $pmwst=&format_sum(($global[$id_global_sumallv]+$HIS_SCRIPTversandkosten_grundpauschale+$HIS_SCRIPTzoll_geb+$HIS_SCRITPeur1_geb+$HIS_SCRIPTpaypal_geb)/100*$HIS_SCRIPTmwst);
  $data{"PAYMENTREQUEST_0_ITEMAMT"}=$itemamt+$HIS_SCRIPTversandkosten_grundpauschale+$HIS_SCRIPTzoll_geb+$HIS_SCRIPTeur1_geb+$HIS_SCRIPTpaypal_geb+$pmwst;
  $data{"PAYMENTREQUEST_0_AMT"}=$OrderTotal+$HIS_SCRIPTversandkosten_grundpauschale+$HIS_SCRIPTzoll_geb+$HIS_SCRIPTeur1_geb+$HIS_SCRIPTpaypal_geb+$pmwst;
  $data{"PAYMENTREQUEST_0_CURRENCYCODE"}='EUR';
  $data{"PAYMENTREQUEST_0_PAYMENTACTION"}='Sale';
  $data{"PAYMENTREQUEST_0_SHIPPINGAMT"}=$global[$id_global_versandkosten];
  $data{"PAYMENTREQUEST_0_INVNUM"}=$InvoiceID;

    for ($i=0;$i<=$#basket_dat;$i++) {
    @d=split(/\;/,$basket_dat[$i]);
    $costs=$d[$id_article_costs];

    $aname=$d[$index{$basket_name_field}];
    $data{"L_PAYMENTREQUEST_0_NAME$i"}=encode("utf8", $aname);
    $data{"L_PAYMENTREQUEST_0_NUMBER$i"}=$d[$index{"NR"}],
    $data{"L_PAYMENTREQUEST_0_AMT$i"}=&format_sum($costs),
    $data{"L_PAYMENTREQUEST_0_QTY$i"}=$d[$id_article_quantity]
  }

  if ($global[$id_global_min_order_zuschlag]>0) {  
    $data{"L_PAYMENTREQUEST_0_NAME$i"}=encode("utf8", "Mindermengen-Zuschlag");
    $data{"L_PAYMENTREQUEST_0_NUMBER$i"}="MZ",
    $data{"L_PAYMENTREQUEST_0_AMT$i"}=&format_sum($global[$id_global_min_order_zuschlag]),
    $data{"L_PAYMENTREQUEST_0_QTY$i"}=1;
    $i++;
  }   
 
  if ($HIS_SCRIPTversandkosten_grundpauschale>0) {
    $data{"L_PAYMENTREQUEST_0_NAME$i"}=encode("utf8", "Versandkosten/Versicherung/Maut");
    $data{"L_PAYMENTREQUEST_0_NUMBER$i"}="VK",
    $data{"L_PAYMENTREQUEST_0_AMT$i"}=&format_sum($HIS_SCRIPTversandkosten_grundpauschale),
    $data{"L_PAYMENTREQUEST_0_QTY$i"}=1;
    $i++;
  }

  if ($HIS_SCRIPTzoll_geb>0) {
    $data{"L_PAYMENTREQUEST_0_NAME$i"}=encode("utf8", "Ausfuhranmeldung");
    $data{"L_PAYMENTREQUEST_0_NUMBER$i"}="ZO",
    $data{"L_PAYMENTREQUEST_0_AMT$i"}=&format_sum($HIS_SCRIPTzoll_geb),
    $data{"L_PAYMENTREQUEST_0_QTY$i"}=1;
    $i++;
  }

  if ($HIS_SCRIPTeur1_geb>0) {
    $data{"L_PAYMENTREQUEST_0_NAME$i"}=encode("utf8", "Erstellung EUR1");
    $data{"L_PAYMENTREQUEST_0_NUMBER$i"}="EU",
    $data{"L_PAYMENTREQUEST_0_AMT$i"}=&format_sum($HIS_SCRIPTeur1_geb),
    $data{"L_PAYMENTREQUEST_0_QTY$i"}=1;
    $i++;
  }

  if ($HIS_SCRIPTpaypal_geb>0) {
    $data{"L_PAYMENTREQUEST_0_NAME$i"}=encode("utf8", "PayPal-Gebühr");
    $data{"L_PAYMENTREQUEST_0_NUMBER$i"}="PP",
    $data{"L_PAYMENTREQUEST_0_AMT$i"}=&format_sum($HIS_SCRIPTpaypal_geb),
    $data{"L_PAYMENTREQUEST_0_QTY$i"}=1;
    $i++;
  }

  if ($pmwst>0) {
    $data{"L_PAYMENTREQUEST_0_NAME$i"}=encode("utf8", "MwSt. $HIS_SCRIPTmwst%");
    $data{"L_PAYMENTREQUEST_0_NUMBER$i"}="MW",
    $data{"L_PAYMENTREQUEST_0_AMT$i"}=&format_sum($pmwst),
    $data{"L_PAYMENTREQUEST_0_QTY$i"}=1;
    $i++;
  }


  $kunde_email=$input{$shop_email_input};                                         # E-Mail auf korrekte Form testen
  $kunde_email=~s/^(\s+)//g;$kunde_email=~s/(\s+)$//g;
  if ($kunde_email!~/^([a-zA-Z0-9\-\.\_]+)@([a-zA-Z0-9\-\.\_]+\.[a-zA-Z]+)$/) {
    if ($kunde_email ne "") {                                           # Falls keine leere Mail
      &abbruch(qq!Die <B>E-Mail</B> wurde in einer falschen Form oder unvollst&auml;ndig angegeben. Bitte kontrollieren Sie Ihren Eintrag im Feld <B>E-Mail</B>. Wenn Sie keine E-Mail haben oder diese Meldung weiterhin erscheint, lassen Sie das Feld bitte komplett leer!);
    }
  }

  %response = $nvp->DoExpressCheckoutPayment( %data );
  %details=%response;

  open(f,">$paypal_directory/$global[$id_global_userid]$help.pp");
   foreach $key (sort(keys %response)) {
     print f "$key: ".$response{$key}."\r\n";
   }

  if ($response{'ACK'} ne "Success")   { 
    &abbruch(qq!Leider hat uns PayPal mitgeteilt, dass die Zahlung nicht durchgeführt werden kann. Bitte gehen Sie zum <a href="$shoppl">Warenkorb</a> zurück und wählen Sie im weiteren Verlauf der Bestellung eine andere Zahlungsart.<br>Aus Datenschutzgründen teilt uns PayPal nicht mit, warum die Zahlung nicht erfolgreich war. Bei Rückfragen dazu wenden Sie sich bitte direkt an PayPal.!);
    
    &abbruch("PayPal hat \"". $payinfo{'Ack'} ."\" gemeldet: (" .
                $payinfo{'Errors'}[0]->{'ErrorCode'} .") ".
                $payinfo{'Errors'}[0]->{'LongMessage'} ." (CorrelationID: ".
                $payinfo{'CorrelationID'} .")",
                38
               );
  } 
  $input{"TransactionID"}=$details{"PAYMENTINFO_0_TRANSACTIONID"};
  $input{"PaymentStatus"}=$details{"PAYMENTINFO_0_PAYMENTSTATUS"};
  $input{"Amount"}=$OrderTotal;
  
  push(@keyval,join(';',"TransactionID",$details{"PAYMENTINFO_0_TRANSACTIONID"}));
  push(@keyval,join(';',"PaymentStatus",$payinfo{"PAYMENTINFO_0_PAYMENTSTATUS"}));
  push(@keyval,join(';',"Amount",$OrderTotal));


}



sub show_gutschein_text {
  local($gutschein_nr)=@_;
  ($gutschein_nr,$gutschein_wert,$gutschein_pass,$gutschein_bezahlt,$gutschein_ausgeloest,$gutschein_bestellt,$gutschein_absender,$gutschein_empfaenger,$gutschein_text,$gutschein_ordermin,$gutschein_gueltigkeit,$gutschein_aktionvon,$gutschein_aktionbis,$gutschein_aktiontyp,$gutschein_laufzeit,$gutschein_ab,$gutschein_frei)=&get_gutschein_pass($gutschein_nr);
  print "Content-Type: text/html\n\n";
  print "<html><body>";
  print $gutschein_frei."<p>";
  print '<form><textarea rows="8" cols="100">'.$gutschein_frei.'</textarea></form>';
  print "</body></html>";exit;
 
}

sub gutschein_verwaltung {
  local($gutschein_nr,$ngutschein_bezahlt,$ngutschein_ausgeloest,$create_promo_gutschein,$ngutschein_wert,$ngutschein_ordermin,$ngutschein_ausgeloest,$ngutschein_gueltigkeit)=@_;

  if ($gutschein_nr ne "") {
    ($gutschein_nr,$gutschein_wert,$gutschein_pass,$gutschein_bezahlt,$gutschein_ausgeloest,$gutschein_bestellt,$gutschein_absender,$gutschein_empfaenger,$gutschein_text,$gutschein_ordermin,$gutschein_gueltigkeit)=&get_gutschein_pass($gutschein_nr);
    if ($ngutschein_bezahlt==1) {$gutschein_bezahlt=1;}
    if ($ngutschein_ausgeloest==1) {$gutschein_ausgeloest=1;}
    &add_gutschein_to_db($gutschein_nr,$gutschein_wert,$gutschein_pass,$gutschein_bezahlt,$gutschein_ausgeloest,$gutschein_bestellt,$gutschein_absender,$gutschein_empfaenger,$gutschein_text,$gutschein_ordermin,$gutschein_gueltigkeit); 
  }
  if ($input{"gutschein_delete_nr"} ne "") {
    @g=&read_data($datadirectory."gutschein_db.txt");
    $#gn=-1;
    foreach $g (@g) {
      ($gutschein_nr,$gutschein_wert,$gutschein_pw,$gutschein_bezahlt,$gutschein_ausgeloest,$gutschein_bestellt,$gutschein_absender,$gutschein_empfaenger,$gutschein_text)=split(/\;/,$g);
      if ($gutschein_nr ne $input{"gutschein_delete_nr"}) {
        push(@gn,$g); 
      }
    } 
    &save_array($datadirectory."gutschein_db.txt","gutschein",@gn);
  }
  
  if ($create_promo_gutschein ne "") {
    if ($ngutschein_wert==0) {&abbruch("Bitte einen Gutschein-Wert angeben.");}
     $gutschein_nr=&create_gutschein;
    $gutschein_wert=$ngutschein_wert;
    $gutschein_pass="";
    $gutschein_bezahlt=1;
    $gutschein_ausgeloest=$ngutschein_ausgeloest;
    $gutschein_bestellt=time;
    $gutschein_absender="";
    $gutschein_empfaenger="";
    $gutschein_text="";
    $gutschein_ordermin=$ngutschein_ordermin;
    $gutschein_gueltigkeit=$ngutschein_gueltigkeit;  
    $gutschein_aktionvon=$input{"gutschein_aktionvon"};
    $gutschein_aktionbis=$input{"gutschein_aktionbis"};
    $gutschein_aktiontyp=$input{"gutschein_aktiontyp"};
    $gutschein_laufzeit=$input{"gutschein_laufzeit"};
    $gutschein_ab=$input{"gutschein_ab"};
    $gutschein_frei=$input{"gutschein_frei"};
    if ($gutschein_laufzeit==0 && $gutschein_aktionvon ne "") {&abbruch("Bitte die Laufzeit des Gutscheins angeben.");}
    if ($gutschein_gueltigkeit ne "") {
      ($gtag,$gmonat,$gjahr)=split(/\./,$gutschein_gueltigkeit);if ($gjahr<100) {$gjahr+=2000;} $gtage=&jday($gmonat,$gtag,$gjahr)-$start_tage;
      if ($gtage<$now_tage) {&abbruch("Das Datum zur G&uuml;ltigkeit $gutschein_gueltigkeit muss in der Zukunft liegen.");}
  
    }
    if ($gutschein_aktiontyp ne "") {
      ($gtag,$gmonat,$gjahr)=split(/\./,$gutschein_aktionvon);if ($gjahr<100) {$gjahr+=2000;} $gtagevon=&jday($gmonat,$gtag,$gjahr)-$start_tage;
      ($gtag,$gmonat,$gjahr)=split(/\./,$gutschein_aktionbis);if ($gjahr<100) {$gjahr+=2000;} $gtagebis=&jday($gmonat,$gtag,$gjahr)-$start_tage;
      if ($gtagebis<$now_tage) {&abbruch("Das Datum Aktion bis $gutschein_aktionbis muss in der Zukunft liegen.");}
      if ($gtagebis<$gtagevon) {&abbruch("Das Datum Aktions bis $gutschein_aktionbis muss sp&auml;ter als Aktion von $gutschein_aktionvon sein.");}
    }
    &add_gutschein_to_db($gutschein_nr,$gutschein_wert,$gutschein_pass,$gutschein_bezahlt,$gutschein_ausgeloest,$gutschein_bestellt,$gutschein_absender,$gutschein_empfaenger,$gutschein_text,$gutschein_ordermin,$gutschein_gueltigkeit,$gutschein_aktionvon,$gutschein_aktionbis,$gutschein_aktiontyp,$gutschein_laufzeit,$gutschein_ab,$gutschein_frei);
  }

  
  print "Content-type: text/html\n\n";
  print "<html><body>";
  @g=&read_data($datadirectory."gutschein_db.txt");
  $#ng=-1;
  for ($i=$#g;$i>=0;$i--) {
    ($gutschein_nr,$gutschein_wert,$gutschein_pw,$gutschein_bezahlt,$gutschein_ausgeloest,$gutschein_bestellt,$gutschein_absender,$gutschein_empfaenger,$gutschein_text)=split(/\;/,$g[$i]);
    if ($gex{$gutschein_nr}==0 && $gutschein_bestellt>0) {
      push(@ng,$g[$i]);
      $gex{$gutschein_nr}=1;
    }
  }
  print qq!<table width="100%" cellpadding="3" cellspacing=0>!;
  print qq!<tr>!;
  print qq!<th>Status &auml;ndern</th>!; 
  print qq!<th>Aktueller Status</th>!; 
  print qq!<th>Bestell-Datum</th>!; 
  print qq!<th>Gutschein-Code</th>!;
  print qq!<th>Gutschein-Wert</th>!;
  print qq!<th>Mindest-Bestellwert</th>!; 
  print qq!<th>G&uuml;ltig bis</th>!;  
  print qq!<th>K&auml;ufer</th>!;
#  print qq!<th>Versand an</th>!;
  print qq!<th colspan=2>Aktion von/bis</th>!;
  print qq!<th>Laufzeit</th>!;
  print qq!<th>ab Bestellwert</th>!;
  print qq!<th>freier Text</th>!;
  print qq!</tr>\n!;
  foreach $ng (@ng) {
   ($gutschein_nr,$gutschein_wert,$gutschein_pw,$gutschein_bezahlt,$gutschein_ausgeloest,$gutschein_bestellt,$gutschein_absender,$gutschein_empfaenger,$gutschein_text,$gutschein_ordermin,$gutschein_gueltigkeit,$gutschein_aktionvon,$gutschein_aktionbis,$gutschein_aktiontyp,$gutschein_laufzeit,$gutschein_ab,$gutschein_frei)=split(/\;/,$ng);

  ($gday,$gmon,$gyear)=split(/\./,$gutschein_gueltigkeit);$gdays=$gday+$gmon*31+$gyear*365;
   $myear=$year-2000;$odays=$mday+$month*31+$myear*365;
  if ($gdays<$odays && $gdays!=0) {next;}
#   if ($gutschein_aktiontyp==2){next;}
   local(@today) = localtime($gutschein_bestellt);
   local($d) = $today[3];
   local($m) = $today[4];
   local($y) = $today[5]; 
   $m+=1;$y-=100;
   if (length($d)==1) {$d="0".$d;}
   if (length($m)==1) {$m="0".$m;}
   if (length($y)==1) {$y="0".$y;}
   if ($gutschein_aktiontyp eq "") {print qq!\n<tr>!;}  
   if ($gutschein_aktiontyp eq "0") {print qq!\n<tr bgcolor="#dddddd">!;}
   if ($gutschein_aktiontyp==2) {print qq!\n<tr bgcolor="#eeeeee">!;}
   $gutschein_status="OK";
   $gutschein_new_status="OK";
   if ($gutschein_bezahlt==0) {
     $gutschein_status="Warte auf Zahlung";
     $gutschein_new_status="Zahlung ist erfolgt";
     $gutschein_link="gutschein_bezahlt=1";
   }
   if ($gutschein_bezahlt==1) {
     $gutschein_status="kann eingel&ouml;st werden";
     if ($gutschein_ausgeloest<0) {
        $gutschein_status="beliebig oft einl&ouml;sbar";
     }
     $gutschein_new_status="Gutschein sperren";
     $gutschein_link="gutschein_ausgeloest=999";
   }
  if ($gutschein_ausgeloest==1) {
     $gutschein_status="wurde eingel&ouml;st";
     $gutschein_new_status="";
     $gutschein_link="";
   }
if ($gutschein_ausgeloest==999) {
     $gutschein_status="ist gesperrt";
     $gutschein_new_status="";
     $gutschein_link="";
   }
   print qq!<td><a href="$skript?gutschein_verwaltung=!.&url_encode($admin_passwort).qq!&gutschein_nr=$gutschein_nr&$gutschein_link">$gutschein_new_status</a> - <a href="$skript?gutschein_verwaltung=!.&url_encode($admin_passwort).qq!&gutschein_delete_nr=$gutschein_nr" onClick="return confirm('Soll der Gutschein wirklich entfernt werden?')">l&ouml;schen</a></td>!;
   print qq!<td>$gutschein_status</td>!; 
   print qq!<td>$d.$m.$y</td>!;   
   print qq!<td>$gutschein_nr</td>!;
   print qq!<td>!.&format_sum($gutschein_wert).qq!</td>!;
   print qq!<td>!.&format_sum($gutschein_ordermin).qq!</td>!;
   print qq!<td>$gutschein_gueltigkeit</td>!;
   print qq!<td>$gutschein_absender</td>!;
   if ($gutschein_aktiontyp ne "") {
    print qq!<td>$gutschein_aktionvon</td>!;
    print qq!<td>$gutschein_aktionbis</td>!;
    print qq!<td>$gutschein_laufzeit</td>!;
    print qq!<td>$gutschein_ab</td>!;
    $x='<a href="'.$shoppl.'?show_gutschein_text='.$gutschein_nr.'">vorhanden</a>';if ($gutschein_frei eq "") {$x="";}
    print qq!<td>$x</td>!;
   }
   print qq!</tr>!;
  }
  print qq!</table><p>!;

  print qq!<form action="$skript">!;
  print qq!<input type="hidden" name="gutschein_verwaltung" value="$admin_passwort">!;
  print qq!<input type="hidden" name="create_promo_gutschein" value="1">!;
  print qq!<b>Promotions-Gutschein erstellen</b><br>!;
  print qq!<table>!;
  print qq!<tr><td>Gutschein-Wert:</td><td><input type="text" name="gutschein_wert" size="3"></td></tr>!;
  print qq!<tr><td>Mindest-Bestellwert:</td><td><input type="text" name="gutschein_ordermin" size="3"></td></tr>!;
  print qq!<tr><td>Wie oft einl&ouml;sbar?</td><td><select name="gutschein_ausgeloest"><option value="0">nur einmal<option value="-9999999">unbegrenzt</select></td></tr>!;
  print qq!<tr><td>G&uuml;ltig bis:</td><td><input type="text" name="gutschein_gueltigkeit" size="8"> (TT.MM.JJ)</td></tr>!;
  print qq!</table>!;
  print qq!<input type="submit" value="Promotions-Gutschein erstellen"><p>!;
  print qq!Beispiele:<br>!;
  print qq!- Ein Werbe-Gutschein &uuml;ber 5 EUR, der frei verbreitet wird, muss <b>beliebig oft</b> einl&ouml;sbar sein,\n!;
  print qq!da verschiedene Kunden den gleichen Gutschein-Code eingeben werden.<br>!;
  print qq!- Ein Hauptgewinn bei einem Gewinnspiel &uuml;ber einen Gutschein mit 25 EUR muss <b>nur einmal</b> einl&ouml;sbar sein,\n!;
  print qq!da diesen Gutschein-Code nur genau ein Kunde erhalten soll.<br>!; 
  print qq!</form>!;


  print qq!<hr size=-1>!;
  print qq!<form action="$skript">!;
  print qq!<input type="hidden" name="gutschein_verwaltung" value="$admin_passwort">!;
  print qq!<input type="hidden" name="create_promo_gutschein" value="1">!;
  print qq!<input type="hidden" name="gutschein_ausgeloest" value="-9999999">!;
  print qq!<input type="hidden" name="gutschein_aktiontyp" value="0">!;
  print qq!<b>Mail-Gutschein erstellen</b> (wird automatisch per Mail an Kunde oder Shopinhaber geschickt)<br>!;
  print qq!<table>!;
  print qq!<tr><td>Aktion von/bis</td><td><input type="text" name="gutschein_aktionvon" size=8"> (TT.MM.JJ) - <input type="text" name="gutschein_aktionbis" size=8"> (TT.MM.JJ) </td></tr>!;
  print qq!<tr><td>Gutschein Laufzeit:</td><td><input type="text" name="gutschein_laufzeit" size="8"> (in Tagen)</td></tr>!;
  print qq!<tr><td>Gutschein ausstellen<br>ab Bestellwert:</td><td><input type="text" name="gutschein_ab" size="8"></td></tr>!;
  print qq!<tr><td>Mindest-Bestellwert:</td><td><input type="text" name="gutschein_ordermin" size="3"></td></tr>!;
  print qq!<tr><td>Gutschein-Wert:</td><td><input type="text" name="gutschein_wert" size="3"></td></tr>!;
  print qq!<tr><td>Gutschein-Text:</td><td><input type="text" name="gutschein_frei" size="50"></td></tr>!;
  print qq!</table>!;
  print qq!<input type="submit" value="Mail-Gutschein erstellen"><p>!;
  print qq!- Mail-Gutscheine werden zu jeder Bestellung automatisch erstellt.<br>!;
  print qq!- der Code zu den Mail-Gutscheinen wird in den Vorlagen der Bestellungsmails mit der Variabel [GUTSCHEIN_MAIL] ausgegeben.<br>!;
  print qq!- Mail-Gutscheine sind in der Gutschein-Verwaltung mit grauem Hintergrund markiert.<p>!;

  print qq!</form>!;


  print "</body></html>";
  exit;
}



sub kunde_admin {

  @ofields=("U_USER","U_PASS","U_NAME1","U_EMAIL","U_STRASSE1","U_PLZ1","U_ORT1");
  $admin_dif=50;

  print "Content-Type: text/html\n\n";
  print "<html><body>";

  print qq!<form action="$shoppl">!;
  print qq!<input type="hidden" name="kunde_admin" value="1">!;
  print qq!<input type="hidden" name="pass" value="$admin_passwort">!;

  print qq!Volltext: <input type="text" name="kunde_search" size=20"> !;
  print qq!<input type="submit" value="Suche"> &nbsp; !;
  print qq!U_NAME1: <input type="text" name="kunde_uname1" size=20"> !;
  print qq!<input type="submit" value="Suche"><br>!;
  print qq!</form>!;
  print "<table width=750>";
  @kdaten=&read_data($kundetxt);

  if ($input{"sort"} ne "") {
    $groupby_index=$input{"sort"};
    @kdaten=sort by_groupby @kdaten;
  }
  $kunde_search=&url_encode($input{"kunde_search"});
  $kunde_uname1=&url_encode($input{"kunde_uname1"});
  $start=$input{"start"};
  $link=qq!$shoppl?kunde_admin=1&pass=$admin_passwort&start=$start&kunde_search=$kunde_search&kunde_uname1=$kunde_uname1!;


  print "<tr>";
   foreach $ofields (@ofields) {
    $k=$uindex{$ofields};
    print qq!<th><a href="$link&sort=$k">$ofields</a></th>!;
  }
  print "</tr>";
  $anz=0;$all=0;
  foreach $kdaten (@kdaten) {
    $kdaten=~s/\"//g;

    @d=split(/\;/,$kdaten);
    $all++;
    if ((($input{"kunde_search"} eq "" && $input{"kunde_uname1"} eq "") ||

($kdaten=~/$input{"kunde_search"}/i && $input{"kunde_search"}  ne "") ||
($d[$uindex{"U_NAME1"}]=~/$input{"kunde_uname1"}/i && $input{"kunde_uname1"} ne "")) && $all>=$input{"start"} && $anz<=$admin_dif) {
      $anz++;
      print "<tr>";
      foreach $ofields (@ofields) {
        if ($ofields eq "U_USER") {
          print qq!<td><a name="$d[$uindex{$ofields}]"></a><a href="$skript?kunde_edit=$d[$uindex{$ofields}]&pass=$admin_passwort">$d[$uindex{$ofields}]</a></td>!;
        } else {
          print "<td>$d[$uindex{$ofields}]</td>";
        }
      }
      print "</tr>\n";
    }
  }
  print "</table>";

  print "<hr size=1>";


  if ($input{"start"}>0) {
    $next=$input{"start"}-$admin_dif;
    print qq!<a href="$shoppl?kunde_admin=1&pass=$admin_passwort&start=$next&kunde_search=$kunde_search&kunde_uname1=$kunde_uname1">Vorher</a> &nbsp;!;
   }

  if ($anz==$admin_dif+1) {
    $next=$input{"start"}+$admin_dif;
    print qq!<a href="$shoppl?kunde_admin=1&pass=$admin_passwort&start=$next&kunde_search=$kunde_search&kunde_uname1=$kunde_uname1">Weiter</a>!;
  }

  exit;
}

sub kunde_new {
  print "Content-Type: text/html\n\n";
  print "<html><body>";
  print qq!<form action="$skript" method="POST">!;
  print qq!<input type="hidden" name="pass" value="$admin_passwort">!;
  print qq!<input type="hidden" name="adduser" value="1">!;
  print qq!<input type="hidden" name="t" value="temok">!;

  print "<table width=550>";
    foreach $userf (@userf) {
      print "<tr>";
      print "<td width=150>$userf</td>";
      if ($userf ne "U_KNR") {
        if ($userf eq "U_ONLINEKUNDE") {$v="1";} else {$v="";}
        print qq!<td width=400><input type="text" name="$userf" size="50" value="$v"></td>!;
      } else {
        print qq!<td width=400>automatisch</td>!;
     }
      print "</tr>";
     }

  print "</table><p>";
  print qq!<input type="submit" value="Kunde neu anlegen"> &nbsp; !;
  print "</form>";
  exit;
}

sub kunde_edit {
  local($knr)=@_;
  @kdaten=&read_data($kundetxt);
  $#nkdaten=-1;
  foreach $kdaten (@kdaten) {
    $kdaten=~s/\"//g;
    @d=split(/\;/,$kdaten);
    if ($d[$uindex{$user_login_field}] eq $knr) {
      @myd=@d;
      if ($input{"do_edit"}==1 && $input{"do_kill"} eq "") {
        foreach $userf (@userf) {
          if (defined($input{$userf})) {
            $myd[$uindex{$userf}]=$input{$userf};
          }
        }
        $kdaten=join(';',@myd);
        push(@nkdaten,$kdaten);
      }
    } else {
      push(@nkdaten,$kdaten);
    }
  }
  if ($input{"do_edit"}==1) {
    &save_array($kundetxt,"kundetxt",@nkdaten);
  }

  print "Content-Type: text/html\n\n";
  print "<html><body>";

  if ($input{"do_ikunde"} ne "") {

    unlink "../exportfz73s/"."ikunde.txt";
    @edaten=&read_data("./export/temp.txt");
    foreach $edaten (@edaten) {
      $export{$edaten}=1;
    }
    foreach $kdaten (@kdaten) {
      @user_daten=split(/\;/,$kdaten);
      if ($export{$user_daten[$uindex{"U_KNR"}]}==1) {

  if ($user_daten[$uindex{"U_FIRMA"}] ne "") {
    $match{"Vorname"}="";
    $match{"Name"}="U_FIRMA";
    $match{"Name2"}="U_FIRMA";
    $match{"Anrede"}="Firma";
    $match{"xzanrede"}="U_ANREDE";
    $match{"xzvorname"}="U_VORNAME";
    $match{"xzname"}="U_NAME";
  } else {
    $match{"Vorname"}="U_VORNAME";
    $match{"Name"}="U_NAME";
    $match{"Name2"}="U_NAME";
    $match{"Anrede"}="U_ANREDE";
    $match{"xzanrede"}="";
    $match{"xzvorname"}="";
    $match{"xzname"}="";
  }

  $first=0;
  @l2=&read_data("../exportfz73s/"."ikunde.txt");
  if ($#l2<=0) {$first=1;}
  open(f,">>"."../exportfz73s/"."ikunde.txt");
  if ($first==1) {print f join("\t",@ikunde_fields)."\n";}
  foreach $ikunde_fields (@ikunde_fields) {

    if ($ikunde_fields eq "Name") {
      $help=$user_daten[$uindex{$match{$ikunde_fields}}];
      $help=substr($help,0,40);
      print f "$help\t";
    } elsif ($ikunde_fields eq "Name2") {
      $help=$user_daten[$uindex{$match{$ikunde_fields}}];
      $help=substr($help,40,length($help));
      print f "$help\t";

    } elsif ($match{$ikunde_fields}!~/^U_/) {
      print f "$match{$ikunde_fields}\t";
    } elsif ($match{$ikunde_fields}=~/\,/) {
      @ik=split(/\,/,$match{$ikunde_fields});
      foreach $ik (@ik) {
        print f $user_daten[$uindex{$ik}]." ";
      }
      print f "\t";
    } else {
     if (defined($match{$ikunde_fields})) {

      print f "$user_daten[$uindex{$match{$ikunde_fields}}]\t";
    } else {
      print f "\t";
    }
    }
  }
  print f "\n";
  close(f);




      }
    }
    unlink "./export/temp.txt";
    print qq!<b>Export erfolgreich.</b><br>!;
    print qq!Download &uuml;ber rechte Maustaste, Ziel speichern unter:<br>!;
    print qq!<a href="../exportfz73s/ikunde.txt">ikunde.txt</a>!;
    exit;
  }
  if ($input{"do_kill"} ne "") {
    print "Der Datensatz wurde gelöscht.";exit;
  }
  if ($input{"do_export"} ne "") {

    $#nedaten=-1;
    @edaten=&read_data("./export/temp.txt");
    $new=1;
    foreach $edaten (@edaten) {
      if ($edaten eq $knr) {
        $new=0;
      }
      if ($input{"deselect"} eq "" || $edaten ne $input{"deselect_me"}) {
        push(@nedaten,$edaten);
      }
    }
    if ($new==1) {push(@nedaten,$knr);}
    @nedaten=sort(@nedaten);
    &save_array("./export/temp.txt","exporttxt",@nedaten);
    @edaten=@nedaten;

    print qq!<form action="$skript">!;
    print qq!<input type="hidden" name="pass" value="$admin_passwort">!;
    print qq!<input type="hidden" name="kunde_edit" value="$knr">!;
    print qq!<input type="hidden" name="do_export" value="1">!;

    print qq!<b>Export ikunde.txt:</b><br>!;
    print qq!<table><tr><td>!;
    print qq!Zum Export markiert:<br>!;
    print qq!<select name="deselect_me">!;
    foreach $edaten (@edaten) {
      print qq!<option value="$edaten">$edaten!;
    }
    print qq!</select>!;
    print qq!</td><td><input type="submit" name="do_ikunde" value="Export starten"><br>!;
    print qq!<input type="submit" name="deselect" value="Deselektieren"></td></tr>!;
    print qq!</table>!;
    print qq!</form>!;
    exit;
  }
  print qq!<form action="$skript" method="POST">!;
  print qq!<input type="hidden" name="pass" value="$admin_passwort">!;
  print qq!<input type="hidden" name="kunde_edit" value="$knr">!;
  print qq!<input type="hidden" name="do_edit" value="1">!;
  print "<table width=550>";
    foreach $userf (@userf) {
      print "<tr>";
      print "<td width=150>$userf</td>";
      if ($userf ne "U_KNR") {
        print qq!<td width=400><input type="text" name="$userf" size="50" value="$myd[$uindex{$userf}]"></td>!;
      } else {
        print qq!<td width=400>$myd[$uindex{$userf}]</td>!;
     }
      print "</tr>";
     }

  print "</table><p>";
  print qq!<input type="submit" value="&Auml;ndern"> &nbsp; !;
  print qq!<input type="submit" name="do_kill" value="L&ouml;schen">!;
  print "</form>";
#  print qq!<form action="$skript" target="unten">!;
#  print qq!<input type="hidden" name="kunde_edit" value="$knr">!;
#  print qq!<input type="hidden" name="pass" value="$admin_passwort">!;
#  print qq!<input type="hidden" name="do_export" value="1">!;
#  print qq!<input type="submit" value="Export in ikunde.txt">!;
#  print qq!</form>!;
  exit;

}

sub merke {
  local($id,$merke_delete)=@_;

  $merke_menge=1;
  if ($merke_delete==1) {$merke_menge=0;}
#  if ($user_daten[$uindex{"$user_login_field"}] eq "") {
#      &abbruch(qq!Bitte zuerst <a href="https://vinylroyal.de/cgi-bin/hws/shop.pl?t=temlogin">einloggen</a>, um die Merken-Funktion zu nutzen.!);
#   }
  if ($user_daten[$uindex{"$user_login_field"}] eq "") {return;}
  open(f,">>${datadirectory}merke.dat");
  print f join(';',"$mday.$month.$year","$hour:$minute",$user_daten[$uindex{"$user_login_field"}],$id,$merke_menge)."\n";
  close(f);
}

sub admin {
 print "Content-type: text/html\n\n";
 print "<html><body>";
 print "<h3>WebShop Administration:</h3>";
 print qq!<ol><li><form action="$shoppl" method="POST">!;
 print qq!<input type="hidden" name="pass" value="$admin_passwort">!;
 print qq!<b>Artikel editieren:</b><br>!;
 print qq!Artikel-Nr.: <input type="text" name="update" size=10">\n!;
 print qq!<input type="submit" value="Artikel editieren">!;
 print qq!</Form>!;
 print qq!<li><form action="$shoppl" method="POST">!;
 print qq!<input type="hidden" name="pass" value="$admin_passwort">!;
 print qq!<input type="submit" name="update" value="Neuen Artikel eintragen">!;
 print qq!</form>!;


 print qq!<li><form action="$shoppl" method="POST">!;
 print qq!<b>Gutschein-Verwaltung:</b><br>!;
 print qq!<input type="hidden" name="gutschein_verwaltung" value="$admin_passwort">!;
 print qq!<input type="submit"  value="Gutschein-Verwaltung starten">!;
 print qq!</form>!;

 print qq!<li><form action="$shoppl" method="POST">!;
 print qq!<input type="hidden" name="pass" value="$admin_passwort">!;
 print qq!<input type="hidden" name="kaufabbruch" value="1"> !;
 print qq!<input type="submit"  value="Bestellabbr&uuml;che">!;
 print qq!</form>!;

 if ($use_partner_db==1) {
   print qq!<li><form action="$shoppl" method="POST">!;
   print qq!<input type="hidden" name="pass" value="$admin_passwort">!;
   print qq!<b>Status einer Bestellung setzen:</b><br>!;
   print qq!<table><tr><td>Bestell-Nr.:</td><td><input type="text" name="status_ordernr" size=20></td></tr>!;
   print qq!<tr><td valign=top>Neuer Status:</td><td><input type="text" name="new_status" size=20><br><font size=2>(z.b. "OK" oder "Bestellung ung&uuml;ltig" etc.)</td></tr></table>!;
   print qq!<input type=submit value="Status eintragen">!;
   print qq!</form>!;
   print qq!<li><form action="$shoppl" method="POST">!;
   print qq!<input type="hidden" name="pass" value="$admin_passwort">!;
   print qq!<b>Provisions-Korrekturen durch Stornierungen oder zurückgesendete Waren eintragen:</b><br>!;
   print qq!<table><tr><td>Partner-ID (PID):</td><td><input type="text" name="correct_prov" size=20></td></tr>!;
   print qq!<tr><td valign=top>Warenwert-Minderung um einen Betrag von:</td><td><input type="text" name="minus_prov" size=20></td></tr>!;
   print qq!<tr><td valign=top>Begründung:</td><td><input type="text" name="reason_prov" size=20></td></tr>!;
   print qq!</table>!;

   print qq!<input type=submit value="Status eintragen">!;
   print qq!</form>!;
   print qq!<li><form action="$shoppl" method="POST">!;
   print qq!<input type="hidden" name="pass" value="$admin_passwort">!;
   print qq!<b>&Uuml;berweisung an Partner (Reseller) eintragen:</b><br>!;
   print qq!<table><tr><td>Partner-ID (PID):</td><td><input type="text" name="pay_partner" size=20></td></tr>!;
   print qq!<tr><td>Überwiesener Betrag:</td><td><input type="text" name="sum_pay_partner" size=10></td></tr></table>!;
   print qq!<input type="submit" value="Überweisung an Partner eintragen">!;
   print qq!</form>!;

   print qq!<li><form action="$shoppl" method="POST">!;
   print qq!<input type="hidden" name="show_prov" value="1">!;
   print qq!<input type="hidden" name="pass" value="$admin_passwort">!;
   print qq!<b>Übersicht aller Bestellungen über das Partnermodul:</b><br>!;
   print qq!<table><tr><td>Monat</td><td><input type="text" name="month" value="$month" size=10></td></tr>!;
   print qq!<tr><td>Jahr</td><td><input type="text" name="year" value="$year" size=10></td></tr>!;
   print qq!<tr><td>Partner-ID (PID):</td><td><input type="text" name="show_prov_pid" value="ALL" size=10></td></tr></table>!;
   print qq!<input type="submit" value="Übersicht anzeigen">!;
   print qq!</form>!;
 }
 print qq!</ol>!;
 print "</body></html>";
 exit;
}


sub pic_update {
 local($nr,$content,$ufile,$pass)=@_;
 $picnr=$CGI{"pic"};

 $this_pic=$nr;
  @a=split(/ \* /,$this_pic);
 $this_pic=$a[0];

 $this_pic=~s/\s//g;
 $this_pic=~s/[\\\/]//g;


 $endung="";
 if ($ufile=~/\.gif/i) {$endung=".gif";}
 if ($ufile=~/\.jpg/i) {$endung=".jpg";}

 if ($ufile eq "") {
   unlink "$picverz[$picnr]$this_pic.gif";
   unlink "$picverz[$picnr]$this_pic.jpg";
 } else {
   open(f,">$picverz[$picnr]$this_pic$endung");
   binmode f;
   print f $content;
   close(f);
 }


 &update($nr,$pass);
}

sub admindelete {
  local($pass)=@_;
  if ($pass ne $admin_passwort) {&abbruch("Falsches Passwort");}
  &get_input;
  foreach $keyval (@keyval) {
    @field=split(/\;/,$keyval);                             # Felder ermitteln
    if ($field[0]=~/^delete_(.*)/) {
     $del{$1}="ok";

     }
   }
  $#new_article_dat=-1;
  foreach $article_dat (@article_dat) {
     @a=split(/$trennzeichen/,$article_dat);
     if ($del{$a[$id_article_id]} eq "") {
       push(@new_article_dat,$article_dat);
     }
  }
  @article_dat=@new_article_dat;
  &save_array($articledat,"article",@article_dat);
}

sub update {
  local($nr,$pass)=@_;

  if ($pass ne $admin_passwort) {&abbruch("Falsches Passwort");}
  @adata=&get_article_data($nr);


  $do_update=0;
  foreach $keyw (@keyw) {
    if (defined($input{"update_$keyw"})) {
      $adata[$index{$keyw}]=$input{"update_$keyw"};
      $do_update=1;
    }
  }
  $gef=0;
  if ($do_update==1) {
    foreach $article_dat (@article_dat) {
      @a=split(/$trennzeichen/,$article_dat);
      if ($a[$id_article_id] eq $nr) {
        $article_dat=join(';',@adata);
        $gef=1;
      }
    }
    if ($gef==0) {
      push(@article_dat,join($trennzeichen,@adata));
    }
    &save_array($articledat,"article",@article_dat);
  }
  $#article=-1;
  push(@article,join(';',@adata));

  if ($input{"exit_update"}==1 || $CGI{"exit_update"}==1) {return;}

  $table=qq!<form action="$shoppl" method="POST">\n!;
  $table.=qq!<input type="hidden" name="update" value="$nr">\n!;
  $table.=qq!<input type="hidden" name="pass" value="$admin_passwort">\n!;
  $table.=qq!<table border="0">\n!;
  $i=0;
   foreach $keyw (@keyw) {
    $value="$adata[$i]";
    if ($input{$keyw} ne "") {$value=$input{$keyw}}
    if ($keyw eq "NR" && $nr eq "neu") {$value=time;}

    if ($keyw ne "BESCHREIBUNG") {
      $table.=qq!<tr><td><b>$keyw</b><br><input type="text" name="update_$keyw" size=120 value="$value"></td></tr>\n!;
    } else {
      $value=~s/\<br\>/\n/g;
     $table.=qq!<tr><td><b>$keyw</b><br><textarea name="update_$keyw" cols=100 rows=6 wrap="on">$value</textarea></td></tr>\n!;

    }
    $i++;
  }
  $table.="</table>";
  $table.=qq!<input type="submit" value="Artikel &auml;ndern">!;
  $table.="</form>\n";

  $i=-1;
  foreach $pichttp (@pichttp) {
    $i++;$j=$i+1;
    $table.=qq![REPEAT_ARTIKEL]<form action="$shoppl" method="POST" enctype="multipart/form-data">\n!;
    $table.=qq!<input type="hidden" name="update" value="$nr">\n!;
    $table.=qq!<input type="hidden" name="pass" value="$admin_passwort">\n!;
    $table.=qq!<input type="hidden" name="pic" value="$i">\n!;
    $table.=qq![PIC$j]<br><b>$pichttp[$i]</b><br>!;
    $table.=qq!<input type=file name="UploadedFile" size=90>\n!;
    $table.=qq!<input type="submit" value="Bild Upload">!;
    $table.=qq!</form>[REPEAT_ARTIKEL_END]!;
  }

  print "Content-type: text/html\n\n";
  print "<html><body>".&parse_line($table)."</body></html>";
  exit;
}



# ==========================================================================================
# Hinzufügen eines Eintrags in die Datenbank über ein Web-Formular!
# ==========================================================================================

sub add_to_db {
  local($db)=@_;


  $#new_entry=-1;
  foreach $keyw (@keyw) {
    if ($input{"$keyw"} ne "") {
      $new_entry[$index{$keyw}]=$input{"$keyw"};
    }
  }

  open(f,">>$datadirectory$db");
  print f join(';',@new_entry)."\n";
  close(f);
}

# ==========================================================================================
# Funktion zum Entfernen "überflüssiger" Bilder, also i.d.R. Grafiken, die zu Artikeln
# gehören, die gelöscht wurden.
# ==========================================================================================

sub pic_show_or_kill {
  local($pic_kill)=@_;
  foreach $article_dat (@article_dat) {
    @array=split(/$trennzeichen/,$article_dat);
    $array[$index{"NR"}]=~s/\s//g;
    $array[$index{"NR"}]=~s/[\\\/]//g;
    $is_ok{$array[$index{"NR"}]}=1;
  }

  print "Content-type: text/html\n\n";
  print "<html><body>";
  $ok=1;
  foreach $picverz (@picverz) {
    opendir (VERZ, "$picverz");
    @datei= grep (!/^\.\.?$/, readdir VERZ);
    closedir VERZ;

    foreach $datei (@datei) {
      if ($datei=~/\.gif$/i || $datei=~/\.jpg$/) {
        $d=$datei;
        $d=~s/\.gif//gi;
        $d=~s/\.jpg//gi;
        if ($is_ok{$d}==0 && $datei ne $default_pic) {
          if ($pic_kill==0) {
            $ok=0;
            print "Die Datei $picverz$datei kann gel&ouml;scht werden.<br>\n";
          } else {
            $ok=0;
            unlink "$picverz[0]$datei";
            print "Die Datei $picverz$datei wurde gel&ouml;scht.<br>\n";
          }
        }
      }
    }
  }
  if ($ok==1) {
    print "Alles in Ordnung!";
  }
}


sub shasign {
  local($secure)=@_;
  use Digest::MD5  qw(md5_hex);
  $digest = md5_hex($secure);
  return $digest;
}


# ==========================================================================================
# Kontrolle der Felder der Bestellungsseite, die zwingend einen Inhalt haben müssen.
# Um diese Felder zu definieren, kann das Formular auf der Bestellseite ein HIDDEN-Feld mit
# Namen "required" enthalten. Beispiele:
# <input type=hidden name="required" value="Name,Email,Strasse">
# ==========================================================================================

sub kontrolliere_required {
  local($required,@required);

  $c=&CC_Verify($input{"Kartentyp"},$input{"Kartennummer"});
  if ($c==0) {
    &abbruch("Die Kreditkarten-Daten sind leider ung&uuml;ltig.");
  }

  $required=$input{"required"};                             # Das Feld mit Namen "requried" einlesen
  @required=split(/\,/,$required);                          # Felder ermitteln
  foreach $required (@required) {                           # Alle Felder durchlaufen
    if ($input{$required} eq "") {                          # Falls das angegebene Feld nicht ausgefüllt wurde...
      &abbruch("Bitte f&uuml;llen Sie das Feld <b>$required</b> aus. Vielen Dank!")        # Fehlermeldung ausgeben!
    }
  }
}

# ==========================================================================================
# Ermittelt die User-ID des Benutzers
# ==========================================================================================

sub get_user_id {

  @robots=split(/\,/,$robots);
  foreach $robots (@robots) { 
     if ($ENV{'HTTP_USER_AGENT'}=~/$robots/) {
        return "9999";
     } 
   }

  if ($input{"userid"} ne "") {                                   # Falls UserId per Formulareingabe uebergeben wird...

 $input{"userid"}=int($input{"userid"});
 foreach $kunde_dat (@kunde_dat) {
    $kunde_dat=~s/\[USER_ID\]/$min_userid/g;
    @kunde=split(/\;/,$kunde_dat);                      # Kundendaten holen
    if ($input{"userid"} eq $kunde[$id_kunde_kundennr]) {
      @user_daten=split(/\|/,$kunde[$id_kunde_userdata]);   
   }
 }
  


    return int($input{"userid"});

  }
  $cookie_name="userid";
   if($ENV{HTTP_COOKIE} ne "") {
     @ckArry = split(/; /,$ENV{HTTP_COOKIE});
     foreach (@ckArry){
       if($_ =~ /$cookie_name/)  {
          ($cookieName, $cookieVal) = split (/=/,$_)
        }          
     }
     if ($cookieVal ne "") {$input{"userid"}=$cookieVal;

#  open(f,">>session3.txt");
#  print f "$mday.$month.$year $hour:$minute *".$input{"userid"}."* $knr $global[$id_global_remotehost] $buffer\n";
#  close(f);

     return int(&search_user($input{"userid"}));}
   }

  if ($input{"userid"} ne "") {                                   # Falls UserId per Formulareingabe uebergeben wird...
    $input{"userid"}=int($input{"userid"});

#  open(f,">>session.txt");
#  print f "$mday.$month.$year $hour:$minute *$neu_kunde* $knr $global[$id_global_remotehost] $buffer\n";
#  close(f);

    return int(&search_user($input{"userid"}));
  }
  else {
    return int(&search_user(""));                                    # Ansonsten UserId suchen
  }
}



# ==========================================================================================
# Kontrolliert, ob zwei Angaben (zusammengesetzt aus REMOTE_HOST und HTTP_VIA) vom selben
# Kunden stammen (inkl. Proxy Test!)
# ==========================================================================================

sub check_equal {
  local($r1,$r2)=@_;                                        # Einlesen der zwei Angaben
  @host_http1=split(/\#/,$r1);                              # Angaben in REMOTE_HOST und HTTP_VIA zerlegen
  @host_http2=split(/\#/,$r2);
  if ($host_http1[3] ne $host_http2[3]) {return 0;}         # Browser gleich?
  if ($host_http2[1] eq ''  || $host_http1[1] eq '') {      # Falls keine HTTP_VIA Angabe => Keine Proxys, direkte Verbindung, einfach zu handeln
    @ip1=split(/\./,$host_http1[0]);
    @ip2=split(/\./,$host_http2[0]);
    if  ( ( ($ip1[0]==195 && $ip1[1]==14) || ($ip1[0]==194 && $ip1[1]==8)) &&
          ( ($ip2[0]==195 && $ip2[1]==14) || ($ip2[0]==194 && $ip2[1]==8))) {return 1;}
    if ($ip1[0]==195 && $ip1[1]==93) {
       if ($ip1[0] ne $ip2[0] || $ip1[1] ne $ip2[1]) {return 0;}       # Falls IPs ungleich => nicht derselbe Kunde
    } else {
       if ($ip1[0] ne $ip2[0] || $ip1[1] ne $ip2[1] || $ip1[2] ne $ip2[2]) {return 0;}       # Falls IPs ungleich => nicht derselbe Kunde
    }

    return 1;                                               # Ansonsten ist es derselbe Kunde
  }

  if ($host_http1[1] eq $host_http2[1]) {return 1;}         # Falls HTTP_VIA gleich => derselbe Kunde
  @http_via1=split(/ /,$host_http1[1]);                     # HTTP_VIA z.B.: "HTTP/1 speth13.dort01.t-online.de"
  @http_via2=split(/ /,$host_http2[1]);
  @p1=split(/\./,$http_via1[1]);                            # Untersucht werden soll der Teil: speth13.dort01.t-online.de
  @p2=split(/\./,$http_via2[1]);
  if ($p1[1] ne $p2[1]) {return 0;}                         # 2. Teil untersuchen
  if ($p1[2] ne $p2[2]) {return 0;}                         # 3. Teil untersuchen
  $first1=$p1[0];                                           # 1. Teil untersuchen
  $first2=$p2[0];
  $min=length($first1);                                     # min. Zeichenfolge ermitteln
  if (length($first2)<$min) {$min=length($first2)}
  $first1=substr($first1,0,3);                         # jeweils vom 1. Teil nur die ersten Zeichen verwenden
  $first2=substr($first2,0,3);
  if ($first1 ne $first2) {return 0;}                       # Zeichenketten vergleichen
  return 1;
}


sub get_global_data {
  local($g)=@_;
  @global_keyvalues=split(/\~/,$g);
  foreach $global_keyvalues (@global_keyvalues) {
    @kv=split(/\=/,$global_keyvalues);
    if (!defined($input{"$kv[0]"})) {
      $input{"$kv[0]"}=$kv[1];
      $global{$kv[0]}=$kv[1];
    }
  }
}

sub get_global_data_string {
  local($g);
  local($key);
  foreach $key (sort(keys %global)) {
    $global{$key}=~ s/\cM\n/ /g;
    $g.=$key. '='. $global{$key}. "~";
  }
  return $g;
}

# ==========================================================================================
# Sucht nach einem User und gibt dessen Kunden-Nr. zurueck.
# Wenn User nicht in Liste oder laenger als max_minuten_inaktiv in Liste, wird auf die
# Prozedur create_new_kunde verwiesen.
# Wenn der User gefunden wurde und im Bereich max_minuten_inaktiv ist, wird der alte Eintrag
# geloescht, der User mit neuer Zeit am Anfang der Liste eingefuegt und die Kundennummer
# zurueckgegeben.
# ==========================================================================================

sub search_user {
  local($opt_id)=@_;
  local($is_equal);
  my @kunde;
  my @kd;

  $knr=0;
  $#new_kunde_dat=-1;
  foreach $kunde_dat (@kunde_dat) {
    $kunde_dat=~s/\[USER_ID\]/$min_userid/g;
     @kunde=split(/\;/,$kunde_dat);                      # Kundendaten holen
    $vergangene_minuten=$now_tage*24*60+$now_minuten-($kunde[$id_kunde_tage]*24*60+$kunde[$id_kunde_minuten]);
     if ($vergangene_minuten<=$max_minuten_inaktiv) {      # Vergangene Minuten mit eingestellter Zeit vergleichen

      $is_equal=0;
      if ($opt_id eq "") {
        if (&check_equal($kunde[$id_kunde_remotehost],$global[$id_global_remotehost])==1) {    # Falls IP-Adresse+HTTP_VIA uebereinstimmen
          $is_equal=1;
        }
      } else {
        if ($opt_id eq $kunde[$id_kunde_kundennr]) {
          $is_equal=1;
        }
      }
     if ($is_equal==1) {
        $kunde[$id_kunde_tage]=$now_tage;                   # Kundendaten zuweisen
        $kunde[$id_kunde_minuten]=$now_minuten;
        &get_global_data($kunde[$id_kunde_global]);
        $kunde[$id_kunde_global]=&get_global_data_string;
        $knr=$kunde[$id_kunde_kundennr];
        @user_daten=split(/\|/,$kunde[$id_kunde_userdata]);
        @partner_daten=split(/\|/,$kunde[$id_kunde_partnerdata]);
      }
      push(@new_kunde_dat,join(';',@kunde));
    } else {
      $killdat=&get_basketdat($kunde[$id_kunde_kundennr]);     # Warenkorb holen
      unlink "$killdat";                                       # Warenkorb loeschen
      if ($dif_porto!=0) {
        $killdat2=&get_portodat($kunde[$id_kunde_kundennr]);   # Portodat
        unlink "$killdat2";                                    # löschen
      }
    }
  }



  @okunde_dat=@kunde_dat;$neu_kunde=0;
  if ($knr==0) {
    $neu_kunde=1;
    @nk=&create_new_kunde;
    if ($opt_id ne "" && $is_equal==0) {
      $nk[$id_kunde_kundennr]=$opt_id;
    }
    $nk[$id_kunde_global]=&get_global_data_string;
    push(@new_kunde_dat,join(';',@nk));
    @kunde_dat=@new_kunde_dat;
    $knr=$nk[$id_kunde_kundennr];
  }
#  open(f,">>session.txt");
#  print f "$mday.$month.$year $hour:$minute *$neu_kunde* $knr $global[$id_global_remotehost] $buffer\n";
#  close(f);

  if ($vergangene_minuten>3 || join("\n",@new_kunde_dat) ne join("\n",@okunde_dat)) {
    &save_array($kundedat,"kunde",@new_kunde_dat);          # Speichern
   }
  return $knr;                                            # neuer Kunde
}


# ==========================================================================================
# Ein neuer Kunde wird erstellt und in die Kundenliste am Anfang eingefuegt.
# Falls die Kundenliste mehr als max_user Eintraege hat, werden die aeltesten Eintraege
# (stehen hinten) geloescht. Die Profil-Dateien werden ebenfalls geloescht.
# Anschliessend wird solange eine beliebige Zuf-Zahl aus dem Bereich min_userid-max_userid
# gewaehlt, bis es KEINE Profil-Datei zu der Kundennr. gibt. Der neue Kunde ist dann
# gefunden. Die Kunden-Felder werden gesetzt und er wird an den Anfang der Liste eingefuegt.
# ==========================================================================================

sub create_new_kunde {
  srand();                                                  # Zuf-Generator initialisieren

#  &lock("stat");
  @s=&read_data($statistikdat);
  $found=0;
  foreach $s (@s) {
    @z=split(/\;/,$s);
    if ($z[0]=~/$mday\.$month\.$year/) {
      $z[1]++;
      $s=join(';',@z);
      $found=1;
    }
  }
  if ($found==0) {
    push(@s,join(';',"$mday.$month.$year",1));
  }
  &save_array($statistikdat,"statistik",@s);
#  &unlock("stat");

  do {                                                      # Wiederhole solange...
    $zuf=int rand($max_userid-$min_userid+1)+$min_userid;   # und berechne eine Zuf-Zahl
    $basketdat=&get_basketdat($zuf);                        # und den dazugeh. Warenkorb
  } while (&exist($basketdat));                             # wie der Warenkorb exisitert
  &new($basketdat,$basketdat);                              # Warenk. ex. nicht. Wird also neu erstellt.
  if ($dif_porto!=0) {
    $portodat=&get_portodat($zuf);
    &new($portodat,$portodat);
  }
  $#new_kunde=-1;                                           # Kundendaten zuweisen
  $new_kunde[$id_kunde_remotehost]=$global[$id_global_remotehost];
  $new_kunde[$id_kunde_kundennr]=$zuf;
  $new_kunde[$id_kunde_tage]=$now_tage;
  $new_kunde[$id_kunde_minuten]=$now_minuten;
  $new_kunde[$id_kunde_userdata]="";
  $new_kunde[$id_kunde_partnerdata]="";
  $new_kunde[$id_kunde_global]="";

  return @new_kunde;
}


# ==========================================================================================
# Fuer eine Kundennr (Input) wird die zugehoerige Profil-Datei zurueckgegeben.
# ==========================================================================================

sub get_basketdat {
  local($filename)=@_;                                      # Kundennr. als Paramter
  while (length($filename)<7) {$filename="0".$filename;}   # "0.." am Anfang einfuegen
  return ($profiledirectory."k$filename.txt");              # Rückgabe
}

sub get_portodat {
  local($filename)=@_;                                      # Kundennr. als Paramter
  while (length($filename)<7) {$filename="0".$filename;}   # "0.." am Anfang einfuegen
  return ($profiledirectory."p$filename.txt");              # Rückgabe
}

# ==========================================================================================
# Gibt anhand der Art.Nr die Daten eines Artikels zurueck.
# ==========================================================================================

sub get_article_data {
 local($id)=@_;                                            # ID einlesen
 local(@article_fields,$article_dat);
  foreach $article_dat (@article_dat) {                     # Artikel durchlaufen
    @article_fields=split(/$trennzeichen/,$article_dat);               # Felder ermitteln
    @id_search=split(/ \, /,$article_fields[$id_article_id]);

    foreach $id_search (@id_search) {
      if ($id_search eq $id) {           # Falls ID gefunden...

        $article_fields[$id_article_id]=$id_search;
        return @article_fields;                               # Artikel Daten zurückgeben
      }
    }
  }


  foreach $article_dat (@article_dat) {                     # Artikel durchlaufen
    @article_fields=split(/$trennzeichen/,$article_dat);               # Felder ermitteln
    @id_search=split(/ \, /,$article_fields[$index{"NUMMER"}]);

    foreach $id_search (@id_search) {
      if ($id_search eq $id) {           # Falls ID gefunden...

 #       $article_fields[$id_article_id]=$id_search;
         return @article_fields;                               # Artikel Daten zurückgeben
      }
    }
  }


  return -1;
}

sub get_article_data_nummer {
 local($id)=@_;                                            # ID einlesen
 local(@article_fields,$article_dat);
  foreach $article_dat (@article_dat) {                     # Artikel durchlaufen
    @article_fields=split(/$trennzeichen/,$article_dat);               # Felder ermitteln
    @id_search=split(/ \, /,$article_fields[$index{"NUMMER"}]);

    foreach $id_search (@id_search) {
      if ($id_search eq $id) {           # Falls ID gefunden...

        $article_fields[$id_article_id]=$id_search;
        return @article_fields;                               # Artikel Daten zurückgeben
      }
    }
  }
  return -1;
}


sub by_groupby_num {
  @b = split(/\;/,$b);
  @a = split(/\;/,$a);
  $a[$groupby_index] <=> $b[$groupby_index];    # presuming integers
}


sub by_groupby {
  @b = split(/\;/,$b);
  @a = split(/\;/,$a);
  $a[$groupby_index] cmp $b[$groupby_index];    # presuming integers
}

sub aliste {
  local($t)=@_;

  @aliste=split(/\,/,$user_daten[$uindex{"U_LISTE"}]);
  foreach $aliste (@aliste) {
    $l{$aliste}=1;
  }

  $#article=-1;
  foreach $article_dat (@article_dat) {
    @afelder=split(/$trennzeichen/,$article_dat);
    if ($l{$afelder[$id_article_id]}==1) {
        push(@article,$article_dat);
    }
  }

  $line=join("\n",&read_data("$tempdirectory$t.htm"));    # Vorlage einlesen
  $line=&parse_line($line);                               # Variablen ersetzen
  print "Content-type: text/html\n\n";
  print $line;                                            # ausgeben
  exit;
}

sub special_request {
  local($f,$c,$t,$start,$dif,$aliste)=@_;
   $start=int($start);
 $c=~s/_(.*)$//g;$input{"c"}=~s/_(.*)$//g;
  if ($start==0) {$start=1;$dif=999;$input{"start"}=1;$input{"dif"}=999;}
  local(%group)=();
if ($input{"c"}=~/\[/) {
    $input{"c"}=~s/\[/\-/g;
    $input{"c"}=~s/\]/\-/g;
  }
 
 

  $oinput{"c"}=$input{"c"};
  

   if ($input{"c"}=~/\-/) {
     $hf=$input{"f"};$hf=~s/\*//g;
     @d=split(/\|/,$input{"c"});
     foreach $d (@d) {

       if ($d=~/(.*?)\-(.*?)\-/) {
     
         $mainartikel=$1;
         $subartikel=$2;  $ende=$';
         $mainartikel=~s/[\(\)]//g;
       
 
          foreach $article_dat (@article_dat) {
             @h=split(/$trennzeichen/,$article_dat);
             if ($h[$index{$hf}] eq $mainartikel) {
               $subartikel=~s/\*/\#/g;
               @help=split(/\,/,$subartikel);
               for ($hh=0;$hh<=$#help;$hh++) {
                  $hh2=$hh+1;
                  $h[$index{"OPTION$hh2"}]=$help[$hh];
               }

              $article_dat=join(';',@h);

             }

          }



         if (length($mainartikel)>5) {$d=$mainartikel.$ende;}

        }
        
     }
     $input{"c"}=join('|',@d);$input{"c"}=~s/\)//g;$input{"c"}=~s/\(//g;


   }

   if ($input{"c"}=~/\{/) {
     $hf=$input{"f"};$hf=~s/\*//g;
     @d=split(/\|/,$input{"c"});

     foreach $d (@d) {



       if ($d=~/(.*?)\{(.*?)\}/) {
          $mainartikel=$1;
      
          $subartikel=$2;


          $ende=$';
          $mainartikel=~s/[\(\)]//g;

         

          if ($hf eq "NUMMER") {
              @mdata=&get_article_data_nummer($mainartikel);            # Daten aus Datenbank holen
          } else {
            @mdata=&get_article_data($mainartikel);            # Daten aus Datenbank holen
          }
          $mainartikel_preis=$mdata[$index{"PREIS"}];
          $mainartikel_binfo=$mdata[$index{"BESTELLUNGSINFO"}];
          $mainartikel_anr=$mdata[$index{"NUMMER"}];
          $mainartikel_nr=$mdata[$index{"NR"}];
          @e=split(/\,/,$subartikel);
          foreach $e (@e) {


           @help=split(/\~/,$e);
           if ($#help>0) {$hhelp=$help[0];$e=$help[1];}
           if ($hhelp==0) {$hhelp=2;}

            if ($hf eq "NUMMER") {
               @edata=&get_article_data_nummer($e);            # Daten aus Datenbank holen
            } else {
               @edata=&get_article_data($e);            # Daten aus Datenbank holen
            }

         
            $mainartikel_preis.=" * ".$edata[$index{"PREIS"}];
#            $mainartikel_binfo.=" * ".$edata[$index{"BESTELLUNGSINFO"}];

            if ($hhelp==1) {$mainartikel_binfo.=" * ".$edata[$index{"NAME"}];}
            if ($hhelp==2) {$mainartikel_binfo.=" * ".$edata[$index{"BESTELLUNGSINFO"}];}
            if ($hhelp==3) {$mainartikel_binfo.=" * ".$edata[$index{"BESCHREIBUNG"}];}


            $mainartikel_anr.=" * ".$edata[$index{"NUMMER"}];
            $mainartikel_nr.=" * ".$edata[$index{"NR"}];
          }
          foreach $article_dat (@article_dat) {
             @h=split(/$trennzeichen/,$article_dat);
             if ($h[$index{$hf}] eq $mainartikel) {
               $h[$index{"PREIS"}]=$mainartikel_preis;
               $h[$index{"BESTELLUNGSINFO"}]=$mainartikel_binfo;
               $h[$index{"ANR"}]=$mainartikel_anr;
               $input{"newNR_".$mdata[$index{"NR"}]}=$mainartikel_nr;
               $article_dat=join(';',@h);

             }

          }
          $d=$mainartikel.$ende;
       }
     }
     $input{"c"}=join('|',@d);$input{"c"}=~s/\)//g;$input{"c"}=~s/\(//g;
# print "$mainartikel_preis";exit;

  }

  if ($f ne "GRUPPE") {
    $lfile=$datadirectory."search.txt";
    $#slist=-1;
    push(@slist,$f,$c);
    $i=1;
    while ($input{"f$i"} ne "") {
      push(@slist,$input{"f$i"},$input{"c$i"});
      $i++;
    }
#    open(f,">>$lfile");
#    print f join(';',@slist,$dif)."\n";
#    close(f);
  }

  &process_order;

  $global[$id_global_content]=$c;
  $global[$id_global_content]=~s/\\s/ /g;


  if ($input{"mliste"}==1) {
    $global[$id_global_content]="Merkliste";
    @d=&read_data($datadirectory."merke.dat");
    foreach $d (@d) {
      @f=split(/\;/,$d);
      if ($f[2] eq $user_daten[$uindex{"$user_login_field"}]) {
        $l{$f[3]}=$f[4];
      }
    }
    $#article=-1;
    foreach $article_dat (@article_dat) {
      @afelder=split(/$trennzeichen/,$article_dat);
      if ($l{$afelder[$id_article_id]}==1) {
          push(@new_article_dat,$article_dat);
      }
    }

  } elsif ($aliste==1) {
   $global[$id_global_content]="Auftragsliste";
    $#new_article_dat=-1;
    @al=&read_data($orderstat);
    foreach $al (@al) {
      @aliste_dat=split(/\;/,$al);
      if ($aliste_dat[2] eq $user_daten[$uindex{"$user_login_field"}]) {
         $l{$aliste_dat[3]}=1;
      }
    }
    $#article=-1;
    foreach $article_dat (@article_dat) {
      @afelder=split(/$trennzeichen/,$article_dat);
      if ($l{$afelder[$id_article_id]}==1) {
          push(@new_article_dat,$article_dat);
      }
    }
  } else {
    $groupby=$input{"groupby"};

    if ($input{"v"}=~/or/i) {
     $or_mode=1;
     } else {
      $or_mode=0;
    }
    $#new_article_dat=-1;


    $#search_c=-1;
    $i="";
    do {
      $f=$input{"f$i"};
      $cs=$input{"c$i"};


      if ($f=~/^\>\=/) {$input{"c$i"}=">=".$cs;$input{"f$i"}=~s/^\>\=//;}
      elsif ($f=~/^\<\=/) {$input{"c$i"}="<=".$cs;$input{"f$i"}=~s/^\<\=//;}
      elsif ($f=~/^\>/) {$input{"c$i"}=">".$cs;$input{"f$i"}=~s/^\>//;}
      elsif ($f=~/^\</) {$input{"c$i"}="<".$cs;$input{"f$i"}=~s/^\<//;}


      $cs=~ s/[öÖ]/[öÖ]/g;
      $cs=~ s/[äÄ]/[äÄ]/g;
      $cs=~ s/[üÜ]/[üÜ]/g;
      if ($input{"use_perl"}==0) {
        $cs =~ s/[.*?+]//g;
      }  else {$cs=~s/\./(\\\.|)/g;}


      if ($input{"search"} eq "ALL") {
         if ($cs!~/"(.*?)"/) {
           $cs='"'.$cs.'"';
          }
      }

      while ($cs=~/"(.*?)"/) {
        $vor=$`;
        $hinter=$';
        $treffer=$1;
        $treffer=~s/ /\<_\>/g;
        $cs=qq!$vor$treffer$hinter!;
      }
      push(@search_c,$cs);
      $i++;
   } while ($f ne "");

   foreach $article_dat (@article_dat) {
      @afelder=split(/$trennzeichen/,$article_dat);

      $i=0;
      $co=0;
      $mo=0;

      $#this_term_ok=-1;
      do  {
        $this_field_ok=0;
        if ($i>0) {
          $f=$input{"f$i"};
          $cs=$search_c[$i];
          $c=$input{"c$i"};
        } else {
          $f=$input{"f"};
          $cs=$search_c[0];
          $c=$input{"c"};
        }
        if ($f eq "OPTION8") {$f="OPT8";}
        if ($f eq "*OPTION8") {$f="*OPT8";}

        @felder=split(/\,/,$f);
        if ($input{"f"} ne "*NAME,*GRUPPE" && $input{"v"} ne "OR") {
          @terms = split(/\s+/, $cs);
        } else {
         $terms[0]=$cs;
        }

        $term_or_mode=0;

        $#is_a_not_term=-1;
        $q=0;
        foreach $terms (@terms) {
          if ($terms=~/^or$/i || $terms=~/^ODER$/i) {
            $term_or_mode=1;
          }
          if ($terms=~/^and$/i || $terms=~/^UND$/i) {
            $terms="";
          }
          if ($terms=~/^-(.*)/) {
            $terms=$1;
            $is_a_not_term[$q]=1;
          }
          $q++;
        }

        $#this_term_ok=-1;
        foreach $felder (@felder) {
          if ($felder=~/^\*(.*)/) {
            $index=$index{"$1"};
            if ($#terms==-1) {
              $this_field_ok=1;
            }
            $q=0;
            foreach $terms (@terms) {
              $suche=$terms;
              $suche=~s/\<_\>/ /g;
              if ($afelder[$index]=~/$suche/i) {
                if ($is_a_not_term[$q]==0) {
                  $this_term_ok[$q]=1;
                } else {
                  $this_term_ok[$q]=-1;
                }
              } elsif ($is_a_not_term[$q]==1) {
                if ($this_term_ok[$q]!=-1) {
                  $this_term_ok[$q]=1;
                }
              }
              $q++;
            }
          } else {
            $this_field_ok=0;
            $index=$index{$f};
            if ($c=~/^(\<\=|\>\=|\>|\<)/) {
              $v=$1;
              $vergleich=$c;
              $vergleich=~s/[\>\<\=]//g;

              if ($vergleich eq "") {
                $this_field_ok=1;
              } elsif ( ($afelder[$index]>$vergleich && $v eq '>') ||
                   ($afelder[$index]<$vergleich && $v eq '<') ||
                   ($afelder[$index]>=$vergleich && $v eq '>=') ||
                   ($afelder[$index]<=$vergleich && $v eq '<=')
                 ) {$this_field_ok=1;}
            }
            elsif ($afelder[$index] eq $c || $c eq "") {
              $this_field_ok=1;
            }
          }
        }
        if ($#this_term_ok>=0) {
#          &abbruch($f.$article_dat.$or_mode);
          $this_field_ok=1;
          for ($zz=0;$zz<=$#terms;$zz++) {
             if ($this_term_ok[$zz]<=0) {$this_field_ok=0;}
          }
          if ($term_or_mode==1) {
            $this_field_ok=1;
          }
        }
        if ($this_field_ok==1) {$co++}

        $mo++;
        $i++;

         $f=$input{"f$i"};
        $c=$input{"c$i"};
      } while ($f ne "");


      if ($co==$mo || ($co>=1 && $or_mode==1)) {
        if (defined($index{"NICHT_LIEFERBAR"})==0 || $afelder[$index{"NICHT_LIEFERBAR"}]!=1) {
            if ($groupby eq "" || $group{$afelder[$index{$groupby}]}==0) {
            $article_dat=~s/\r//g;
            push(@new_article_dat,$article_dat);
          }
         if ($groupby ne "") {
           $group{$afelder[$index{$groupby}]}=1;
           $input{"COUNT_$afelder[$index{$groupby}]"}++;
          }
        }
      }
    }


  }

  if ($t eq "") {$t=$template_basket}

  @basket=&format_warenkorb;
  @article=@new_article_dat;

  if ($input{"t"}=~/datenbanksitemap/) {
   @d=split(/\;/,$article[0]);
   if ($d[$index{"NAME"}]=~/Makita/ || $d[$index{"BESTELLUNGSINFO"}]=~/Makita/) {
     $dnr=$d[$index{"NR"}];
     &redirect("https://baudienst.shop/?post_type=product&s=$dnr");exit;
   }
   if ($d[$index{"NAME"}]=~/Hymer/ || $d[$index{"BESTELLUNGSINFO"}]=~/Hymer/) {
     $dnr=$d[$index{"NR"}];
     &redirect("https://baudienst.shop/?post_type=product&s=$dnr");exit;
   }
   if ($d[$index{"NAME"}]=~/Eibenstock/ || $d[$index{"BESTELLUNGSINFO"}]=~/Eibenstock/) {
     $dnr=$d[$index{"NR"}];
     &redirect("https://baudienst.shop/?post_type=product&s=$dnr");exit;
   }
  }


  if ($groupby ne "") {
    $groupby_index=$index{$groupby};
    @article= sort by_groupby @article;
  }
  if ($input{"sort"} ne "") {
    $old_index=$groupby_index;
    $groupby_index=$index{$input{"sort"}};
    @article= sort by_groupby @article;
    $groupby_index=$old_index;
  }
  if ($input{"nsort"} ne "") {
    $old_index=$groupby_index;
    $groupby_index=$index{$input{"nsort"}};
    @article= sort by_groupby_num @article;
    $groupby_index=$old_index;
  }


if ($oinput{"c"}=~/\((.*?)\)/) {
 $mysort=$1;
 @mysort=split(/\|/,$mysort);
 $i=0;
 foreach $mysort (@mysort) {
   $j=$i;
   $mysort=~s/\{.*\}//g; $mysort=~s/\-.*\-//g;
   while (length($j)<4) {$j="0".$j;}
   $sindex{$mysort}=$j;
   $i++;
 }
 $fsort=$input{"f"};$fsort=~s/\*//g;
 foreach $article (@article) {
   @d=split(/\;/,$article);
   $article=$sindex{$d[$index{"$fsort"}]}.";".$article;
 }

 @article=sort @article;

 foreach $article (@article) {
   @d=split(/\;/,$article);
   shift(@d);
   $article=join(";",@d);
 }
}
$input{"c"}=$oinput{"c"};


  if ($start ne "") {
    if ($start eq "0") {
      srand();
      $start=int(rand( int($#article/$dif)+1));
      $start=$start*$dif+1;
    }
    if ($start>0) {
      $end=$start+$dif-1;
      if ($end-1>$#article) {$end=$#article+1}
    }

    $hit_menu="";


    $input{"hcounter"}=$input{"hcounter"}+1;

    for ($page=1;$page<=int($#article/$dif)+1;$page++) {
      $page_start=($page-1)*$dif+1;
      if ($page_start==1 && $#article==-1) {$page_start=0;}
      $page_end=$page_start+$dif-1;
      if ($page_end>$#article+1) {$page_end=$#article+1}
      $query=$global[$id_global_query];
      $query=~s/start=(\d+)/start=$page_start/g;
      $query=~s/hcounter=(\d+)//g;

      if ($page_start!=$start) {
        $hit_menu.=qq!&#91;<a href="$global[$id_global_skript]?$query">$page_start - $page_end</a>&#93; !;
      } else {
        $hit_menu.=qq!&#91;$page_start - $page_end&#93; !;
      }
    }

    # PAGE BACK ermitteln
    if ($start>1) {
      $vorher=$start-$dif;
      if ($vorher<1) {$vorher=1}
      $query=$global[$id_global_query];
      $query=~s/start=(\d+)/start=$vorher/g;
      $global[$id_global_hit_back]=$shoppl."?".$query;
   }


   if ($start+$dif<=$#article+1) {
      $forward=$start+$dif;
      $query=$global[$id_global_query];
      $query=~s/start=(\d+)/start=$forward/g;
      $global[$id_global_hit_forward]=$shoppl."?".$query;
    }



    $global[$id_global_hit_start]=$start;
    $global[$id_global_hit_end]=$end;
    $global[$id_global_hit_max]=$#article+1;
    $global[$id_global_hit_menu]=$hit_menu;

    $#new_article=-1;
    for ($i=$start-1;$i<=$end-1;$i++) {
      push(@new_article,$article[$i]);
    }
    if ($global[$id_global_hit_start]>$global[$id_global_hit_end]) {
      $global[$id_global_hit_start]=$global[$id_global_hit_end];
    }
    @article=@new_article;
  }




foreach $article_dat (@article) {
  @d=split(/\;/,$article_dat);
  $#do=-1;
  $only_one=0;
  
  @causwahl=split(/ \/ /,$d[$index{"AUSWAHL"}]);$cchange=0;
  foreach $causwahl (@causwahl) {
    if ($causwahl=~/\~/) {
      ($copt,$canr)=split(/\~/,$causwahl);
      @d2=split(/\;/,$adata{$canr});    
      if ($copt==1) {$hstring=$d2[$index{"NAME"}];$hpreis=&format_sum($d2[$index{"PREIS"}]);}
      if ($copt==2) {$hstring=$d2[$index{"BESTELLUNGSINFO"}];$hpreis=&format_sum($d2[$index{"PREIS"}]);}
      if ($copt==3) {$hstring=$d2[$index{"BESCHREIBUNG"}];$hpreis=&format_sum($d2[$index{"PREIS"}]);}
  
  #    print "$causwahl -$copt-$canr- = $hpreis $hstring <br>\n";
       $causwahl="$hstring (+$hpreis EUR)";$cchange=1;
    }
  }
  if ($cchange==1) {   $d[$index{"AUSWAHL"}]=join(' / ',@causwahl);}


  for ($i=1;$i<=20;$i++) {

   if (defined($index{"OPTION$i"}) && length($d[$index{"OPTION$i"}])>=2) {
      if ($d[$index{"OPTION$i"}]!~/\#/ && $d[$index{"OPTION$i"}]!~/\~/) {
        @d2=split(/\;/,$adata{$d[$index{"OPTION$i"}]});
        push(@do,$d2[$index{"NAME"}]." ".&format_sum($d2[$index{"GEWICHT"}])."kg ".&format_sum($d2[$index{"PREIS"}]));
      }
      if ($d[$index{"OPTION$i"}]=~/\#(dif|op|)([a-z]|)/) {
         $optnr=$2;
         $opttype=$1;


#print "*$optnr*$opttype<br>\n";

         $hopt=$d[$index{"OPTION$i"}];$hopt=~s/\#.*//g;
         $d[$index{"OPTION$i"}]=~s/(\d+|)\#(dif|op|)([a-z]|)//g;

# print $d[$index{"OPTION$i"}]." *$optnr*<br>\n";

         @d2=split(/\;/,$adata{$d[$index{"OPTION$i"}]});
# print qq!= $d2[$index{"NR"}] - $d2[$index{"BESTELLUNGSINFO"}]<br>\n!;
         if ($opttype ne "op") {$d2[$index{"PREIS"}]=$d2[$index{"PREIS"}]-$d[$index{"PREIS"}];} 
         if ($opttype eq "op") {$d2[$index{"PREIS"}]=$d2[$index{"PREIS"}];}
         @hhelp=split(//,$hopt);
         $hstring="#".$opttype.$optnr.$d2[$index{"NR"}]." ";
         foreach $hhelp (@hhelp) {
           $hstring.=" ";
           if ($hhelp==1) {$hstring.=$d2[$index{"NAME"}];}
           if ($hhelp==2) {$hstring.=$d2[$index{"BESTELLUNGSINFO"}];}
           if ($hhelp==3) {$hstring.=$d2[$index{"BESCHREIBUNG"}];}
         }


         push(@do,$hstring." ".&format_sum($d2[$index{"GEWICHT"}])."kg ".&format_sum($d2[$index{"PREIS"}])); 
      }
      if ($d[$index{"OPTION$i"}]=~/\~/) {

         $only_one=1;
         $hopt=$d[$index{"OPTION$i"}];$hopt=~s/\~.*//g;
         $d[$index{"OPTION$i"}]=~s/(\d+|)\~//g;
         @d2=split(/\;/,$adata{$d[$index{"OPTION$i"}]});
         $d2[$index{"PREIS"}]=$d2[$index{"PREIS"}]-$d[$index{"PREIS"}];
         @hhelp=split(//,$hopt);
         $hstring="#".$d2[$index{"NR"}]." ";
         foreach $hhelp (@hhelp) {
           $hstring.=" ";$hstringgrund.=" ";
           if ($hhelp==1) {$hstring.=$d2[$index{"NAME"}];$hstringgrund.=$d[$index{"NAME"}];}
           if ($hhelp==2) {$hstring.=$d2[$index{"BESTELLUNGSINFO"}];$hstringgrund.=$d[$index{"BESTELLUNGSINFO"}];}
           if ($hhelp==3) {$hstring.=$d2[$index{"BESCHREIBUNG"}];$hstringgrund.=$d[$index{"BESCHREIBUNG"}];}
         }
         if ($#do==-1) {       push(@do,$hstringgrund." ".&format_sum(0)); }

         push(@do,$hstring." ".&format_sum($d2[$index{"GEWICHT"}])."kg ".&format_sum($d2[$index{"PREIS"}]));
      }

    }
  }
  if ($only_one==0) {$d[$index{"OPTIONEN"}]=join(', ',@do);}
  if ($only_one==1) {$d[$index{"OPTIONEN"}]=join('~ ',@do);}


#print "Content-Type: text/html\n\n";
#print $d[$index{"OPTIONEN"}]."<br>\n";


  $article_dat=join(';',@d);
}


    $check_no_variants.="$no_variants,";
  $sd=-1;
  foreach $article (@article) {
    $sd++;
    @fields=split(/\;/,$article);
    while ($#fields<$max_keyw) {push(@fields,"");}

    if ($fields[$index{"PREIS"}]!~/ \* /) {
      $pp=&format_sum($fields[$index{"PREIS"}]);
      $input{"js$sd"}.=qq!document.aform$process_id.field$sd.value='$pp EUR';document.aform$process_id.cfield$sd.value='$pp'\n!;
    }
    $war_schon=0;
    for ($i=0;$i<=$#keyw;$i++) {

      if ($fields[$i]=~/ \/ / && $check_no_variants!~/$keyw[$i]\,/) {
        @auswahl=split(/ \/ /,$fields[$i]);
        $binfo{$keyw[$i]."-".$fields[$id_article_id]}.=qq!<select name="${keyw[$i]}_select$fields[$id_article_id]">!;
        $fields[$id_article_binfo].=qq!<select name="${keyw[$i]}_select$fields[$id_article_id]">!;
        if ($fields[$index{"OPTTEXT"}] ne "") {
           $binfo{$keyw[$i]."-".$fields[$id_article_id]}.=qq!<option value="REQUIRED_!.$fields[$index{"OPTTEXT"}].qq!">!.$fields[$index{"OPTTEXT"}];
           $fields[$id_article_binfo].=qq!<option value="REQUIRED_!.$fields[$index{"OPTTEXT"}].qq!">!.$fields[$index{"OPTTEXT"}];
        }
        foreach $auswahl (@auswahl) {
          $fields[$id_article_binfo].=qq!<option>$auswahl</option>!;
          $binfo{$keyw[$i]."-".$fields[$id_article_id]}.=qq!<option>$auswahl</option>!;
        }
        $fields[$id_article_binfo].=qq!</select> !;
        $binfo{$keyw[$i]."-".$fields[$id_article_id]}.=qq!</select> !;
        $binfoleer{$keyw[$i]}=qq!<input type="hidden" name="${keyw[$i]}_select$fields[$id_article_id]" value=" ">!;
        $article=join(';',@fields);
      } elsif ($fields[$i]=~/ \* / && $check_no_variants!~/$keyw[$i]\,/)  {

        @auswahl=split(/ \* /,$fields[$i]);
        @pauswahl=split(/ \* /,$fields[$id_article_costs]);

         if ($i!=$id_article_costs && $i!=$id_article_id) {
          $binfo{$keyw[$i]."-".$fields[$id_article_id]}.=qq!<select name="${keyw[$i]}_multipreis$fields[$id_article_id]" id="sele${sd}_$process_id">!;
          $preis=&format_sum($fields[$index{"PREIS"}]);

          $tt="";
          for ($j=0;$j<=$#auswahl;$j++) {
            $pp=&format_sum($pauswahl[$j]);
            $tt.=qq!if (this.selectedIndex==$j) {document.aform$process_id.field$sd.value='$pp EUR'\ndocument.aform$process_id.cfield$sd.value='$pp'} !;
            $input{"js$sd"}.=qq!if (document.getElementById('sele${sd}_$process_id').selectedIndex==$j) {document.aform$process_id.field$sd.value='$pp EUR';document.aform$process_id.cfield$sd.value='$pp'}\n!;
          }

          $fields[$id_article_binfo].=qq!<select name="${keyw[$i]}_multipreis$fields[$id_article_id]" id="sele${sd}_$process_id" onChange="update${process_id}_$sd()">!;


          for ($j=0;$j<=$#auswahl;$j++) {
            $binfo{$keyw[$i]."-".$fields[$id_article_id]}.=qq!<option value="$j">$auswahl[$j]</option>!;
            $fields[$id_article_binfo].=qq!<option value="$j" >$auswahl[$j]</option>!;
          }
          $binfo{$keyw[$i]."-".$fields[$id_article_id]}.=qq!</select> !;
          $fields[$id_article_binfo].=qq!</select> !;
           $article=join(';',@fields);
        }
      }
    }
  }

  if ($cdmodul_ist_aktiv==1) {
    return @article;
  }


  if ($input{"redirect"} ne "") {
    &redirect($input{"redirect"});
    exit;
  }
if ($input{"mailcheck"}==1) {

  $check_mail=$input{"email"};
  @old_mail=&read_data($datadirectory."checkmail.txt");
  if ($old_mail[0] ne $check_mail) {
    open(f,">".$datadirectory."checkmail.txt");
    print f "$check_mail\n";
    close(f);
    use LWP;
    require LWP::Protocol::http;
    require LWP::UserAgent;
    my $ua = new LWP::UserAgent 'lwp-spider/0.1', '$email', 30;;    # create a useragent to test
    $timeout=5;if ($input{"timeout"}>0) {$timeout=$input{"timeout"};}
    $ua->timeout($timeout);
    $uurl = "https://shop.baudienst.com/shop/validator.php?email=".$check_mail;
    my $request = new HTTP::Request('GET', $uurl);
    $response = $ua->request($request, undef, undef);
    $content = $response->as_string;
    $content=~/\n\n/;
    $content=$';
    @lc=split(/\n/,$content);
    $email_gueltig=$lc[$#lc];
    if ($email_gueltig eq "E-Mail ungueltig") {&abbruch("Ihre E-Mail ist ung&uuml;ltig. Bitte kontrollieren Sie die E-Mail $check_mail.");}
  }
}

  $line=join("\n",&read_data("$tempdirectory$t.htm"));    # Vorlage einlesen
  if ($line eq "") {
    $line=join("\n",&read_data("$tempdirectory$t.txt"));    # Vorlage einlesen
  }

  $fline='
<script type="text/javascript" src="/shop/fancybox/lib/jquery-1.10.1.min.js"></script>
<script type="text/javascript" src="/shop/fancybox/source/jquery.fancybox.js?v=2.1.5"></script>
<link rel="stylesheet" type="text/css" href="/shop/fancybox/source/helpers/jquery.fancybox-buttons.css?v=1.0.5" />
<script type="text/javascript" src="/shop/fancybox/source/helpers/jquery.fancybox-buttons.js?v=1.0.5"></script>
<link rel="stylesheet" type="text/css" href="/shop/fancybox/source/helpers/jquery.fancybox-thumbs.css?v=1.0.7" />
<script type="text/javascript" src="/shop/fancybox/source/helpers/jquery.fancybox-thumbs.js?v=1.0.7"></script>
<link rel="stylesheet" type="text/css" href="/shop/fancybox/source/jquery.fancybox.css?v=2.1.5" media="screen" />

<style type="text/css">
.fancybox-nav {display:none;}
.fancybox-skin {padding:0px;}
.shrinkToFit {max-width:960px !important;}
</style>


<script type="text/javascript">
 $(document).ready(function() {


$(\'.fancybox_iframe\').fancybox({

type : \'iframe\',
iframe: {
preload: false // fixes issue with iframe and IE
},
preload: false,
\'width\': 1280,
\'height\': 960,
\'transitionIn\': \'none\', 
\'transitionOut\': \'none\',
\'openEffect\': \'none\',
\'nextEffect\': \'none\',
\'prevEffect\': \'none\',
\'autoSize\': true,    
arrows : false,
helpers : {
              buttons: {
                  position : \'top\'
              },

thumbs : {
            width: 53,
            height: 75		
        }

          }

    });


    $(\'.fancybox\').fancybox({

iframe: {
//\'scrolling\': \'no\',
\'showNavArrows\' : false,
\'fitToView\': true,
\'autoSize\': true,
preload: false // fixes issue with iframe and IE
},
\'fitToView\': true,
\'autoSize\': false,
\'autoHeight\': false,
\'autoWidth\': false,
\'showNavArrows\' : false,
preload: false,
\'width\': 980,
\'height\': 900,
\'transitionIn\': \'none\', 
\'transitionOut\': \'none\', 
\'openEffect\': \'none\',
\'nextEffect\': \'none\',
\'prevEffect\': \'none\',
helpers : {
              buttons: {
                  position : \'top\'
             },
     thumbs : {
            width: 50,
            height: 50		
        }

          }

    });
 });
  $.fancybox.helpers.thumbs.onUpdate = function() {};
</script>';
 if ($t=~/^s/) {$line=~s/<\/head>/$fline<\/head>/;$line=~s/<\!DOCTYPE(.*?)>/<\!DOCTYPE html>/;}
 if ($t=~/^a(\d+)/) {$line=$fline.$line;$line=~s/<\!DOCTYPE(.*?)>/<\!DOCTYPE html>/;}

  $line=~s/<!--#include virtual="\/cgi-bin\/hws\/his-webshop.pl\?t=temwk" -->/[INCLUDE=.\/template\/temwk.htm]/g;
  $line=~s/<!--#include virtual="\/cgi-bin\/hws-temp\/(.*?)" -->/[INCLUDE=..\/hws-temp\/$1]/g;
  $line=~s/<!--#include virtual="(.*?)\?t=(.*?)" -->/[INCLUDE=.\/template\/$2.htm]/g;
  
  while ($line=~/<!--#include virtual="\/cgi-bin\/hws\/bilderrandom.php\?(.*?)"-->/) {
    $myurl=$1;$davor=$`;$danach=$';
    $res=&get_url("https://shop.baudienst.com/cgi-bin/hws/bilderrandom.php?$myurl");
    $line=$davor.$res.$danach;   
  }




#  $line=~s/https/http/g;

  $line=&parse_line($line);                                 # Variablen ersetzen


# $line=~s/his-webshop.pl/zhis-webshop.pl/g;


  if ($input{"noctype"}!=1) {

  #   if ($input{"t"} ne "") {
     $cookie_time=gmtime(time+60*60*6);  # Cookie für 6 Std. aktivieren
     $cookie_name="userid";
     $cookie_value=$global[$id_global_userid];
     print "Set-Cookie: $cookie_name=$cookie_value; expires=$cookie_time;path=/;domain=baudienst.com\n";

     print "Content-type: text/html; charset=iso-8859-1\n\n";       

  
  }
  $line=~s/\<\</\[/g;
  $line=~s/\>\>/\]/g;
  $line=~s/_gaq.push\(\);/ _gaq.push(['_setAccount', 'UA-490295-1']);/;
  $line=~s/_gaq.push\(\);/  _gaq.push(['_trackPageview']);/;
  $line=~s/ByTagName\('script'\);/ByTagName('script')[0];/;
#  $line=~s/\&\&/\&/g;
  $line=~s/www\.shop\./shop./g;

#  $line=~s/http:\/\/www.shop.baudienst.com/https:\/\/www.shop.baudienst.com/g;
#  $line=~s/https:\/\/shop.baudienst.com/https:\/\/www.shop.baudienst.com/g;
 
  $line=~s/<input type="hidden" name="hcounter" value="(\d+)">//g;
  print $line;                                              # ausgeben
  exit;
}


sub get_url {
 local($url)=@_;

    use LWP;
    require LWP::Protocol::http;
    require LWP::UserAgent;
    my $ua = new LWP::UserAgent 'lwp-spider/0.1', '$email', 30;;    # create a useragent to test
    $timeout=5;if ($input{"timeout"}>0) {$timeout=$input{"timeout"};}
    $ua->timeout($timeout);
    $uurl =$url;
    my $request = new HTTP::Request('GET', $uurl);
    $response = $ua->request($request, undef, undef);
    $content = $response->as_string;
    $content=~/\n\n/;
    $content=$';

}



sub create_gutschein {
  srand(time);
  @l=split(//,$gutschein_code_chars);
  $gutschein="";
  for ($i=1;$i<=$gutschein_code_length;$i++) {
   $gutschein.=substr($gutschein_code_chars,rand($#l+1),1);
  }
  return $gutschein;
}

sub get_gutschein_pass {
  local($nr)=@_;
  @this=(-1,0,0,0);
  @g=&read_data($datadirectory."gutschein_db.txt");
  foreach $g (@g) {
    @d=split(/\;/,$g);
    if ($d[0] eq $nr) {
     @this=@d;
    }
  }
  return @this;
}


sub add_gutschein_to_db {
  local($gutschein_nr,$gutschein_wert,$gutschein_pw,$gutschein_bezahlt,$gutschein_ausgeloest,$gutschein_bestellt,$gutschein_absender,$gutschein_empfaenger,$gutschein_text,$gutschein_ordermin,$gutschein_gueltigkeit,$gutschein_aktionvon,$gutschein_aktionbis,$gutschein_aktiontyp,$gutschein_laufzeit,$gutschein_ab,$gutschein_frei)=@_;
  @new_g=($gutschein_nr,$gutschein_wert,$gutschein_pw,$gutschein_bezahlt,$gutschein_ausgeloest,$gutschein_bestellt,$gutschein_absender,$gutschein_empfaenger,$gutschein_text,$gutschein_ordermin,$gutschein_gueltigkeit,$gutschein_aktionvon,$gutschein_aktionbis,$gutschein_aktiontyp,$gutschein_laufzeit,$gutschein_ab,$gutschein_frei);
  open(f,">>$datadirectory"."gutschein_db.txt");
  print f join(';',@new_g)."\n";
  close(f);
}

sub change_gutschein_status {
  local($adminpass,$gutschein_nr,$new_bezahlt,$new_ausgeloest)=@_;
   if ($adminpass ne $admin_passwort) {&abbruch("Falsches Passwort");}

   ($pass,$wert,$bezahlt,$ausgeloest)=&get_gutschein_pass($gutschein_nr);
   if ($pass eq "-1") {&abbruch("Die Gutschein Nr. $gutschein_nr existiert nicht.")}
   if ($new_bezahlt ne "") {$bezahlt=$new_bezahlt}
   if ($new_ausgeloest ne "") {$ausgeloest=$new_ausgeloest}
   &add_gutschein_to_db($gutschein_nr,$wert,$pass,$bezahlt,$ausgeloest);
   print "Content-type: text/html\n\n";
   print "<html><body>Der Status wurde neu gesetzt.</body></html>";
   exit;
}


# ========================================================================================
# Redirect auf eine beliebige URL
# ==========================================================================================

sub redirect {
  $url=$_[0];
  print "Status: 302 Found\n";
  print "Location: $url\n";
  print "URI: <$url>\n";
  print "Content-type: text/html\r\n\r\n";
}

# ==========================================================================================
# Gibt die "Vielen Dank!" Seite aus, nachdem eine Bestellung abgeschickt wurde.
# Falls eine Redirect-Bedingung definiert wurde und diese zutrifft, wird ein Redirect
# ausgeführt. Dies können Sie nutzen, um die Bestellung auf ein SSL-Bestellformular
# für Kreditkarten-Daten weiterzuleiten.
# Beispiel:
# <form action="[SKRIPT]" method="GET">
# <input type=hidden name="redirect_url" value="Zahlung=Kreditkarte->https://IhreFirma.de/secure/creditcard.htm">
# ...
# </form>
# ==========================================================================================

sub output_order {

  # Bestandverwaltung!
  if ($bestand_verwaltung==1) {
    foreach $basket_dat (@basket_dat) {
      @f=split(/\;/,$basket_dat);
      $stock{$f[$id_article_id]}=$f[$id_article_quantity];
    }
    foreach $article_dat (@article_dat) {
       @f=split(/$trennzeichen/,$article_dat);
       $f[$index{"STOCK"}]-=$stock{$f[$id_article_id]};
       if ($f[$index{"STOCK"}]<0) {
         $f[$index{"STOCK"}]=0;
       }
       $article_dat=join(';',@f);
    }
    &save_array($articledat,"article",@article_dat);
  }

  $rurl=$input{"redirect_url"};
  if ($rurl ne "") {
    @rtypes=split(/\;/,$rurl);
    foreach $rtypes (@rtypes) {
      @condition_url=split(/\-\>/,$rtypes);
      @keyvalue=split(/\=/,$condition_url[0]);
      $key=$keyvalue[0];
      $value=$keyvalue[1];
      if ($input{"$key"} eq $value) {
        &redirect($condition_url[1]);
        exit;
      }
    }
  }
  if ($input{"t"} ne "") {
    $template_send=$input{"t"};
  }
  $line=join("\n",&read_data("$tempdirectory$template_send.htm"));              # Vorlage einlesen
  $line=&parse_line($line);                                 # Varibalen ersetzen
  $line=~s/\<\</\[/g;
  $line=~s/\>\>/\]/g;

  $line=~s/http:\/\/www.shop.baudienst.com/https:\/\/www.shop.baudienst.com/g;
  $line=~s/https:\/\/shop.baudienst.com/https:\/\/www.shop.baudienst.com/g;
 
 # $line=~s/https/http/g;
 

  print "Content-type: text/html\n\n";
  print $line;                                              # ausgeben

  unlink "$basketdat";                                                  # Warenkorb löschen

}


# ==========================================================================================
# Liefert Menge zurück
# ==========================================================================================

sub get_menge {
  local($menge)=@_;                                         # String einlesen
  $menge=~s/\,/\./g;                                        # Bei der Menge "," durch "." ersetzen
  if ($menge>0) {return $menge};                            # Falls Wert > 0, Wert zurückgeben
  if (defined($menge) && $menge==0) {                       # Falls Menge=0
    if ($menge ne "" && $menge ne "0") {return 1;}          # Falls String nicht "0" oder leer, 1 zurückgeben
  }
  return 0;                                                 # sonst 0 zurückgeben
}

sub add_basket2 {
  local($nr,$name,$preis,$menge)=@_;
  if ($global[$id_global_userid]==9999) {return;}
  if ($menge==0) {$menge=1;}


  foreach $basket_dat (@basket_dat) {
    @f=split(/\;/,$basket_dat);
    if ($f[$index{"NAME"}] eq $name) {return;} 
  }

  $#basket_new=-1;
  @basket_new=&get_article_data($nr);            # Daten aus Datenbank holen

  $basket_new[$index{"NR"}]=$nr;
#  $basket_new[$index{"NAME"}]=$name;
  $basket_new[$id_article_quantity]=$menge;
  $basket_new[$index{"PREIS"}]=$preis;

  $basket_new=join(';',@basket_new);
  push(@basket_dat,$basket_new);
  @basket=@basket_dat;
}



# ==========================================================================================
# Aktualisiert den Warenkorb.
# ==========================================================================================


sub add_basket {
  local($i)=@_;
  local($#basket_new)=-1;                                   # Leeren Warenkorb-Array erstellen
  @basket_new=&get_article_data($input{"id$i"});            # Daten aus Datenbank holen

  $onr=$basket_new[$index{"NR"}];  
   if ($input{"NR_new".$basket_new[$index{"NR"}]} ne "") {
      for ($j=0;$j<=$#keyw;$j++) {
       if ($input{"${keyw[$j]}_multipreis$basket_new[$id_article_id]"} ne "") {
         $mpreisnr=$input{"${keyw[$j]}_multipreis$basket_new[$id_article_id]"};
       }
      }  
     @auswahl=split(/ \* /,$input{"NR_new".$basket_new[$index{"NR"}]});
     $new_nr=$auswahl[$mpreisnr];
     @basket_new=&get_article_data($new_nr);
   }
   $basket_new[$id_article_costs]=&format_sum($basket_new[$id_article_costs]);
   $basket_new[$index{"GEWICHT"}]=&format_sum($basket_new[$index{"GEWICHT"}]);

   $gestrichen=$basket_new[$index{"GESTRICHEN"}];$gestrichen=~s/\r//g;$no_loop=0;
   $ersatzartikel_liste=$basket_new[$index{"NUMMER"}]."<br>\n";
  
   while (length($gestrichen)>2 && $gestrichen!~/gestrichen/ && $gestrichen!~/lager/i && $no_loop<4) {
     @basket_new=&get_article_data($gestrichen);        $wantnr=$input{"wantnr_".$input{"id$i"}};
     $ersatzartikel_liste.=$basket_new[$index{"NUMMER"}]."<br>\n";
  
     if ($basket_new[$index{"NR"}] eq "") {
        $absender=$email;$empfaenger=$email;$subject="Fehler zu Ersatz-Artikel";$mailtext="\n\nDatenbankfehler Ersatzartikel<br>\n$wantnr<br>\n$ersatzartikel_liste\n\n";
        &send_email($absender,$empfaenger,$subject,$mailtext);
        @basket=&format_warenkorb;  
        &abbruch("Datenbankfehler Ersatzartikel<br>$wantnr<br>$ersatzartikel_liste Bitte <a onclick=\"NewWindow(this.href,'name','480','480','yes');return false\" href=\"https://baudienst.com/service/formulare/anfrage_datenbankfehler_pu.html\">melden Sie das Problem/den Fehler</a>!");
  
      }
     $gestrichen=$basket_new[$index{"GESTRICHEN"}];$gestrichen=~s/\r//g;
     $no_loop++;     
   }
  if ($no_loop==4) {&abbruch("Fehler: Der Artikel kann nicht bestellt werden.");}
  if ($gestrichen=~/gestrichen/i) {
    $wantnr=$input{"wantnr_".$input{"id$i"}};
    if ($wantnr ne "") {
       $absender=$email;$empfaenger=$email;$subject="Fehler zu Ersatz-Artikel";$mailtext="\n\nDatenbankfehler Ersatzartikel<br>\n$wantnr<br>\n$ersatzartikel_liste\n\n";
       &send_email($absender,$empfaenger,$subject,$mailtext);
       &abbruch("Datenbankfehler Ersatzartikel<br>$wantnr<br>$ersatzartikel_liste Bitte <a onclick=\"NewWindow(this.href,'name','480','480','yes');return false\" href=\"https://baudienst.com/service/formulare/anfrage_datenbankfehler_pu.html\">melden Sie das Problem/den Fehler</a>!");
    
    }
    &abbruch("Fehler: Der Artikel kann nicht bestellt werden.");
  }
 if ($input{"BESTELLUNGSINFO_new".$basket_new[$index{"NR"}]} ne "") {
    $basket_new[$index{"BESTELLUNGSINFO"}]=$input{"BESTELLUNGSINFO_new".$basket_new[$index{"NR"}]};
   }

  if ($input{"PREIS_new".$basket_new[$index{"NR"}]} ne "") {
    $basket_new[$index{"PREIS"}]=$input{"PREIS_new".$basket_new[$index{"NR"}]};
   }




  if ($input{"OPTION_select".$onr}=~/(\d+)(\.|\,)(\d+) EUR/) {

#print "Content-Type: text/html\n\n";
#print $input{"OPTION_select".$basket_new[$index{"NR"}]};exit;
  $#new_e=-1;
   @e=split(/\, /,$input{"OPTION_select".$onr});
    foreach $e (@e) {
      if ($e=~/\#(dif|)([a-z]|)(\d+)/) {
        $new_nr=$3;
        @basket_new=&get_article_data($new_nr);            # Daten aus Datenbank holen
      } else {
        $e=~s/\#(op|)([a-z]|)//g;
        push(@new_e,$e);
      }
    }
    $input{"OPTION_select".$new_nr}=join(', ',@new_e);
  }

	

  if ($#basket_new==-1) {
    &abbruch(qq!Der Artikel $input{"id$i"} existiert nicht (mehr).!);
  }

  if ($basket_new[$index{"STOCK"}]<$input{"quantity$i"} && $bestand_verwaltung==1 && $fehlermeldung_bei_bestand_von_null==1) {
    &abbruch(qq!Sie m&ouml;chten die Menge $input{"quantity$i"} des Artikels <b>$basket_new[$index{"NR"}]</b> bestellen, wir haben zur Zeit aber nur einen Bestand von $basket_new[$index{"STOCK"}] verf&uuml;gbar.<p> Wenn Sie sich besonders f&uuml;r diesen Artikel interessieren, <a href="mailto:$email">kontaktieren Sie uns bitte per Mail</a>.!);
  }


  if ($basket_new[$index{"VPME"}]>$input{"quantity$i"}) {
    $s='<form action="'.$shoppl.'" method="POST">';
    foreach $key (sort(keys %input)) {
      if ($key ne "Nr".$basket_new[$index{"NR"}] && $key ne "Nr".$basket_new[$index{"NR"}].".x" && $key ne "Nr".$basket_new[$index{"NR"}].".y") {
        $s.= qq!<input type="hidden" name="$key" value="$input{$key}">!;
      }
    }
    $s.=qq!<input type="hidden" name="Nr!.$basket_new[$index{"NR"}].qq!" value="!.$basket_new[$index{"VPME"}].qq!">!;
    $s.=qq!<center><input type="submit" value="OK"></center>!;
    $s.="</form>";
 
    &abbruch("Die Mindestbestellmenge (Verkaufsmengen-Einheit) f&uuml;r den Artikel ".$basket_new[$index{"NAME"}]." beträgt ".$basket_new[$index{"VPME"}].".<br>Soll der Artikel mit der Menge ".$basket_new[$index{"VPME"}]." in den Warenkorb gelegt werden?<br>\n$s");
  } 

 if ($basket_new[$index{"VPME"}]>0 && $input{"quantity$i"}%$basket_new[$index{"VPME"}]>0) { 
    $neue_menge=(int($input{"quantity$i"}/$basket_new[$index{"VPME"}])+1)*$basket_new[$index{"VPME"}];
    $s='<form action="'.$shoppl.'" method="POST">';
    foreach $key (sort(keys %input)) {
      if ($key ne "Nr".$basket_new[$index{"NR"}] && $key ne "Nr".$basket_new[$index{"NR"}].".x" && $key ne "Nr".$basket_new[$index{"NR"}].".y") {
        $s.= qq!<input type="hidden" name="$key" value="$input{$key}">!;
      }
    }
    $s.=qq!<input type="hidden" name="Nr!.$basket_new[$index{"NR"}].qq!" value="!.$neue_menge.qq!">!;
    $s.=qq!<center><input type="submit" value="OK"></center>!;
    $s.="</form>";
 
    &abbruch("Die Verkaufsmengen-Einheit f&uuml;r den Artikel ".$basket_new[$index{"NAME"}]." beträgt ".$basket_new[$index{"VPME"}].".<br>Soll der Artikel mit der Menge ".$neue_menge." in den Warenkorb gelegt werden?<br>\n$s");

  }

  $basket_new[$id_article_quantity]=0;                      # zum vergleichen
  $basket_new[$id_article_costs]=~s/\,/\./g;                # Beim Preis "," durch "." ersetzen



  if ($basket_new[$id_article_costs]=~/\?/) {
      @p=split(/\ /,$basket_new[$id_article_costs]);
      @pq=split(/\?/,$p[0]);
      if ($input{"quantity$i"}<$pq[1]) {$input{"quantity$i"}=$pq[1];}
   }

  $basket_new[$id_article_quantity]=$input{"quantity$i"};   # Menge zuweisen
  $basket_new[$id_article_quantity]=~s/\,/\./g;             # Bei der Menge "," durch "." ersetzen

   foreach $keyw (@keyw) {
       if (defined($input{"${keyw}_select$basket_new[$id_article_id]"})) {
         if ($input{"${keyw}_select$basket_new[$id_article_id]"}=~/REQUIRED/) {
            $r=$input{"${keyw}_select$basket_new[$id_article_id]"};$r=~s/(.*?)_//g;
            &abbruch("Bitte treffen Sie auf der Artikelseite eine Auswahl zum Artikel<br> ". $basket_new[$index{"NAME"}].":<br> <b>$r</b>");

         }
         $basket_new[$index{$keyw}]=$input{"${keyw}_select$basket_new[$id_article_id]"};
         $basket_new[$index{$keyw}]=~s/\s\/\s/\//g;
      }
    }


  for ($j=0;$j<=$#keyw;$j++) {
   if ($input{"${keyw[$j]}_multipreis$basket_new[$id_article_id]"} ne "") {
     $mpreisnr=$input{"${keyw[$j]}_multipreis$basket_new[$id_article_id]"};
     foreach $basket_new (@basket_new) {
       if ($basket_new=~/ \* /) {
          @auswahl=split(/ \* /,$basket_new);
          $basket_new=$auswahl[$mpreisnr]
        }
      }
    }
  }

  $eanz=0;
  @e=split(/\, /,$basket_new[$index{"OPTION"}]);
  foreach $e (@e) {
     if ($e=~/\#(dif|op|)([a-z]|)/) {
       $opttyp=$1;$optnr=$2;
       if ($opttyp ne "" && $optnr eq "") {next;}
       if ($optnr ne "") {
          $eanz{$optnr}++;
          if ($eanz{$optnr}>1) {&abbruch("Fehler: Bitte w&auml;hlen Sie nur <b>eine</b> der mit dem Zeichen # markierten Optionen aus.");} 
        }
     }
  }

   if ($input{"ANR_new".$basket_new[$index{"NR"}]} ne "") {
     @auswahl=split(/ \* /,$input{"ANR_new".$basket_new[$index{"NR"}]});
     $basket_new[$index{"NUMMER"}]=$auswahl[$mpreisnr];
   }

  foreach $keyw (@keyw) {
   if ($input{$keyw."_new".$basket_new[$index{"NR"}]} ne "") {
     @auswahl=split(/ \* /,$input{$keyw."_new".$basket_new[$index{"NR"}]});
     $basket_new[$index{"$keyw"}]=$auswahl[$mpreisnr];
   }
  }


#print "Content-Type: text/html\n\n";
#print "*".$basket_new[$index{"AUSWAHL"}]."<br>\n";

  if ($basket_new[$index{"AUSWAHL"}]=~/\(\+(\d+)(\.|\,)(\d+) EUR\)/) {
   # $basket_new[$index{"AUSWAHL"}]=$`;
    $aufpreis="$1.$3";
    $basket_new[$index{"PREIS"}]+=$aufpreis;
#print "Content-Type: text/html\n\n";
#print "-$aufpreis-";exit;
  }


  if ($basket_new[$index{"OPTION"}]=~/(\d+)(\.|\,)(\d+) EUR/) {


    $basket_new[$index{"OPTION"}]=~s/\#(dif|op|op[a-z]|)//g;
    @e=split(/\, /,$basket_new[$index{"OPTION"}]);
    foreach $e (@e) {



      $d=$e;
      if ($d=~/(-|)(\d+)(\.|\,)(\d+) EUR/) {
        $basket_new[$index{"PREIS"}]+="$1$2$3$4";
       }
  
      if ($d=~/(-|)(\d+)(\.|\,)(\d+)kg/) {
        $basket_new[$index{"GEWICHT"}]+="$1$2$3$4";
      }

      $basket_new[$index{"OPTION"}]=~s/(-|)(\d+)(\.|\,)(\d+) EUR//;
      $basket_new[$index{"OPTION"}]=~s/(-|)(\d+)(\.|\,)(\d+)kg//;
      $basket_new[$index{"OPTION"}]=~s/ \,/,/g;
      $basket_new[$index{"OPTION"}]=~s/^op(\d+)/$1/g;
    }
  }






  $basket_new=join(';',@basket_new);

  $gef=0;
  foreach $basket_dat (@basket_dat) {
    @bf=split(/\;/,$basket_dat);
    $old_quantity=$bf[$id_article_quantity];
    $bf[$id_article_quantity]=$basket_new[$id_article_quantity];
    if (join(';',@bf) eq join(';',@basket_new)) {
      $gef=1;
      if ($mengen_im_warenkorb_addieren==1) {
        $bf[$id_article_quantity]=$basket_new[$id_article_quantity]+$old_quantity;
      }
      $basket_dat=join(';',@bf);
    }
  }

  if ($gef==0) {
    push(@basket_dat,$basket_new);
    push(@basket_dat_new,$basket_new);
  }
}

sub process_order {
  local($i);
  local(@keys,@values,@field);
  if ($process_order_ok==1) {return;}
  $process_order_ok=1;
  $#keys=-1;
  $#values=-1;
  foreach $keyval (@keyval) {                               # Array keval durchlaufen
    @field=split(/\;/,$keyval);                             # Felder ermitteln
    push(@keys,$field[0]);                                  # key in Array keys speichern
    push(@values,$field[1]);                                # value in Array values speichern
  }

  $#basket_new=-1;
  for ($i=0;$i<=$#basket_dat;$i++) {
    $input{"wk_quantity$i"}=~s/\,/\./g;
    if ($input{"wk_delete$i"} ne "" || $input{"wk_delete$i.x"} ne "") {
      $input{"wk_quantity$i"}=0;
    }
    if ($input{"wk_quantity$i"} ne "" || $input{"ok$i"} ne "") {

      @basket_fields=split(/\;/,$basket_dat[$i]);
      if ($basket_fields[$id_article_quantity]!=$input{"wk_quantity$i"}) {

        if ($input{"wk_quantity$i"} ne "") {

           # GUTSCHEIN
          if ($basket_fields[$index{"NR"}]=~/^GE_/ && $input{"wk_quantity$i"}>0 ) {
            &abbruch("Die Menge eines Gutscheins kann nur in 0 ge&auml;ndert werden.");
          }
              
         if ($basket_fields[$index{"VPME"}]>0 && $input{"wk_quantity$i"} >0) {
           if ($input{"wk_quantity$i"}<$basket_fields[$index{"VPME"}]) {
               $input{"wk_quantity$i"}=$basket_fields[$index{"VPME"}]; 
               $input{"MENGE_ANGEPASST"}= $input{"wk_quantity$i"};$input{"MENGE_VPME"}= $basket_fields[$index{"VPME"}]; 
           }
           if ($input{"wk_quantity$i"}%$basket_fields[$index{"VPME"}]>0) { 
             $input{"wk_quantity$i"}=(int($input{"wk_quantity$i"}/$basket_fields[$index{"VPME"}])+1)*$basket_fields[$index{"VPME"}];
               $input{"MENGE_ANGEPASST"}= $input{"wk_quantity$i"};$input{"MENGE_VPME"}= $basket_fields[$index{"VPME"}]; 
           }
         }
        # GUTSCHEIN
          if ($basket_fields[$index{"STOCK"}]=~/GE_/ && $input{"wk_quantity$i"}>0 ) {
            &abbruch("Die Menge eines Gutscheins kann nur in 0 ge&auml;ndert werden.");
          }
          if ($basket_fields[$index{"STOCK"}]<$input{"wk_quantity$i"} && $bestand_verwaltung==1 && $fehlermeldung_bei_bestand_von_null==1) {
            &abbruch(qq!Sie m&ouml;chten die Menge $input{"wk_quantity$i"} des Artikels <b>$basket_fields[$index{"NR"}]</b> bestellen, wir haben zur Zeit aber nur einen Bestand von $basket_fields[$index{"STOCK"}] verf&uuml;gbar.<p> Wenn Sie sich besonders f&uuml;r diesen Artikel interessieren, <a href="mailto:$email">kontaktieren Sie uns bitte per Mail</a>.!);
          }
          $basket_fields[$id_article_quantity]=$input{"wk_quantity$i"};
          $basket_dat[$i]=join(';',@basket_fields);
        }
      }
      if ($input{"ok$i"} ne "") {
        foreach $keyw (@keyw) {
          if ($input{"${keyw}_select$i"} ne "") {
            $basket_fields[$index{$keyw}]=$input{"${keyw}_select$i"};
            $basket_fields[$index{$keyw}]=~s/\s\/\s/\//g;
          }

        }
        for ($j=0;$j<=$#keyw;$j++) {
          if ($input{"${keyw[$j]}_multipreis$i"} ne "") {
            $mpreisnr=$input{"${keyw[$j]}_multipreis$i"};
            foreach $basket_fields (@basket_fields) {
              if ($basket_fields=~/ \* /) {
                @auswahl=split(/ \* /,$basket_fields);
                $basket_fields=$auswahl[$mpreisnr]
              }
            }
          }
        }
      }
      if ($input{"wk_quantity$i"}!=0 || $input{"wk_quantity$i"} eq "") {push(@basket_new,join(';',@basket_fields))};
    } else {push(@basket_new,$basket_dat[$i]);}
  }
  @basket_dat=@basket_new;

  if ($input{"change"}==0) {                                # falls Aufruf NICHT vom Warenkorb kommt (keine Änderung, nur NEUE Artikel)
    $i=0;

###########################################################
## Überprüfung einer Übergabe durch:
## <a href="/cgi-bin/hws/webshop.pl?Nr1234=3"> oder
## <input type=submit name="Nr1234" value="Bestellen">
##

    for ($k=0;$k<=$#keys;$k++) {                            # Alle Keys durchlaufen
       if ($keys[$k]=~/^NrAddWk$/) {
       $input{"id$i"}=$values[$k];
       $input{"quantity$i"}=1;
       if ($input{"MengeAddWk"} ne "") {$input{"quantity$i"}=$input{"MengeAddWk"}}
       &add_basket($i);
       $i++;
     }
     elsif ($keys[$k]=~/^Nr(.*)$/) {                           # Falls Key = NrXXX
        $nr_field=$1;

        if ($nr_field=~/\.y$/) {                           # Bei Übergabe durch "type=image" .y nicht berücksichtigen
          $menge=0;
        }
        elsif ($nr_field=~/\.x$/ && $war_schon{$nr_field}==0) {                        # Bei Übergabe durch "type=image" .x = Menge 1
          $nr_field=~s/\.x$//;
          $menge=1;
        } elsif ($war_schon{$nr_field}==0) {
          $menge=&get_menge($values[$k]);                   # Menge aus Value ermitteln
        }

        if ($menge>0 && $war_schon{$nr_field}==0) {                                     # Falls Menge>0
          $war_schon{$nr_field}=1;
          $input{"id$i"}=$nr_field;                         # Neuer Warenkorbeintrag mit NrXXX
          $input{"quantity$i"}=$menge;                      # und Menge
          &add_basket($i);
          $i++;                                             # nächster freier Platz
        }
      }
    }

##
###########################################################

###########################################################
## Überprüfung einer Übergabe durch:
## <select name="Def1">
## <option value="1234">Artikel1
## <option value="1235">Artikel2>
## </select>
## <input type=submit name="Menge1" value="Bestellen">
###

    for ($k=0;$k<=$#keys;$k++) {                            # Alle Keys durchlaufen
      if ($keys[$k]=~/^Def(.*)$/) {                         # Falls Key = DefXXX
        $defnr=$1;                                          # DefNr ermitteln
        $artnr=$values[$k];                                 # ArtikelNummer ist der Value
        $menge=&get_menge($input{"Menge$defnr"});           # Menge ermitteln
        if ($menge>0) {                                     # Falls Menge>0
          $input{"id$i"}=$artnr;                            # Neuer Warenkorbeintrag
          $input{"quantity$i"}=$menge;                      # Menge

          if ($input{"AUSWAHL1"} ne "") {
            $input{"AUSWAHL_select$artnr"}=$input{"AUSWAHL1"};
          }
          &add_basket($i);
          $i++;                                             # nächster freier Platz
        }
      }
    }

##
###########################################################
  }

    $i=0;
    while ($input{"id$i"} ne "") {                          # Alle Einträge des WKs durchlaufen, um $i auf einen freien Eintrag zu setzen
      $i++;
    }

###########################################################
## Manuelle Eingabe erlauben!
##

 $z=0;
    do {
      $#basket_new=-1;
      if ($z==0) {$nr="";} else {$nr=$z}
      for ($k=0;$k<=$#keys;$k++) {                            # Alle Keys durchlaufen
        if ($keys[$k]=~/add_(.*)$nr$/) {                     # Falls Key = add_XXXX
          $basket_new[$index{$1}]=$values[$k];
          $basket_new[$index{"MENGE"}]=1;
         }
      }
      if ($basket_new[$index{"MENGE"}]>0 || $basket_new[$index{"MENGE"}] ne "") {
          if ($basket_new[$index{"MENGE"}]==0) {$basket_new[$index{"MENGE"}]=1;}

           $gef=0;
    foreach $basket_dat (@basket_dat) {
      @bf=split(/\;/,$basket_dat);
      $old_quantity=$bf[$id_article_quantity];
      $bf[$id_article_quantity]=$basket_new[$id_article_quantity];
      if (join(';',@bf) eq join(';',@basket_new)) {
        $gef=1;
        if ($mengen_im_warenkorb_addieren==1) {
          $bf[$id_article_quantity]=$basket_new[$id_article_quantity]+$old_quantity;
        }
        $basket_dat=join(';',@bf);
      }
    }

    if ($gef==0) {

          push(@basket_dat,join(';',@basket_new));
          push(@basket_dat_new,join(';',@basket_new));

          }
      }
      $z++;
    } while (defined($input{"add_MENGE$nr"}) || $z<=1);

##
###########################################################


  if ($check_process_order==1) {return;}

  &save_array($basketdat,$basketdat,@basket_dat);           # Warenkorb speichern


  @basket=@basket_dat;
  @basket=&format_warenkorb;
  @l=&read_data($tempdirectory."basket_config.txt");
  $l=join("\n",@l);
  $l2=&parse_line($l);
  @basket=@basket_dat;

  foreach $basket (@basket) {
     @d=split(/\;/,$basket);
     $input{"WARENKORB_".$d[$index{"NR"}]}=1;
  }

}


# ==========================================================================================
# Liest und formatiert die Variablen fuer den Warenkorb
# ==========================================================================================

sub format_warenkorb {
  local($is_mail,$divident)=@_;
  local($index);
  if ($divident==0) {$divident=1;}
  local(@article);                                          # Artikel Array erstellen
  $global[$id_global_sumall]=0;                             # Bestellsume auf "0" setzen
  $i=0;                                                     # Zähler auf 0 setzen
  $#article=-1;                                             # Artikel Array leeren

  $check_no_variants.="$no_variants,";

  $only_gutschein=1;$wk_ohne_gutschein=0;
  foreach $basket_dat (@basket_dat) {
   @f=split(/\;/,$basket_dat);
   if ($f[$index{"NR"}]!~/^G_(.*)/) {
     $only_gutschein=0;
   }
   if ($f[$index{"NR"}]!~/^GE_(.*)/) {
     $wk_ohne_gutschein+= &format_sum($f[$id_article_quantity]*&format_sum($f[$id_article_costs]/$divident));
   }
  
  }

  foreach $basket_dat (@basket_dat) {                       # Warenkorbeinträge durchlaufen
    @fields=split(/\;/,$basket_dat);                        # Felder ermitteln
    $#article_fields=-1;                                    # Leeren Artikel Array erstellen

    foreach $keyw (@keyw) {
      $index=$index{$keyw};
      if ($fields[$index]=~/ \/ / && $check_no_variants!~/$keyw\,/)  {
        if ($is_mail==1) {
          $fausgabe= qq!Die Bestelldaten k&ouml;nnen noch nicht verschickt werden, da Sie noch Angaben im Warenkorb zu mindestens einem Artikel festlegen m&uuml;ssen. Im <a href="$shoppl">Warenkorb</a> k&ouml;nnen Sie dazu in einer!;
          $fausgabe.=qq! Auswahlbox die Einstellung ausw&auml;hlen. Anschliessend dr&uuml;cken Sie bitte jeweils auf den OK-Button neben der Auswahlbox.!;
          &abbruch($fausgabe);
        }
        @auswahl=split(/ \/ /,$fields[$index]);
        $article_fields[$index]=qq!<select name="${keyw}_select$i">!;
        foreach $auswahl (@auswahl) {
          $article_fields[$index].=qq!<option>$auswahl</option>!;
        }
        $article_fields[$index].=qq!</select> <input type=submit name="ok$i" value="OK">!;
      }
      elsif ($fields[$index]=~/ \* /  && $check_no_variants!~/$keyw\,/)  {
        if ($is_mail==1) {
          $fausgabe= qq!Die Bestelldaten k&ouml;nnen noch nicht verschickt werden, da Sie noch Angaben im Warenkorb zu mindestens einem Artikel festlegen m&uuml;ssen. Im <a href="$shoppl">Warenkorb</a> k&ouml;nnen Sie dazu in einer!;
          $fausgabe.=qq! Auswahlbox die Einstellung ausw&auml;hlen. Anschliessend dr&uuml;cken Sie bitte jeweils auf den OK-Button neben der Auswahlbox.!;
          &abbruch($fausgabe);
        }
        @auswahl=split(/ \* /,$fields[$index]);
        if ($index!=$id_article_costs && $index!=$id_article_id) {
          $article_fields[$index]=qq!<select name="${keyw}_multipreis$i">!;
          for ($j=0;$j<=$#auswahl;$j++) {
            $article_fields[$index].=qq!<option value="$j">$auswahl[$j]</option>!;
          }
          $article_fields[$index].=qq!</select> <input type=submit name="ok$i" value="Ok">!;
        }
        else {$article_fields[$index]=$auswahl[0];}
      } else {
        $article_fields[$index]=$fields[$index];
      }
    }

    $article_fields[$id_article_quantity]=$fields[$id_article_quantity];     # Menge
    if ($fields[$index{"NR"}]!~/^GE_/) {
      $article_fields[$id_article_newquantity].=qq!<INPUT TYPE=TEXT SIZE=3 NAME="wk_quantity$i" VALUE="$fields[$id_article_quantity]">!; # Menge als Text Feld 
    } else {
     $article_fields[$id_article_newquantity]=$fields[$id_article_quantity];     # Menge
 
    }

    if ($fields[$id_article_costs]=~/\?/) {
      @p=split(/\ /,$fields[$id_article_costs]);
      foreach $p (@p) {
        @pq=split(/\?/,$p);
        if ($fields[$id_article_quantity]>=$pq[1]) {
          $article_fields[$id_article_sum]= &format_sum($fields[$id_article_quantity]*&format_sum($pq[0]/$divident));
        }
      }
    } else {


      $fields[$index{"GEWICHT"}]=&format_sum($fields[$index{"GEWICHT"}]);
      $fields[$id_article_costs]=&format_sum($fields[$id_article_costs]);
      $article_fields[$id_article_sum]=&format_sum($fields[$id_article_quantity]*&format_sum($fields[$id_article_costs]/$divident));    # Summe berechnen
    }

    $global[$id_global_sumall]+=$article_fields[$id_article_sum]; # Gesamtbestellsumme
    push(@article,join(';',@article_fields));                     # Neuen Artikel einfügen
    $i++;
  }


  if ($dif_porto==1) {                                      # Falls untersch. Versandk.art
    if ($input{"porto"} ne "") {                            # Falls Versandk.art angegeben
      $porto=$input{"porto"};                               # Versandk.art einlesen
      &save_array($portodat,"porto",$porto);                # ... und speichern
    }

    $gef=0;                                                 # Flag gefunden auf 0 sezten
    foreach $porto_daten (@porto_daten) {                   # Alle Versandk.arten durchlaufen
      @pdaten=split(/\;/,$porto_daten);
      if ($pdaten[0] eq $porto) {                           # Falls zur Zeit ausgewählte Versandk.art
        $gef=1;                                             # Flag gefunden auf 0 setzen
        last;
      }
    }
    if ($gef==0) {@pdaten=split(/\;/,$porto_daten[0]);}     # Falls nicht gefunden, Versandk. der 1.Zeile nehmen
    $porto=$pdaten[0];
    $this_porto=$pdaten[1];
    $global[$id_global_versandkfreiab]=$pdaten[2];
    $global[$id_global_versandkosten]=&format_sum($this_porto/$divident);        # sonst Versandkosten = Porto

    $ptext="";
    foreach $porto_daten (@porto_daten) {
      @pdaten=split(/\;/,$porto_daten);
      if ($pdaten[0] eq $porto) {$selec="SELECTED "} else {$selec=""}
      $ptext.= qq!<OPTION ${selec}VALUE="$pdaten[0]">$pdaten[0]!;
    }
    $ptext=qq!<select name="porto" onChange="document.bform.submit()">$ptext</select>!;
    $global[$id_global_porto_auswahl]=$ptext;
    $global[$id_global_porto]=$porto;
  } else {
    $global[$id_global_versandkosten]=&format_sum($versandk_hoehe/$divident);        # sonst Versandkosten = Porto
  }

  $global[$id_global_min_order]=$min_order;
  $global[$id_global_min_order_zuschlag]=$min_order_zuschlag;
  if (($global[$id_global_min_order]/$divident)<=$wk_ohne_gutschein || $min_order_typ==0 || $min_order_typ==1) {
   $global[$id_global_min_order_zuschlag]="";
  }
   if (($global[$id_global_min_order]/$divident)<=$wk_ohne_gutschein && $min_order_typ==1) {
    $global[$id_global_min_order]="";
  }

  if ($global[$id_global_sumall]>=($global[$id_global_versandkfreiab]/$divident) && $global[$id_global_versandkfreiab]!=0) {    # Falls Summe > Versandk._frei_ab
    $global[$id_global_versandkosten]=0;                 # keine Versandkosten
  }
  if ($only_gutschein==1) {
    $global[$id_global_versandkosten]=0;
  }
  $global[$id_global_sumallv]=$global[$id_global_sumall]+$global[$id_global_versandkosten]+($global[$id_global_min_order_zuschlag]/$divident); # Summe inkl. Versandk. berechnen
  $global[$id_global_sumall]=&format_sum($global[$id_global_sumall]);           # Summe formatieren
  $global[$id_global_sumallv]=&format_sum($global[$id_global_sumallv]);         # Summe inkl. Versandk. formatieren
  $global[$id_global_versandkfreiab]=&format_sum($global[$id_global_versandkfreiab]);   # Versandk. frei ab formatieren
  if ($global[$id_global_versandkosten] ne "") {
    $global[$id_global_versandkosten]=&format_sum($global[$id_global_versandkosten]);   # Versandk.
  }
#   &abbruch($global[$id_global_sumall]);
  return @article;
}


# ==========================================================================================
# Der Parser fuer HTML und Mail Templates.
# Erkennt eine Reihe von Schluesselworten sowie die Befehle "IF" (mit OR Verknuepfung),
# "IFTHIS" und "REPEAT".
# ==========================================================================================

sub parse_line {
  local($linesave)=@_;
  local($array_typ,$vor_suche,$nachher,$ersetzen,$count,$i);
  local($leftright,$leftright_num);

  $linesave=~s/windows-1252/iso-8859-1/g;
  if ($ENV{"HTTPS"} eq "on") {$linesave=~s/https\:\/\/www.baudienst/https\:\/\/shop.baudienst/g;}
  $linesave=~s/\%5BSKRIPT\%5D/\[SKRIPT\]/g;
  while ($linesave=~/\[((LEFT|RIGHT)=(\d+)_)?([^\]]+)\]\n?/) {
    $code=$4;
    $leftright=$2;
    $leftright_num=$3;
    local($vorher)=$`;
    local($nachher)=$';
    $code=~s/\n/ /g;

   while ($code=~/\[/) {
     do {
       $nachher=~/\]/;
       $code.=']'.$`;
       $nachher=$';
       $open=($code=~s/\[/\[/g);
       $close=($code=~s/\]/\]/g);
     } while ($open!=$close);
     $code=&parse_line($code);
   }

    $divident="";
     if ($code=~/(.*)\/([\d|\.]+)$/) {
       $code=$1;
       $divident=$2;
     }

     foreach $currency (@currency) {
       @c=split(/\=/,$currency);
       if ($code=~/(.*)_$c[0]$/) {
         $code=$1;
         if ($divident eq "") {$divident=1;}
         $divident=$divident*$c[1];
         $acurrency=$c[0];
       }
     }

     if ($code=~/(.*)_HTML$/) {
      $code=$1;
      $html=1;
     } else {$html=0;}

     if ($code=~/(.*)_TEXTAREA$/) {
      $code=$1;
      $textarea=1;
     } else {$textarea=0;}

     if ($code eq "HIS_ON") {
       $his_off=0;
     }
     if ($code eq "HIS_OFF") {
      $his_off=1;
     }

    if ($code=~/(.*)_URLENC$/) {
      $code=$1;
      $urlenc=1;
    } else {$urlenc=0;}

    if ($code=~/(.*)_KLEIN$/) {
      $code=$1;
      $klein=1;
    } else {$klein=0;}

     if ($code=~/(.*)_CD$/) {
      $code=$1;
      $cd=1;
    } else {$cd=0;}

    if ($code=~/(.*)_CDNAME$/) {
      $code=$1;
      $cdname=1;
    } else {$cdname=0;}

     if ($code=~/(.*)_FIRST$/) {
      $code=$1;
      $first=1;
    } else {$first=0;}

    if ($code=~/^IF(\d|)_(.*)/s) {
      $ok=0;
      $if_nr=$1;
      @if=split(/_OR_/,$2);
      $if_field="";
      foreach $if (@if) {
        if ($if=~s/NOT_//==0) {$not_text="";$not=0} else {$not_text="NOT_";$not=1;}

        if ($if=~/PRINT\((.*)\)/) {
          $expr=$1;
          $expr=~s/\$/\$HIS_SCRIPT/g;
          $expr=~s/\<\</\[/g;
          $expr=~s/\>\>/\]/g;
          $expr=~s/\@/\@HIS_SCRIPT/g;

          $count=eval($expr);
          if ($count==0) {$count=-1}
          $if_field="PRINT";
        } elsif ($if=~/^\((.*)\)/s) {
          $expr=$1;
          $expr=~s/\$/\$HIS_SCRIPT/g;
          $expr=~s/\<\</\[/g;
          $expr=~s/\>\>/\]/g;
          $expr=~s/\@/\@HIS_SCRIPT/g;
           $expr=~s/\%/\%HIS_SCRIPT/g;
           $expr=~s/\~\~/\>\>/g;
          $count=eval($expr);
          if ($count==0) {$count=-1}
          $if_field="";
       } else {
        $if_field=$if;
        $array_typ=$multi{"$if"};
        $index=$index{"$if"};
        if ($array_typ==1) {
           if ($#article>=0) {
             @array=split(/\;/,$article[$count[$array_typ]]);
           } else {
             @array=split(/\;/,$basket[$count[$array_typ]]);
           }
           if ($array[$index] eq "") {$count=-1} else {$count=0;}
        } else {
          if ($input{$if} ne "") {$count=0} else {$count=-1}
        }
        if ($if eq "ARTIKEL")   {$count=$#article}
        if ($if eq "WARENK")    {$count=$#basket}
        if ($if eq "NEW_ORDER") {$count=$#basket_dat_new;}
        if ($array_typ==5) {if ($global[$index] eq "" || $global[$index] eq "0.00") {$count=-1} else {$count=0;}}
        if ($if eq "ORDERDAT") {$count=$#keyval;}
        if ($if eq "KUNDE")      {$count=$#user_daten;}
        }
        if ($count!=-1 && $not==0) {$ok++}
        if ($count==-1 && $not==1) {$ok++}
      }
        if ($if_field ne "") {
          $nachher=~s/\[IF${if_nr}_${not_text}${if_field}_END\]\n?//s; $nach_suche=$';
        } else {
          $nachher=~s/\[IF${if_nr}_${not_text}${if_field}END\]\n?//s; $nach_suche=$';
        }
       if ($ok==0) {
         $linesave=$vorher.$nach_suche;
       } else {
        $linesave=$vorher.$nachher;
      }
    }
    elsif ($code=~/^REPEAT_(.*)/) {
      $array_typ=$multi{"$1"};
      $old_repeat_mode=$repeat_mode;
      if ($1 eq "ARTIKEL")   {$count=$#article;$repeat_mode=1;$array_typ=1}
      if ($1 eq "WARENK")    {$count=$#basket;$repeat_mode=2;$array_typ=1}
      if ($1 eq "NEW_ORDER") {$count=$#basket_dat_new;$repeat_mode=3;$array_typ=1}
      if ($1 eq "ORDERDAT")  {$count=$#keyval;$array_typ=6}
      if ($1 eq "COUNTER")   {$count=$HIS_SCRIPTcounter-1;}

      if ($1 eq "RORDER") {
         $array_typ=8;
         $repeat_mode=8;
         if ($input{"month"} eq "") {$input{"month"}=$month;}
         if ($input{"year"} eq "") {$input{"year"}=$year;}
         @order_list=&get_order_list($input{"month"},$input{"year"},$partner_daten[$pindex{"$partner_login_field"}]);
         $count=$#order_list;
      }
      if ($1 eq "INFO")      {
         @array=split(/\;/,$article[$count[1]]);
         @subarray=split(/ \* /,$array[$index{"PREIS"}]);
         $count=$#subarray;
         $repeat_mode=4;
         $array_typ=2;
      }
      if ($1 eq "PARTNER")   {
         $count=0;
         $repeat_mode=5;
         $array_typ=7;
      }
      $repeat_keyword=$1;
      $nachher=~/\[REPEAT_${repeat_keyword}_END\]/;
      $vor_suche=$`;$nachher=$';
      $ersetzen="";
      for ($count[$array_typ]=0;$count[$array_typ]<=$count;$count[$array_typ]++) {
        $ersetzen.=&parse_line($vor_suche) ;
      }
      $repeat_mode=$old_repeat_mode;
      $linesave=$vorher.$ersetzen.$nachher;
    }
    else {
      $index=$index{"$code"};
      $array_typ=$multi{"$code"};

      if ($code eq "APREIS") {$index=$index{"PREIS"}};
      if ($code eq "OPREIS") {$index=$index{"PREIS"}};
      if ($code eq "MPREIS") {$index=$index{"PREIS"}};

      if ($leftright eq "LEFT")  {$left=$leftright_num;}  else {$left=0;}
      if ($leftright eq "RIGHT") {$right=$leftright_num;} else {$right=0;}

       if ($code=~/PIC(\d+)\_SCALE_(.*)/) {
        $code="PIC$1";
        $scale=$2;
      }
      if ($code=~/PIC(\d+)\_WIDTH_(.*)/) {
        $code="PIC$1";
        $do_width=$2;
      }
    if ($code=~/PIC(\d+)\_HEIGHT_(.*)/) {
        $code="PIC$1";
        $do_height=$2;
      }
    if ($code=~/PIC(\d+)\_MAX_(.*)/) {
        $code="PIC$1";
        $do_max=$2;
      }



      $align="";
      if ($code=~/PIC(\d+)\_(.*)/) {
        $code="PIC$1";
        $align=" align=$2";
      }

        if ($code=~/PIC(\d+)/) {

          if ($repeat_mode==1 || $repeat_mode==4) {@array=split(/\;/,$article[$count[1]])}
          if ($repeat_mode==2) {@array=split(/\;/,$basket[$count[1]])}
#         @array=split(/\;/,$article[$count[1]]);
         $pichttpnr=$1-1;                # PIC1 => $pichttp[0], PIC2 => $pichttp[1] usw.

         $this_pic=$array[$index{"$pic_field_name[$pichttpnr]"}];
         @a=split(/ \* /,$this_pic);
         $this_pic=$a[0];

         $this_pic=~s/\s//g;
         $this_pic=~s/[\\\/]//g;

         $file=$this_pic;
         $filegif=$this_pic.".gif";
         $filejpg=$this_pic.".jpg";
         $filename="";$filenamed="";$fancybox=0;

         if ($pichttpnr==0) {
           if (&exist("../../bilder/thumb/".$array[$index{"NUMMER"}].".gif")) {
              if (&exist("../../bilder/pic/".$array[$index{"NUMMER"}].".jpg")) {$filenamed="/bilder/pic/".$array[$index{"NUMMER"}].".jpg"; $filename="/bilder/thumb/".$array[$index{"NUMMER"}].".gif"; ($width,$height)=&get_gif("../../bilder/thumb/",$array[$index{"NUMMER"}].".gif");$fancybox=1; }
     	      elsif (&exist("../../bilder/pic/".$array[$index{"NUMMER"}].".gif")) {$filenamed="/bilder/pic/".$array[$index{"NUMMER"}].".gif"; $filename="/bilder/thumb/".$array[$index{"NUMMER"}].".gif"; ($width,$height)=&get_gif("../../bilder/thumb/",$array[$index{"NUMMER"}].".gif");$fancybox=1; }
              elsif (&exist("../../bilder/pic/".$array[$index{"NUMMER"}].".png")) {$filenamed="/bilder/pic/".$array[$index{"NUMMER"}].".png"; $filename="/bilder/thumb/".$array[$index{"NUMMER"}].".gif"; ($width,$height)=&get_gif("../../bilder/thumb/",$array[$index{"NUMMER"}].".gif");$fancybox=1; }

           }
   	  if (&exist("../../bilder/thumb/".$array[$index{"NR"}].".gif")) {
	     if (&exist("../../bilder/pic/".$array[$index{"NR"}].".jpg")) {$filenamed="/bilder/pic/".$array[$index{"NR"}].".jpg"; $filename="/bilder/thumb/".$array[$index{"NR"}].".gif"; ($width,$height)=&get_gif("../../bilder/thumb/",$array[$index{"NR"}].".gif");$fancybox=1; }
    	     elsif (&exist("../../bilder/pic/".$array[$index{"NR"}].".gif")) {$filenamed="/bilder/pic/".$array[$index{"NR"}].".gif"; $filename="/bilder/thumb/".$array[$index{"NR"}].".gif"; ($width,$height)=&get_gif("../../bilder/thumb/",$array[$index{"NR"}].".gif");$fancybox=1; }
             elsif (&exist("../../bilder/pic/".$array[$index{"NR"}].".png")) {$filenamed="/bilder/pic/".$array[$index{"NR"}].".png"; $filename="/bilder/thumb/".$array[$index{"NR"}].".gif"; ($width,$height)=&get_gif("../../bilder/thumb/",$array[$index{"NR"}].".gif");$fancybox=1; }

          }
        } 

         if    (&exist("$picverz[$pichttpnr]$file") && $this_pic ne "")    {$filename="$pichttp[$pichttpnr]$file";    ($width,$height)=&get_gif($picverz[$pichttpnr],$file)}
         elsif (&exist("$picverz[$pichttpnr]$filegif") && $this_pic ne "") {$filename="$pichttp[$pichttpnr]$filegif"; ($width,$height)=&get_gif($picverz[$pichttpnr],$filegif)}
         elsif (&exist("$picverz[$pichttpnr]$filejpg") && $this_pic ne "") {$filename="$pichttp[$pichttpnr]$filejpg"; ($width,$height)=&get_gif($picverz[$pichttpnr],$filejpg)}
         elsif ($use_default_pic==1) {$filename="$pichttp[$pichttpnr]$default_pic"; ($width,$height)=&get_gif($picverz[$pichttpnr],$default_pic)}

          if ($scale ne "") {
              $width=int($width/100*$scale);
              $height=int($height/100*$scale);
          }
          if ($do_max ne "") {           
             $do_width="";$do_height="";
             if ($width>$height) {$do_width=$do_max;} else {$do_height=$do_max;}
           }
            if ($do_width ne "" && $width!=0 && $height!=0) {
              $owidth=$width;
              $width=$do_width;
              $height=int($width/$owidth*$height);
          }
          if ($do_height ne "" && $width!=0 && $height!=0) {
              $oheight=$height;
              $height=$do_height;
              $width=int($height/$oheight*$width);
          }


        if ($filename ne "") {
          $array[$index]=qq!<img src="$filename"$align hspace=5>!;

          if ($width!=0 && $height!=0) {
             $array[$index]=qq!<img src="$filename"$align width=$width height=$height border=0 hspace=5>!;
          }
          
         if ($pichttpnr==0 && $pdfok{$array[$index{"NR"}]} ne "") {
             $array[$index]=$pdfok{$array[$index{"NR"}]};
         }


             $gid=$array[$index{"NR"}];$pdfcount=0; $fpdf=$filenamed;$fpdf=~s/(\....)$/\.pdf/;$spdf="";$lastpdf="";

          if (($fancybox==1 || 1==1) && ($input{"t"}=~/^s/ || $input{"t"}=~/^a(\d+)/) && $pichttpnr==0 && $pdfok{$array[$index{"NR"}]} eq "") {
    	  

             
             if ($#pdfartikel==-1) {
               @pdfartikel=&read_data("/www/fairzone.de/web/media/cgi-bin/suche/pdfartikel/pdfsuche.txt");
	       @pdfartikel2=&read_data("/www/fairzone.de/web/media/cgi-bin/suche/pdfersatzteil/pdfsuche.txt");
	         foreach $pdfartikel2 (@pdfartikel2) {
                  @dp=split(/\|/,$pdfartikel2);$dp[5]=1;
                  push(@pdfartikel,join('|',@dp));
                }
             }
             $mynr1=$array[$index{"NUMMER"}];$mynr2=$array[$index{"NR"}];
             foreach $pdfartikel (@pdfartikel) {
               @dp=split(/\|/,$pdfartikel);$pdfpath="prospekte";if ($dp[5]==1) {$pdfpath="ersatzteillisten/makita";}
               $dptitel="PDF-Katalog";if ($dp[2] ne "") {$dptitel=$dp[2];}
               if ($pdfcount<=50) {
                 if (($dp[4]=~/(^| )$mynr1($| )/ && $mynr1 ne "") || ($dp[4]=~/(^| )$mynr2($| )/ && $mynr2 ne "")) {

		   $pdfcount++;
   		   if ($pdfcount==1) {
                   #   $spdf.=qq!<a href=javascript:NewWindow_pdf2("/bilder/artikel/$dp[0]#page=$dp[1]")><img src="/bilder/nav/icon_pdf_small.gif" width="10" height="10" align="absmiddle" class="magnify" alt="PDF" title="PDF" border="0"></a>!;
                   #   $spdf.=qq! <a href=javascript:NewWindow_pdf2("/bilder/artikel/$dp[0]#page=$dp[1]") class="fancybox">$dptitel <img src="https://boxx.media/cgi-bin/thumbs_pdf.pl?pdf=$dp[0]&page=$dp[1]" height="75"></a></p>!;
			 $spdf.=qq!<a href="https://boxx.media/baudienst/pdf/$pdfpath/$dp[0]#page=$dp[1]" class="fancybox_iframe" rel="pdfgallery$gid" id="pdfgallery${gid}_$pdfcount"><img src="https://boxx.media/cgi-bin/thumbs_pdf.pl?pdf=$dp[0]&page=$dp[1]" height="0"></a>!;
                         $lastpdf="pdfgallery${gid}";$dptitel="Prospekte";$lastpdftitel=$dptitel;
                   } else {
	  	  #  $spdf.=qq! <a href=javascript:NewWindow_pdf2("/bilder/information/prospekt/$dp[0]#page=$dp[1]") class="fancybox"><img src="https://boxx.media/cgi-bin/thumbs_pdf.pl?pdf=$dp[0]&page=$dp[1]" style="max-width:150px;max-height:150px"></a>!;                 
	          $spdf.=qq!<a href="https://boxx.media/baudienst/pdf/$pdfpath/$dp[0]#page=$dp[1]" class="fancybox_iframe" rel="pdfgallery$gid" id="pdfgallery${gid}_$pdfcount"><img src="https://boxx.media/cgi-bin/thumbs_pdf.pl?pdf=$dp[0]&page=$dp[1]" width="0" height="0"></a>!;
                    }      

                 }
               }
             }

             if (&exist("../..".$fpdf) && $fpdf ne "") {
#               $spdf.=qq!<p class="script4" style="display:inline"><a href=javascript:NewWindow_pdf2("$fpdf")><img src="/bilder/nav/icon_pdf_small.gif" width="10" height="10" align="absmiddle" class="magnify" alt="PDF" title="PDF" border="0"></a> <a href=javascript:NewWindow_pdf2("$fpdf") class="fancybox">PDF-Katalog</a></p><br>!;
                $pdfcount++;$hpdf=$fpdf;$hpdf=~s/\/bilder\/artikel\///g;
		$spdf.=qq!<a href="$fpdf#page=1" class="fancybox_iframe" rel="pdfgallery$gid" id="pdfgallery${gid}_$pdfcount"><img src="https://shop.baudienst.com/cgi-bin/hws/thumbs_pdf.pl?pdf=$hpdf&page=1" width="0" height="0"></a>!;

             }

        
         $sl="verf&uuml;gbare Detailbilder";if ($pdfcount>0 || 1==1) {$sl='Detailbilder';}
if ($filenamed ne "") {
   $snew=qq!$spdf<p class="script4" style="display:inline">!;
   if ($fancybox==1) {$snew.=qq!<div style="float:left;height:20px;padding-bottom:1px"><a href=javascript:document.getElementById("gallery${gid}_1").click()><img src="/bilder/nav/icon_bild.gif" width="16" height="12" align="absmiddle" class="magnify" alt="Vergr&ouml;&szlig;ern" title="Vergr&ouml;&szlig;ern" border="0"></a> <a href=javascript:document.getElementById("gallery${gid}_1").click() style="font-weight:normal"><font style="font-size:11px;">$sl</font></a></div>!;}
   if ($pdfcount>0) {$snew.=qq!<div style="float:right;height:20px;padding-bottom:1px"><a href=javascript:document.getElementById("${lastpdf}_1").click() style="font-weight:normal"><font style="font-size:11px">Prospekte</font></a> <a href=javascript:document.getElementById("${lastpdf}_1").click()><img src="/bilder/nav/icon_pdf_small.gif" width="10" height="10" align="absmiddle" border="0" style="margin-right:3px"></a></div><div style="clear:both"></div>!;}
   $snew.=qq!<a href="$filenamed" class="fancybox" rel="gallery$gid" id="gallery${gid}_1">!.$array[$index]."</a></p>";
   $array[$index]=$snew;
  }
        
         if ($filenamed eq "" && $lastpdf ne "") {$array[$index]=qq!<div style="display:inline">$spdf</div><div style="float:right;height:20px;padding-bottom:1px;padding-right:10px;"><a href=javascript:document.getElementById("${lastpdf}_1").click() style="font-weight:normal"><font style="font-size:11px">$lastpdftitel</font></a> <img src="/bilder/nav/icon_pdf_small.gif" width="10" height="10" align="absmiddle" class="magnify" alt="Vergr&ouml;&szlig;ern" title="Vergr&ouml;&szlig;ern" border="0"></div><a href=javascript:document.getElementById("${lastpdf}_1").click() style="font-weight:normal">!.$array[$index].qq!</a>!;}
#$array[$index]="TEST";

         $xy=1;
         do {
          $xok=0;$xz=$xy+1;
          if (&exist("../../bilder/pic/".$array[$index{"NUMMER"}]."_$xy.jpg")) {$filenamed="/bilder/pic/".$array[$index{"NUMMER"}]."_$xy.jpg";$array[$index].=qq!<a href="$filenamed" class="fancybox" rel="gallery$gid" id="gallery${gid}_$xz"></a>!;$xok=1; }
   	  if (&exist("../../bilder/pic/".$array[$index{"NR"}]."_$xy.jpg")) {$filenamed="/bilder/pic/".$array[$index{"NR"}]."_$xy.jpg";$array[$index].=qq!<a href="$filenamed" class="fancybox" rel="gallery$gid" id="gallery${gid}_$xz"></a>!;$xok=1;  }
          if (&exist("../../bilder/pic/".$array[$index{"NUMMER"}]."_$xy.gif")) {$filenamed="/bilder/pic/".$array[$index{"NUMMER"}]."_$xy.gif";$array[$index].=qq!<a href="$filenamed" class="fancybox" rel="gallery$gid" id="gallery${gid}_$xz"></a>!;$xok=1; }
   	  if (&exist("../../bilder/pic/".$array[$index{"NR"}]."_$xy.gif")) {$filenamed="/bilder/pic/".$array[$index{"NR"}]."_$xy.gif";$array[$index].=qq!<a href="$filenamed" class="fancybox" rel="gallery$gid" id="gallery${gid}_$xz"></a>!;$xok=1;  }
          if (&exist("../../bilder/pic/".$array[$index{"NUMMER"}]."_$xy.png")) {$filenamed="/bilder/pic/".$array[$index{"NUMMER"}]."_$xy.png";$array[$index].=qq!<a href="$filenamed" class="fancybox" rel="gallery$gid" id="gallery${gid}_$xz"></a>!;$xok=1; }
   	  if (&exist("../../bilder/pic/".$array[$index{"NR"}]."_$xy.png")) {$filenamed="/bilder/pic/".$array[$index{"NR"}]."_$xy.png";$array[$index].=qq!<a href="$filenamed" class="fancybox" rel="gallery$gid" id="gallery${gid}_$xz"></a>!;$xok=1;  }
       
           $xy++;
         } while ($xok==1 || $xy<5);


  
             $pdfok{$array[$index{"NR"}]}=$array[$index];
        #   $array[$index]=qq!<p class="script4" style="display:inline"><a href="$filenamed" class="fancybox_iframe"><img src="/bilder/nav/icon_bild.gif" width="16" height="12" align="absmiddle" class="magnify" alt="Vergr&ouml;&szlig;ern" title="Vergr&ouml;&szlig;ern" border="0"></a> <a href=javascript:NewWindow_pdf2("$filenamed") class="fancybox">verf&uuml;gbare Detailbilder</a></p><br><a href=javascript:NewWindow_pdf2("$filenamed") class="fancybox">!.$array[$index]."</a>";     
          }
if ($fancybox==1 && ($input{"t"} eq "a1")) {
#              $array[$index]=qq!<p class="script4" style="display:inline"><a href=javascript:NewWindow_pdf2("$filenamed") class="fancybox"><img src="/bilder/nav/icon_bild.gif" width="16" height="12" align="absmiddle" class="magnify" alt="Vergr&ouml;&szlig;ern" title="Vergr&ouml;&szlig;ern" border="0"></a> <a href=javascript:NewWindow_pdf2("$filenamed") class="fancybox">verf&uuml;gbare Detailbilder</a></p><br><a href=javascript:NewWindow_pdf2("$filenamed") class="fancybox">!.$array[$index]."</a>";
          }


#NewWindow_pdf3(URL)

        } elsif ($pichttpnr==0) {

 if ($pichttpnr==0 && $pdfok{$array[$index{"NR"}]} ne "") {
             $array[$index]=$pdfok{$array[$index{"NR"}]};
         } else {

  $fpdf="../../bilder/pic/".$array[$index{"NUMMER"}].".pdf";
$spdf="";$pdfcount=0;$gid=$array[$index{"NR"}];
             if ($#pdfartikel==-1) {
		@pdfartikel=&read_data("/www/fairzone.de/web/media/cgi-bin/suche/pdfartikel/pdfsuche.txt");
                @pdfartikel2=&read_data("/www/fairzone.de/web/media/cgi-bin/suche/pdfersatzteil/pdfsuche.txt");
                foreach $pdfartikel2 (@pdfartikel2) {
                  @dp=split(/\|/,$pdfartikel2);$dp[5]=1;
                  push(@pdfartikel,join('|',@dp));
                }
             }
             $mynr1=$array[$index{"NUMMER"}];$mynr2=$array[$index{"NR"}];


            foreach $pdfartikel (@pdfartikel) {
               @dp=split(/\|/,$pdfartikel);$pdfpath="prospekt";if ($dp[5]==1) {$pdfpath="ersatzteilliste";}
               $dptitel="PDF-Katalog";if ($dp[2] ne "") {$dptitel=$dp[2];}
      
              if ($pdfcount<=50) {
                 if (($dp[4]=~/(^| )$mynr1($| )/ && $mynr1 ne "") || ($dp[4]=~/(^| )$mynr2($| )/ && $mynr2 ne "")) {


                   $pdfcount++;
   		   if ($pdfcount==1) {
                   #   $spdf.=qq!<a href=javascript:NewWindow_pdf2("/bilder/artikel/$dp[0]#page=$dp[1]")><img src="/bilder/nav/icon_pdf_small.gif" width="10" height="10" align="absmiddle" class="magnify" alt="PDF" title="PDF" border="0"></a>!;
                   #   $spdf.=qq! <a href=javascript:NewWindow_pdf2("/bilder/artikel/$dp[0]#page=$dp[1]") class="fancybox">$dptitel <img src="https://shop.baudienst.com/cgi-bin/hws/thumbs_pdf.pl?pdf=$dp[0]&page=$dp[1]" height="75"></a></p>!;
		   #	 $spdf=qq!<p class="script4" style="display:inline"><img src="/bilder/nav/icon_pdf_small.gif" width="10" height="10" align="absmiddle" class="magnify" alt="PDF" title="PDF" border="0"> <a href="/bilder/artikel/$dp[0]#page=$dp[1]" class="fancybox_iframe" rel="pdfgallery$gid">$dptitel<br><img src="https://shop.baudienst.com/cgi-bin/hws/thumbs_pdf.pl?pdf=$dp[0]&page=$dp[1]" style="max-width:150px;max-height:150px"></a></p><br>!;
	        $lastpdf="pdfgallery${gid}";
               $spdf=qq!<div style="float:right;height:20px;padding-bottom:1px"><a href=javascript:document.getElementById("${lastpdf}").click() style="font-weight:normal"><font style="font-size:11px">Prospekte</font></a> <a href=javascript:document.getElementById("${lastpdf}_1").click()><img src="/bilder/nav/icon_pdf_small.gif" width="10" height="10" align="absmiddle" border="0" style="margin-right:3px"></a></div>!;
               $spdf.=qq!<a href="/bilder/information/$pdfpath/$dp[0]#page=$dp[1]" class="fancybox_iframe" rel="pdfgallery$gid" id="pdfgallery$gid"><img src="https://shop.baudienst.com/cgi-bin/hws/thumbs_pdf.pl?pdf=$dp[0]&page=$dp[1]" style="max-width:150px;max-height:150px;background-color:#fff;border:1px solid;"></a>!;

                   } else {
	  	  #  $spdf.=qq! <a href=javascript:NewWindow_pdf2("/bilder/artikel/$dp[0]#page=$dp[1]") class="fancybox"><img src="https://shop.baudienst.com/cgi-bin/hws/thumbs_pdf.pl?pdf=$dp[0]&page=$dp[1]" style="max-width:150px;max-height:150px"></a>!;
$spdf.=qq!<a href="/bilder/information/$pdfpath/$dp[0]#page=$dp[1]" class="fancybox_iframe" rel="pdfgallery$gid"><img src="https://shop.baudienst.com/cgi-bin/hws/thumbs_pdf.pl?pdf=$dp[0]&page=$dp[1]" width="0" height="0"></a>!;


                    }               
                 }
               }
             }
             if (&exist("../..".$fpdf)) {$spdf.=qq!<p class="script4" style="display:inline"><a href=javascript:NewWindow_pdf2("$fpdf")><img src="/bilder/nav/icon_pdf_small.gif" width="10" height="10" align="absmiddle" class="magnify" alt="PDF" title="PDF" border="0"></a> <a href=javascript:NewWindow_pdf2("$fpdf") class="fancybox">PDF-Katalog</a></p><br>!;}

          if ($spdf ne "") {$spdf=qq!<p class="script4" style="display:inline">$spdf</p><br>!;}

          $array[$index]=$spdf;
          $pdfok{$array[$index{"NR"}]}=$array[$index];
}
    
        }
      } else {
         if ($array_typ==1 || $array_typ==2) {
          if ($code=~/BINFO(\d+)/) {$array_typ=1;}
          if ($repeat_mode==1) {@array=split(/\;/,$article[$count[$array_typ]])}
          if ($repeat_mode==2) {@array=split(/\;/,$basket[$count[$array_typ]])}
          if ($repeat_mode==3) {@array=split(/\;/,$basket_dat_new[$count[$array_typ]])}
          if ($repeat_mode==4) {
            @oarray=split(/\;/,$article[$count[1]]);
            @array=split(/\;/,$article[$count[1]]);
            @array=split(/ \* /,$array[$index]);
            $array[$index]=$array[$count[2]];
          }
        };
        if ($repeat_mode==5) {
          if ($#partner_daten!=-1) {
            @array=@partner_daten;
          } else {
            @array=&get_partner_data($input{"G_pid"});
          }
          $index=$pindex{"$code"};
        }

        if ($array_typ==5) {@array=@global;};
        if ($array_typ==6) {@array=split(/\;/,$keyval[$count[$array_typ]])};
        if ($repeat_mode==8) {@array=split(/\|/,$order_list[$count[$array_typ]])};
      }
       if ($code=~/^(U_(.*))/ && $repeat_mode!=5) {
         $fieldname=$1;
         if ($fieldname=~/\=/) {
           @kv_ausgabe=split(/\-\>/,$fieldname);
           @kv=split(/\=/,$kv_ausgabe[0]);
           if ($user_daten[$uindex{$kv[0]}] eq $kv[1]) {
             $array[$index]=$kv_ausgabe[1];
             $uindex{$code}=1;
           } else {
             $array[$index]="";
           }
         } else {
           $array[$index]=$user_daten[$uindex{$1}];
         }
       }
       if ($code=~/^(P_(.*))/) {
         $fieldname=$1;
         if ($fieldname=~/\=/) {
           @kv_ausgabe=split(/\-\>/,$fieldname);
           @kv=split(/\=/,$kv_ausgabe[0]);
           if ($partner_daten[$pindex{$kv[0]}] eq $kv[1]) {
             $array[$index]=$kv_ausgabe[1];
             $uindex{$code}=1;
           } else {
             $array[$index]="";
           }
         } else {
           $array[$index]=$partner_daten[$pindex{$1}];
         }
       }

       if ($code eq "PREIS") {
         $array[$index]=&format_sum($array[$index]);
       }

       if ($code eq "OPTIONEN") {
          if ($array[$index]=~/\~/) {

            @d=split(/\~/,$array[$index]);
            $this="";$dc=0;$radiocount++;
            $this.=qq!<select id="select$process_id$radiocount" name="OPTION_select[NR]" onChange="update${process_id}_$count[$array_typ]()">!;
             $countd=-1;
             foreach $d (@d) {
              $countd++;

              $dc++;if ($dc==1) {$dsel=" checked";} else {$dsel="";}
              $np=0.00;


              if ($d=~s/\-(\d+)(\.|\,)(\d+)/-$1$2$3 EUR/g) {
                $np=qq!-$1.$3!;
              } elsif ($d=~s/(\d+)(\.|\,)(\d+)/ $1$2$3 EUR/g) {
                $np=qq!$1.$3!;
              }


              $dout=$d;$dout=~s/\#(\d+) //g;
              $this.=qq!<option value="$d"> $dout<br>!;
              $input{"js$count[$array_typ]"}.=qq!if (document.getElementById('select$process_id$radiocount').selectedIndex==$countd) {document.aform$process_id.field!.$count[$array_typ].qq!.value=formatPrice(parseFloat(document.aform$process_id.cfield!.$count[$array_typ].qq!.value)!.qq!+(!.&format_sum($np).qq!))+' EUR';}\n!;

            }
           $this.=qq!</select>!;
            $array[$index]=$this;


         }
         elsif ($array[$index]=~/\:/) {
            @d=split(/\:/,$array[$index]);
            $this="";$dc=0;

             foreach $d (@d) {
              $radiocount++;
              $dc++;if ($dc==1) {$dsel=" checked";} else {$dsel="";}
              $np=0.00;

              if ($d=~s/\-(\d+)(\.|\,)(\d+)/-$1$2$3 EUR/g) {
                $np=qq!-$1.$3!;
              } elsif ($d=~s/(\d+)(\.|\,)(\d+)/ $1$2$3 EUR/g) {
                $np=qq!$1.$3!;
              }


              $dout=$d;$dout=~s/\#(\d+) //g;
              $this.=qq!<input type="radio" id="radio$process_id$radiocount" name="OPTION_select[NR]" $dsel value="$d" onClick="update${process_id}_$count[$array_typ]()" value="ok"> $dout<br>!;
              $input{"js$count[$array_typ]"}.=qq!if (document.getElementById('radio$process_id$radiocount').checked) {document.aform$process_id.field!.$count[$array_typ].qq!.value=formatPrice(parseFloat(document.aform$process_id.cfield!.$count[$array_typ].qq!.value)!.qq!+(!.&format_sum($np).qq!))+' EUR';}\n!;

            }

            $array[$index]=$this;

          } else {

            @d=split(/\,/,$array[$index]);
            $this="";

            $input{"js$count[$array_typ]"}.=qq!var anz=0;\n!;
            %warschon_opt=();
            foreach $d (@d) {
              $optnr="";
              if ($d=~/\#(dif|op|)([a-z]|)/) {
                $optnr=$2;
                if ($warschon_opt{$optnr}==0) {
                   $warschon_opt{$optnr}=1;
                   $input{"js$count[$array_typ]"}.=qq!var anz$optnr=0;\n!;
       
                }
              }

              $elecount++;
              $np=0.00;
              if ( $d=~s/\-(\s|)(\d+)(\.|\,)(\d+)$/-$2$3$4 EUR/g) {
                $np=qq!-$2.$4!;
               }
             elsif ($d=~s/(\s|)(\d+)(\.|\,)(\d+)$/ $2$3$4 EUR/g) {
                $np=qq!$2.$4!;
              }
              $dout=$d;$dout=~s/\#(dif|op|)([a-z]|)(.*?) //g;$dout=~s/(\d+)(\.|\,)(\d+)kg//g;
              $this.=qq!<input type="checkbox" id="check$process_id$elecount" name="OPTION_select[NR]" value="$d" onClick="update${process_id}_$count[$array_typ]()" value="ok"> $dout<br>\n!;
              if ($d=~/\#(dif|op|)([a-z]|)(.*?) /) {
                 $optnr=$2;
                 if ($optnr ne "") {
                   $input{"js$count[$array_typ]"}.=qq!if (document.getElementById('check$process_id$elecount').checked && anz$optnr==1) {alert("Bitte nur eine Option auswählen.");document.getElementById('check$process_id$elecount').checked=false;}\n!;
                   $input{"js$count[$array_typ]"}.=qq!if (document.getElementById('check$process_id$elecount').checked && anz$optnr==0) {document.aform$process_id.field!.$count[$array_typ].qq!.value=formatPrice(parseFloat(document.aform$process_id.field!.$count[$array_typ].qq!.value)+($np))+' EUR';anz$optnr=anz$optnr+1;}\n!; 
                 }
                 if ($optnr eq "") {
                   $input{"js$count[$array_typ]"}.=qq!if (document.getElementById('check$process_id$elecount').checked) {document.aform$process_id.field!.$count[$array_typ].qq!.value=formatPrice(parseFloat(document.aform$process_id.field!.$count[$array_typ].qq!.value)+($np))+' EUR';anz$optnr=anz$optnr+1;}\n!; 
              
                 }
              } else {
                $input{"js$count[$array_typ]"}.=qq!if (document.getElementById('check$process_id$elecount').checked && anz==0) {document.aform$process_id.field!.$count[$array_typ].qq!.value=formatPrice(parseFloat(document.aform$process_id.field!.$count[$array_typ].qq!.value)+($np))+' EUR';}\n!;
              }


            }



#print "Content-Type: text/html\n\n";
#print $input{"js$count[$array_typ]"};exit;


            $array[$index]=$this;
         }
       }



       if ($code eq "MPREIS") {
           $array[$index]=$array[$index{"PREIS"}];
       }


        if ($code eq "OPREIS") {

          if ($oarray[$index{"OPTIONEN"}]=~/\:/) {
            @d=split(/\:/,$oarray[$index{"OPTIONEN"}]);
            $d=$d[0];
            $d=~s/(\d+)(\.|\,)(\d+)/+$1$2$3 EUR/g;
            $np=qq!$1.$3!;
            if (  $d=~s/\-(\d+)(\.|\,)(\d+)/-$1$2$3 EUR/g) {
            $np=qq!-$1.$3!;
            }
            $array[$index]=&format_sum(&format_sum($array[$index{"PREIS"}])+$np)
          } else {
            $array[$index]=&format_sum($array[$index{"PREIS"}]);
          }
       }




       if ($code eq "APREIS") {

           @p=split(/\ /,$array[$id_article_costs]);
           foreach $p (@p) {
              @pq=split(/\?/,$p);
              if ($array[$id_article_quantity]>=$pq[1]) {
                $preis=&format_sum($pq[0]);
              }
           }
           if ($array[$id_article_quantity]==0) {
             @pq=split(/\?/,$p[0]);
             $preis=&format_sum($pq[0]);
           }
           $array[$index]=&format_sum($preis);
       }


      if ($index{"$code"} eq "" && $uindex{"$code"} eq "" && $pindex{"$code"} eq "" ) {
         $array[$index]=$input{"$code"};
      }

      if ($code eq "KEYWORDS") {
         $k="";
         foreach $key (sort(keys %input)) {
           if ($key=~/G_KEYWORD_(.*)/) {
             $kw=$input{$key};
             $key=$1;
             $k.=qq!<a href="$shoppl?f=*NAME,*GRUPPE&c=!.&url_encode($kw).qq!&t=temgroup" onMouseOver="parent.promo.document.cross1.src='https://bikertech.de/shop/Crosspromobilder/cross_bild_Sitemap_!.&cd_encode($key).qq!_1.gif';parent.promo.document.cross2.src='https://bikertech.de/shop/Crosspromobilder/cross_bild_Sitemap_!.&cd_encode($key).qq!_2.gif';parent.promo.document.textform.cross1.value='[G_CROSS_TEXT_SITEMAP_!.&cd_encode($key).qq!_1]';parent.promo.document.textform.cross2.value='[G_CROSS_TEXT_SITEMAP_!.&cd_encode($key).qq!_2]'">$kw</a><br>\n!;
           }
         }
         $array[$index]="$k";
      }

      if ($code=~/BINFO(\d+)/) {
         $array_typ=1;
         @array=split(/\;/,$article[$count[$array_typ]]);
         $nr=$1;
         $binfo=$array[$id_article_binfo];
         @binfo=split(/\<select/,$binfo);
         $array[$index]="<select ".$binfo[$nr];
       }
       if ($code=~/BINFO_(.*)/) {
         $array_typ=1;
         @array=split(/\;/,$article[$count[$array_typ]]);
         $array[$index]=$binfo{$1."-".$array[$id_article_id]};
       }

       if ($code=~/PRINT(L|C|F|I|T|)\((.*)\)/) {
        $mode=$1;
        $var=$2;
        $var=~s/\$/\$HIS_SCRIPT/g;
        $var=~s/\<\</\[/g;
        $var=~s/\>\>/\]/g;
        $array[$index]=eval($var);
        if ($mode eq 'I'){
          $array[$index]="";
        }
        if ($mode eq 'F') {
          $array[$index]=&format_sum($array[$index]);
        }
        if ($mode eq 'C') {
          $array[$index]=~ tr/a-z/A-Z/;
        }
        if ($mode eq 'L') {
          $array[$index]=~ tr/A-Z/a-z/;
        }
        if ($mode eq 'T') {
          $array[$index]=&format_tausender($array[$index]);
        }
      }
      if ($code=~/^\$/) {
         if ($code=~/\$VERSANDKOSTEN=(.*)/) {
           $versandk_hoehe=$1;
           foreach $porto_daten (@porto_daten) {
             @d=split(/\;/,$porto_daten);
             $d[1]=$versandk_hoehe;
             $d[2]=0;
             $porto_daten=join(';',@d);
           }
           @basket=&format_warenkorb;
         }
         if ($code=~/\$FIELD_BASKET_(.*)\=(.*)/) {
           @array=split(/\;/,$basket_dat[$count[1]]);
           $array[$index{$1}]=eval($2);
           $basket_dat[$count[1]]=join(';',@array);
           @basket=&format_warenkorb;
         }
         $code=~s/\$/\$HIS_SCRIPT/g;
         $code=~s/\$HIS_SCRIPT\#/\$\#HIS_SCRIPT/g;
         $code=~s/\<\</\[/g;
         $code=~s/\>\>/\]/g;
         eval($code);
         if ($code=~/^\$HIS_SCRIPTG_(.*)\=/) {
            $variable_name=$1;
            $variable_name=~s/\s//g;
            $global{"G_".$1}=eval('$HIS_SCRIPTG_'.$variable_name);
            $input{"G_".$1}=$global{"G_".$1};
            &search_user($global[$id_global_userid]);
         }
         $array[$index]="";
      }

      if ($code eq "NO_VERSANDKOSTEN") {
         &abbruch("No Versandk!");
      }



     if ($code eq "TELEFON1VORWAHL_FIELD" || $code eq "TELEFON2VORWAHL_FIELD" || $code eq "FAX1VORWAHL_FIELD" || $code eq "FAX2VORWAHL_FIELD") {
        $style="";$myfield=$code;$myfield=~s/_FIELD//g;$nfield=$myfield;$nfield=~s/VORWAHL//g;
        if ($code!~/TELEFON1/) {$style='style="background-color:#E5E5E5"';}  
        if ($input{"$nfield"} ne "") {@parts=split(/ /,$input{"$nfield"},3);}
        if ($input{"$nfield"} eq"") {@parts=split(/ /,$user_daten[$uindex{"U_$nfield"}],3);}
        if ($user_daten[$uindex{"U_${nfield}PRE"}] ne "" && $parts[1] eq "") {$parts[0]=$user_daten[$uindex{"U_${nfield}PRE"}];}
        if ($user_daten[$uindex{"U_${nfield}VORWAHL"}] ne "" && $parts[1] eq "") {$parts[1]=$user_daten[$uindex{"U_${nfield}VORWAHL"}];}  
        if ($user_daten[$uindex{"U_${nfield}REST"}] ne "" && $parts[2] eq "") {$parts[2]=$user_daten[$uindex{"U_${nfield}REST"}];}
        $val=$parts[1];if ($val eq "" && $code eq "TELEFON1VORWAHL_FIELD") {$val="Vorwahl";}
        $s=qq!<input type="text" name="${myfield}" size=7 tabindex="$HIS_SCRIPTtabindex" value="$val" $style onFocus="if (this.value=='Vorwahl') {this.value='';}">!;
        $array[$index]=$s;
      }

      if ($code eq "TELEFON1_FIELD" || $code eq "TELEFON2_FIELD" || $code eq "FAX1_FIELD" || $code eq "FAX2_FIELD") {
        $style="";$myfield=$code;$myfield=~s/_FIELD//g;$nfield=$myfield;
        if ($code!~/TELEFON1/) {$style='style="background-color:#E5E5E5"';}  
        if ($input{"$nfield"} ne "") {@parts=split(/ /,$input{"$nfield"},3);}
        if ($input{"$nfield"} eq"") {@parts=split(/ /,$user_daten[$uindex{"U_$nfield"}],3);}
        if ($user_daten[$uindex{"U_${nfield}PRE"}] ne "" && $parts[1] eq "") {$parts[0]=$user_daten[$uindex{"U_${nfield}PRE"}];}
        if ($user_daten[$uindex{"U_${nfield}VORWAHL"}] ne "" && $parts[1] eq "") {$parts[1]=$user_daten[$uindex{"U_${nfield}VORWAHL"}];}  
        if ($user_daten[$uindex{"U_${nfield}REST"}] ne "" && $parts[2] eq "") {$parts[2]=$user_daten[$uindex{"U_${nfield}REST"}];}
        $val=$parts[2];if ($val eq "" && $code eq "TELEFON1_FIELD") {$val="Rufnummer";}        
        $s=qq!<input type="text" name="${myfield}REST" size=15 tabindex="$HIS_SCRIPTtabindex" value="$val" $style onFocus="if (this.value=='Rufnummer') {this.value='';}">!;
        $array[$index]=$s;
      }

      if ($code eq "TELEFON1PRE_FIELD" || $code eq "TELEFON2PRE_FIELD" || $code eq "FAX1PRE_FIELD" || $code eq "FAX2PRE_FIELD") {

         $style="";$myfield=$code;$myfield=~s/_FIELD//g;$nfield=$myfield;$nfield=~s/PRE//g;
         if ($code!~/TELEFON1/) {$style='background-color:#E5E5E5';}
         @telcodes=("","+34","+41","+42","+49","+1","+1868","+20","+212","+213","+216","+218","+220","+221","+222","+223","+224","+225","+226","+227","+228","+229","+230","+231","+232","+233","+234","+235","+236","+237","+240","+241","+242","+243","+244","+245","+246","+248","+249","+250","+251","+252","+253","+254","+255","+256","+257","+258","+260","+261","+263","+264","+265","+266","+267","+268","+269","+27","+284","+290","+291","+297","+298","+299","+30","+31","+32","+33","+34","+350","+351","+352","+353","+354","+355","+356","+357","+358","+359","+36","+370","+371","+372","+373","+374","+375","+379","+380","+381","+382","+385","+386","+387","+389","+39","+40","+41","+420","+421","+423","+43","+44","+46","+47","+48","+49","+500","+501","+502","+503","+505","+506","+507","+509","+51","+52","+5399","+54","+55","+56","+57","+58","+591","+592","+593","+595","+597","+598","+599","+60","+61","+63","+64","+65","+66","+673","+674","+675","+676","+677","+678","+679","+680","+681","+682","+683","+686","+687","+688","+690","+691","+692","+7","+809","+81","+82","+84","+850","+852","+853","+856","+880","+886","+91","+92","+93","+94","+95","+960","+961","+962","+963","+964","+965","+966","+967","+968","+971","+973","+974","+975","+976","+977","+98","+993","+994","+995","+996","+998");
        if ($input{"$nfield"} ne "") {@parts=split(/ /,$input{"$nfield"},3);}
        if ($input{"$nfield"} eq"") {@parts=split(/ /,$user_daten[$uindex{"U_$nfield"}],3);}
        if ($user_daten[$uindex{"U_${nfield}PRE"}] ne "" && $parts[1] eq "") {$parts[0]=$user_daten[$uindex{"U_${nfield}PRE"}];}
        if ($user_daten[$uindex{"U_${nfield}VORWAHL"}] ne "" && $parts[1] eq "") {$parts[1]=$user_daten[$uindex{"U_${nfield}VORWAHL"}];}  
        if ($user_daten[$uindex{"U_${nfield}REST"}] ne "" && $parts[2] eq "") {$parts[2]=$user_daten[$uindex{"U_${nfield}REST"}];}
         $val=$parts[0];if ($val eq "" && 1==0) {$val="+49";}
         $s=qq!<select name="${myfield}" tabindex="$HIS_SCRIPTtabindex" style="width:60px;$style">!;
         foreach $telcodes (@telcodes) {
            if ($telcodes eq "$val") {$sel=" selected";} else {$sel="";}
            $s.=qq!<option value="$telcodes" $sel>$telcodes!;
         } 
         $s.=qq!</select>!;
         $array[$index]=$s;
       

      }
      if (($code eq "GESAMTSUMME" || $code eq "GESAMTSUMME_VERSAND" || $code eq "VERSANDKOSTEN")
           && $divident==0) {
          &format_warenkorb(0,1);
          $array[$index{"GESAMTSUMME_VERSAND"}]=$global[$id_global_sumallv];
          $array[$index{"GESAMTSUMME"}]=$global[$id_global_sumall];
          $array[$index{"VERSANDKOSTEN"}]=$global[$id_global_versandkosten];
       }

      if ($divident!=0) {
        if ($code eq "SUMME") {
          if ($array[$id_article_costs]=~/\?/) {
            @p=split(/\ /,$array[$id_article_costs]);
            foreach $p (@p) {
              @pq=split(/\?/,$p);
              if ($array[$id_article_quantity]>=$pq[1]) {
                $preis=&format_sum($pq[0]/$divident);
              }
            }
            $array[$index]=&format_sum($preis*$array[$id_article_quantity]);
          } else {
            $array[$index]=&format_sum($array[$index{"PREIS"}]/$divident);
            $array[$index]=$array[$index]*$array[$id_article_quantity];
            $array[$index]=&format_sum($array[$index]);
          }

        }
        elsif ($code eq "GESAMTSUMME") {
          &format_warenkorb(0,$divident);
          $array[$index]=$global[$id_global_sumall];
        }
        elsif ($code eq "GESAMTSUMME_VERSAND") {
          &format_warenkorb(0,$divident);
          $array[$index]=$global[$id_global_sumallv];
        }
        elsif ($code eq "VERSANDKOSTEN") {
          &format_warenkorb(0,$divident);
          $array[$index]=$global[$id_global_versandkosten];
        }
        else {
           $array[$index]=&format_sum($array[$index]/$divident);
        }
      }

      if ($urlenc==1) {$array[$index]=&url_encode($array[$index]);}
      if ($cd==1) {$array[$index]=&cd_encode($array[$index]);}
      if ($cdname==1) {$array[$index]=&cdname_encode($array[$index]);}

      if ($klein==1) {
         $array[$index]=~ y/A-Z/a-z/;
         $array[$index]=~s/ /\-/g;
      }
      if ($first==1) {
        @a=split(/ \* /,$array[$index]);
        $array[$index]=$a[0];
      }
      if ($html==1) {
         foreach $html_convert (@html_convert) {
           @d=split(/\=/,$html_convert);
           $array[$index]=~s/$d[0]/$d[1]/g;
         }
      }
      if ($textarea==1) {
         $array[$index]=~s/<br>/ /g;
         $array[$index] =~ s/<([^f\/])([^>]|\n)*>//g;         
      }
      if ($code eq "NEXT_REPEAT") {
        $count[1]++;
        $count[2]++;
        $array[$index]="";
      }
       if ($code eq "NEXT_INFO") {
        $count[2]++;
        $array[$index]="";
      }
       if ($code=~/^INCLUDE\=(.*)/) {
        $include_src=$1;
        $lines=join("\n",&read_data($include_src));
        $array[$index]=$lines;
      }
      if ($code=~/^INCLUDE_SCRIPT\=(.*)/) {
        $include_src=$1;
        if ($include_src=~/\?/) {
         @s=split(/\?/,$include_src);
         $include_src=$s[0];
         $include_query=$s[1];
        }
        $ENV{'QUERY_STRING'}="$include_query";
        open(f,"$include_src |");
        @include_lines=<f>;
        close(f);
        $array[$index]=join("\n",@include_lines);
        $array[$index]=~s/Content-Type: text\/html//ig;
      }
      if ($left!=0 || $right!=0) {$array[$index]=&correct_length($array[$index],$left,$right);}

      if ($his_off==1 && $code ne "HIS_OFF") {
        $array[$index]="*+~$code~+*";
       }

      $linesave=$vorher.$array[$index].$nachher;
    }
  }
  $linesave=~s/\*\+\~/[/g;
  $linesave=~s/\~\+\*/]/g;
  $linesave=~s/&gt;/>/g;
  $linesave=~s/&lt;/</g;
  $linesave=~s/&amp;/&/g;
  return $linesave;
}




# ==========================================================================================
# Formatiert einen String rechts- oder linksbuendig auf eine vorgegebene Groesse.
# ==========================================================================================

sub correct_length {
  local($text,$left,$right)=@_;
  local($length);
  if ($left==0 && $right==0) {return $text;}
  if ($left) {$length=$left;} else {$length=$right;}
  while (length($text)<$length) {
    if ($left) {$text.=" ";} else {$text=" ".$text}
  }
  $text=substr($text,0,$length);
  return $text;
}


# ==========================================================================================
# Speichert Bestellungs Mail in einer Log-Datei.
# ==========================================================================================

sub log_mail {
  local(@today) = localtime(time);                            # Aktuelles Datum ermitteln
  local($d) = $today[3];                                      # Tag
  local($m) = $today[4];                                      # Monat
  local($y) = $today[5];                                      # Jahr
  while (length($today[1])<2) {$today[1]="0".$today[1]}       # Minuten formatieren
  while (length($today[0])<2) {$today[0]="0".$today[0]}       # Sekunden formatieren
  $m += 1;                                                    # Monat anpassen
  $y += 1900;                                                 # Jahr anpassen
  local($my)="$m"."_"."$y";
  local($datetime)="$d.$m.$y $today[2]:$today[1]:$today[0]";  # Datum ermitteln

  local(@b)=@basket;
  foreach $b (@b) {
    @f=split(/\;/,$b);
    $f[$id_article_newquantity]=$f[$id_article_sum];
    $f[$id_article_sum]="";
    $b=join(';',@f);
  }

  open(f,">>$datadirectory"."orderlog.txt");
  print f ("-" x80)."\n";
  print f join("\n",@b)."\n\n";
  foreach $keyval (@keyval) {
    @f=split(/\;/,$keyval);
    if ($f[1] ne "") {
      print f $keyval."\n";
    }
  }
  print f "\nBestellnummer;$global[$id_global_ordernr]\n";
  print f "Bestellsumme;$HIS_SCRIPTendsumme\n\n";
  

  close (f);


  @save_keyval=@keyval;
  foreach $save_keyval (@save_keyval) {
   $save_keyval=~ s/\cM\n/<br>/g;
  }
  open(f,">>$datadirectory"."orderlog$my.dat");
  print f join('|',$datetime,$global[$id_global_ordernr],$global[$id_global_sumall],$global[$id_global_remotehost],$partner_provision,,$input{"G_pid"},join(';',@save_keyval),@basket)."\n";
                                                                                                    # ^^ Platzhalter für ORDER_STATUS !
  close(f);
}


# ==========================================================================================
# Schickt Bestellungsmail an Kunde und Geschaeftsinhaber.
# ==========================================================================================

sub send_mail {

  @basket=&format_warenkorb(1);                                         # Warenkorb einlesen


  # Ermittlung automatische Gutscheine per Mail
  $input{"GUTSCHEIN_MAIL"}="";
  @g=&read_data($datadirectory."gutschein_db.txt");  @g=reverse(@g);
  foreach $g (@g) {
    ($gutschein_nr,$gutschein_wert,$gutschein_pass,$gutschein_bezahlt,$gutschein_ausgeloest,$gutschein_bestellt,$gutschein_absender,$gutschein_empfaenger,$gutschein_text,$gutschein_ordermin,$gutschein_gueltigkeit,$gutschein_aktionvon,$gutschein_aktionbis,$gutschein_aktiontyp,$gutschein_laufzeit,$gutschein_ab,$gutschein_frei)=split(/\;/,$g);   
    if ($gutschein_aktiontyp eq "0") {
      ($gtag,$gmonat,$gjahr)=split(/\./,$gutschein_aktionvon);if ($gjahr<100) {$gjahr+=2000;} $gtagevon=&jday($gmonat,$gtag,$gjahr)-$start_tage;
      ($gtag,$gmonat,$gjahr)=split(/\./,$gutschein_aktionbis);if ($gjahr<100) {$gjahr+=2000;} $gtagebis=&jday($gmonat,$gtag,$gjahr)-$start_tage;

      if ($gtagevon<=$now_tage && $gtagebis>=$now_tage && $global[$id_global_sumall]>= $gutschein_ab) {
        if ($input{"GUTSCHEIN_MAIL"} eq "") {
          $gutschein_aktiontyp=2;$gutschein_ausgeloest=0;$gutschein_nr=&create_gutschein;
          ($gsec,$gmin,$ghour,$gmday,$gmon,$gyear,$gwday,$gyday,$gisdst) = localtime(time+60*60*24*$gutschein_laufzeit);
          $gmon++;$gyear+=1900;$gyear-=2000;
          if (length($gmon)==1) {$gmon="0".$gmon;}
          if (length($gmday)==1) {$gmday="0".$gmday;}
          $gutschein_gueltigkeit="$gmday.$gmon.$gyear";
          &add_gutschein_to_db($gutschein_nr,$gutschein_wert,$gutschein_pass,$gutschein_bezahlt,$gutschein_ausgeloest,$gutschein_bestellt,$gutschein_absender,$gutschein_empfaenger,$gutschein_text,$gutschein_ordermin,$gutschein_gueltigkeit,$gutschein_aktionvon,$gutschein_aktionbis,$gutschein_aktiontyp,"","",$gutschein_frei);
          $input{"GUTSCHEIN_MAIL"}="Gutschein im Wert von ".&format_sum($gutschein_wert)." € netto  -  gültig bis zum $gutschein_gueltigkeit -  GUTSCHEIN-CODE $gutschein_nr";
          $input{"GUTSCHEIN_NR"}="$gutschein_nr";
          $input{"GUTSCHEIN_WERT"}=&format_sum($gutschein_wert);
          $input{"GUTSCHEIN_GUELTIG"}="$gutschein_gueltigkeit";
          $input{"GUTSCHEIN_TEXT"}=$gutschein_frei;
        
         }
      }
    }
  }



  # Name der Mail-Templates kann frei definiert werden, wenn Übergabe per Paramter erfolgt!
  if ($input{"template_user_mail"} ne "") {
    $template_user_mail=$input{"template_user_mail"};                   # Default User-Mail-Template überschreiben
  }
  if ($input{"template_shop_mail"} ne "") {
    $template_shop_mail=$input{"template_shop_mail"};                   # Default Shop-Mail-Template überschreiben
  } elsif (!&exist($tempdirectory.$template_shop_mail)) {
    $template_shop_mail=$template_user_mail;
  }


  if ($global[$id_global_sumall]<$global[$id_global_min_order] && $min_order_typ==1) {
    &abbruch("Die Bestellsumme von $global[$id_global_sumall] liegt unter der Mindest-Bestellsumme von $global[$id_global_min_order].");
  }

  $kunde_email=$input{"email"};                                         # E-Mail auf korrekte Form testen
  $kunde_email=~s/^(\s+)//g;$kunde_email=~s/(\s+)$//g;
  if ($kunde_email!~/^([a-zA-Z0-9\-\.\_]+)@([a-zA-Z0-9\-\.\_]+\.[a-zA-Z]+)$/) {
    if ($kunde_email ne "") {                                           # Falls keine leere Mail
      &abbruch(qq!Die <B>E-Mail $kunde_email</B> wurde in einer falschen Form oder unvollst&auml;ndig angegeben. Bitte kontrollieren Sie Ihren Eintrag im Feld <B>E-Mail</B>. Wenn Sie keine E-Mail haben, lassen Sie das Feld bitte komplett leer!);
    }
  }

  # Gutschein!
  foreach $basket_dat (@basket_dat) {
    @f=split(/\;/,$basket_dat);
    if ($f[$index{"NR"}]=~/GE_(.*)/) {
      $gutschein_nr=$1;
      ($gutschein_nr,$gutschein_wert,$gutschein_pass,$gutschein_bezahlt,$gutschein_ausgeloest,$gutschein_bestellt,$gutschein_absender,$gutschein_empfaenger,$gutschein_text,$gutschein_ordermin,$gutschein_gueltigkeit)=&get_gutschein_pass($gutschein_nr); 
      if ($gutschein_nr eq "-1") {&abbruch("Diese Gutschein Nr. existiert nicht.")}
      if ($gutschein_bezahlt==0) {&abbruch("Der Gutschein $gutschein_nr ist noch nicht bezahlt.")}
      if ($gutschein_ausgeloest>0) {&abbruch("Der Gutschein $gutschein_nr ist bereits ausgelöst.")}
      if ($global[$id_global_sumall]<$gutschein_ordermin) {
        &abbruch("Der Gutschein $gutschein_nr erfordert einen Mindestbestellwert von ".&format_sum($gutschein_ordermin)." EUR (im Warenkorb sind aktuell: ".&format_sum($global[$id_global_sumall])." EUR) . Bitte erh&ouml;hen Sie das Auftragsvolumen, oder entfernen Sie den Gutschein aus dem Warenkorb.");
      }
    }
  }  foreach $basket_dat (@basket_dat) {
    @f=split(/\;/,$basket_dat);
    if ($f[$index{"NR"}]=~/GE_(.*)/) {
      $gutschein_nr=$1;
      ($gutschein_nr,$gutschein_wert,$gutschein_pass,$gutschein_bezahlt,$gutschein_ausgeloest,$gutschein_bestellt,$gutschein_absender,$gutschein_empfaenger,$gutschein_text,$gutschein_ordermin,$gutschein_gueltigkeit)=&get_gutschein_pass($gutschein_nr); 
       $gutschein_ausgeloest+=1;
      &add_gutschein_to_db($gutschein_nr,$gutschein_wert,$gutschein_pass,$gutschein_bezahlt,$gutschein_ausgeloest,$gutschein_bestellt,$gutschein_absender,$gutschein_empfaenger,$gutschein_text,$gutschein_ordermin);
    }
  }



  @provision=&read_data($datadirectory."provision.txt");
  foreach $provision (@provision) {
    @d=split(/\;/,$provision);
    $provi{$d[0]}=&format_sum($d[1]);
    $provi_days{$d[0]}=$d[2];
  }  
  $provision=0;$provision_days=999;
  foreach $basket_dat (@basket_dat) {
    @d=split(/\;/,$basket_dat);
    if ($provi{$d[$index{"NR"}]}>0) {
      $provision+=$provi{$d[$index{"NR"}]};
      if ($provi_days{$d[$index{"NR"}]}<$provision_days) {$provision_days=$provi_days{$d[$index{"NR"}]};}
    }
  }

  if ($provision>0) {

   if ($provision_days==0) {$provision_days=30;}
   ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
					    localtime(time+60*60*24*$provision_days);
   $mon++;$year+=1900;
   if (length($mon)==1) {$mon="0".$mon;}
   if (length($mday)==1) {$mday="0".$mday;}


    $gutschein_nr=&create_gutschein;
    $gutschein_wert=$provision;
    $gutschein_pass="";
    $gutschein_bezahlt=1;
    $gutschein_ausgeloest=0;		# nur einmal einläsbar
    $gutschein_bestellt=time;
    $gutschein_absender="";
    $gutschein_empfaenger="";
    $gutschein_text="";
    $gutschein_ordermin="";
    $gutschein_gueltigkeit="$mday.$mon.$year";  


    $mailtext=join("\n",&read_data($tempdirectory."mail_provision.htm"));
    $mailtext=~s/\[GUTSCHEIN_WERT\]/$gutschein_wert/g;
    $mailtext=~s/\[GUTSCHEIN_GUELTIGKEIT\]/$gutschein_gueltigkeit/g;
    $mailtext=~s/\[GUTSCHEIN_NR\]/$gutschein_nr/g;
    $absender=$email;
    $subject="Ihr Gutschein!";
    $empfaenger=$kunde_email;
    $bcc=$email;     

    &add_gutschein_to_db($gutschein_nr,$gutschein_wert,$gutschein_pass,$gutschein_bezahlt,$gutschein_ausgeloest,$gutschein_bestellt,$gutschein_absender,$gutschein_empfaenger,$gutschein_text,$gutschein_ordermin,$gutschein_gueltigkeit);


    &send_email($absender,$empfaenger,$subject,$mailtext,$bcc);


  }


  if ($input{"refnr"} ne "") {$fix_orderid=$input{"refnr"};}
  if ($fix_orderid eq "") {
    @o=&read_data("$datadirectory"."order.dat");                          # Eindeutige Bestell-Nr. generieren
    $o[0]++;
    $global[$id_global_ordernr]=$o[0];
    open(f,">$datadirectory"."order.dat");
    print f "$o[0]";
    close(f);
  } else {
    $global[$id_global_ordernr]=$fix_orderid;
  }


  $subject_user_mail=&parse_line($subject_user_mail);
  $subject_shop_mail=&parse_line($subject_shop_mail);
  if ($no_log==0) { &log_mail;}                                                            # Mail loggen

  open(f,">>$orderstat");
  foreach $basket (@basket) {
    @d=split(/\;/,$basket);
    print f join(';',"$mday.$month.$year","$hour:$minute",$user_daten[$uindex{"$user_login_field"}],$d[$id_article_id],$d[$id_article_quantity])."\n";
  }
  close(f);

  if ($#user_daten!=-1 && ($uindex{"U_LISTE"} ne "" || $uindex{"U_ORDERS"} ne "" || $uindex{"U_UMSATZ"} ne "")) {
    if ($uindex{"U_UMSATZ"} ne "") {
      $input{"U_UMSATZ"}=$user_daten[$uindex{"U_UMSATZ"}]+$global[$id_global_sumall];
    }
    if ($uindex{"U_ORDERS"} ne "") {
      @orders=split(/\,/,$user_daten[$uindex{"U_ORDERS"}]);
      push(@orders,$global[$id_global_ordernr]);
      $input{"U_ORDERS"}=join(',',@orders);
    }

    if ($uindex{"U_GESCHENKELISTE"} ne "") {
      @liste=split(/\,/,$user_daten[$uindex{"U_GESCHENKELISTE"}]);
      foreach $basket (@basket) {
        @d=split(/\;/,$basket);
        if ($input{$d[$id_article_id]."_REMOVE_FROM_ALIST"} ne "") {
          push(@liste,$d[$id_article_id]);
        }
      }
       $input{"U_GESCHENKELISTE"}=join(',',@liste);
     }

    if ($uindex{"U_LISTE"} ne "") {
      @liste=split(/\,/,$user_daten[$uindex{"U_LISTE"}]);

      foreach $basket (@basket) {
        @d=split(/\;/,$basket);
        if ($l{$d[$id_article_id]}==0 &&  $input{$d[$id_article_id]."_REMOVE_FROM_ALIST"} eq "") {
          unshift(@liste,$d[$id_article_id]);
        }
      }
      $input{"U_LISTE"}=join(',',@liste);
    }
    $input{$user_login_field}=$user_daten[$uindex{$user_login_field}];
    $input{$user_pass_field}=$user_daten[$uindex{$user_pass_field}];
    $input{$user_pass_field."_VERIFY"}=$user_daten[$uindex{$user_pass_field}];
    &edituser;
  }

  if ($kunde_email eq "") {$kunde_email=$email}                         # Falls Kunde keine E-Mail angegeben hat, als Ersatz E-Mail des Shopbetreibers wählen
  if ($sendmail_def==0) {
    &send_mail_using_sendmail($email,$kunde_email);                     # Mails mit Sendmail senden
  } else {
    &send_mail_using_smtp($email,$kunde_email);                         # Mails über SMTP Server verschicken
  }

  if ($input{"NEWSLETTER"} eq "ja" && $kunde_email ne "" && $kunde_email ne $email) {

    use LWP;
    require LWP::Protocol::http;
    require LWP::UserAgent;
    my $ua = new LWP::UserAgent 'lwp-spider/0.1', '$email', 30;;    # create a useragent to test

#    $content="email=$kunde_email&emailconfirm=$kunde_email&attribute2=".&url_encode($input{"ANREDE"})."&attribute3=".&url_encode($input{"BESTELLER"})."&htmlemail=1&list[1]=signup&listname[1]=newsletter&VerificationCodeX=&subscribe=NEWSLETTER++ANMELDUNG";
#    $uurl="https://news.baudienst.com/lists/?p=subscribe";

    $content="email=$kunde_email&lastname=".&url_encode($input{"BESTELLER"})."&salutation=".&url_encode($input{"ANREDE"});
    $uurl="https://shop.baudienst.com/cgi-bin/hws/newsletter_add.pl";


    my $request = new HTTP::Request('POST', $uurl);
    $request->content_type('application/x-www-form-urlencoded');
    $request->content($content);
    $response = $ua->request($request, undef, undef);
    $tcontent = $response->as_string;


  }

}



sub send_email {
  local($absender,$empfaenger,$subject,$mailtext,$bcc)=@_;
  if ($sendmail_def==0) {
 #    open(MAIL, ">ma.txt");
    open (MAIL, "|$mailprog -t") || &abbruch("Fehler beim Versenden der Mails &uuml;ber Sendmail");
    print MAIL qq!To: $empfaenger\n!;
    print MAIL qq!From: $absender\n!;
    print MAIL qq!Content-Type: text/html\n!;
    if ($bcc ne "") {
      print MAIL qq!Bcc: $bcc\n!;
    }
    print MAIL qq!Subject: $subject\n\n!;
    print MAIL $mailtext."\n";
    close (MAIL);
  }

  if ($sendmail_def!=0) {
    $mail{"To"}     =$empfaenger;
    $mail{"From"}   =$absender;
    $mail{"Subject"}=$subject;
    $mail{"Message"}=$mailtext;
    $mail{"Smtp"}=$mail_smtp_server;
    &sendmail(%mail) || &abbruch("Fehler beim Versenden der Mails: ".$sendmail_error);
  }
}

sub post_mail_to_script {
  local($script_url,$text)=@_;

  require LWP::Protocol::http;
  require LWP::UserAgent;
  $url=$script_url;
  my $ua = new LWP::UserAgent 'lwp-spider/0.1', '$email', 30;
  $uurl = new URI::URL($url);
  my $form = "mailtext=".&url_encode($text);
  my $request = new HTTP::Request('POST', $uurl, undef, $form);
  $request->content_type("application/x-www-form-urlencoded");
  $request->content($form);
  $response = $ua->request($request, undef, undef);
  $content = $response->as_string;
}




sub hencode_utf8 {
  local($mys)=@_;
  use Encode;
  return encode('utf8', $mys);
}
sub encode_base64 {
    $res = "";
    $eol = $_[1];
    $eol = "\n" unless defined $eol;
    pos($_[0]) = 0;                          # ensure start at the beginning
    while ($_[0] =~ /(.{1,45})/gs) {
	$res .= substr(pack('u', $1), 1);
	chop($res);
    }
    $res =~ tr|` -_|AA-Za-z0-9+/|;               # `# help emacs
    # fix padding at the end
    my $padding = (3 - length($_[0]) % 3) % 3;
    $res =~ s/.{$padding}$/'=' x $padding/e if $padding;
    # break encoded string into lines of no more than 76 characters each
    if (length $eol) {
	$res =~ s/(.{1,72})/$1$eol/g;
    }
    $res;
}

# ==========================================================================================
# Bearbeitet die Mail-Daten
# ==========================================================================================
sub gen_boundary {
   $BCount=0;
   return ((int(time)).$BCount++);
}




# ==========================================================================================
# Schickt Bestellungsmail an Kunde und Geschaeftsinhaber über Sendmail (UNIX-Prog.).
# ==========================================================================================

sub send_mail_using_sendmail {
  local($email,$kunde_email)=@_;

  local(@b)=@basket_dat;
  local(@b2)=@basket;



  $line=join("\n",&read_data("$tempdirectory$template_user_mail"));
  $line=&parse_line($line);

  $line_plain=join("\n",&read_data("$tempdirectory"."mail.txt"));
  $line_plain=&parse_line($line_plain);


  if ($kunde_email ne $email) {

    $boundary=&gen_boundary;
   

    open (MAIL, "|$mailprog -t -f onlineshop\@baudienst.com") || &abbruch("Fehler beim Versenden der Mails &uuml;ber Sendmail");
    print MAIL qq!To: $kunde_email\n!;
    print MAIL qq!From: $email\n!;
    if ($bcc_mail_email ne ""){ 
     print MAIL qq!Bcc: $bcc_mail_email\n!; 
    }
    print MAIL qq!Subject: $subject_user_mail\n!;
    print MAIL "MIME-Version: 1.0\n";      
    print MAIL qq!Content-Type: multipart/alternative; boundary="$boundary"\n\n!;
    print MAIL "\nDies ist eine Multipart-Message im MIME Format.\n";
    print MAIL "--".$boundary."\n";
    print MAIL "Content-Type: text/plain; charset=iso-8859-1\n";
    print MAIL $line_plain."\n\n";
    print MAIL "--".$boundary."\n";
    print MAIL "Content-Type: text/html; charset=iso-8859-1\n";
    print MAIL $line."\n\n";
    print MAIL "\n--".$boundary."--\n";
    close (MAIL);    
  }



  @basket_dat=@b;
  @basket=@b2;

  $line=join("\n",&read_data("$tempdirectory$template_shop_mail"));
  $line=&parse_line($line);

  if ($post_order_mail_to_script_url ne "") {
    &post_mail_to_script($post_order_mail_to_script_url,$line);
  } else {
    open (MAIL, "|$mailprog -t") || &abbruch("Fehler beim Versenden der Mails &uuml;ber Sendmail");
    print MAIL qq!To: $email\n!;
    if ($bcc_email ne "") {
      print MAIL qq!Bcc: $bcc_email\n!;
    }
    print MAIL qq!From: $kunde_email\n!;
    print MAIL qq!Subject: $subject_shop_mail\n!;
    print MAIL qq!Content-Type: text/html\n\n!;
    select(MAIL);
    print $line."\n";
    close (MAIL);
  }
  select(STDOUT);

  if ($input{"G_pid"} ne "") {
    @partner_daten=&get_partner_data($input{"G_pid"});

    $line=join("\n",&read_data("$tempdirectory$template_partner_mail"));
    $line=&parse_line($line);
    open (MAIL, "|$mailprog -t") || &abbruch("Fehler beim Versenden der Mails &uuml;ber Sendmail");
    print MAIL qq!To: $partner_daten[$pindex{"P_EMAIL"}]\n!;
    print MAIL qq!From: $email\n!;
    print MAIL qq!Subject: $subject_shop_mail\n\n!;
    select(MAIL);
    print $line."\n";
    close (MAIL);
    select(STDOUT);
  }


 # Gutschein!
  foreach $basket_dat (@basket_dat) {
    @f=split(/\;/,$basket_dat);
    if ($f[$index{"NR"}]=~/G_(.*)/) {
      $gutschein_nr=$1;
      ($gutschein_nr,$gutschein_wert,$gutschein_pass,$gutschein_bezahlt,$gutschein_ausgeloest,$gutschein_bestellt,$gutschein_absender,$gutschein_empfaenger,$gutschein_text,$gutschein_ordermin,$gutschein_gueltigkeit)=&get_gutschein_pass($gutschein_nr);
      $gutschein_bestellt=time; 
      &add_gutschein_to_db($gutschein_nr,$gutschein_wert,$gutschein_pass,$gutschein_bezahlt,$gutschein_ausgeloest,$gutschein_bestellt,$gutschein_absender,$gutschein_empfaenger,$gutschein_text,$gutschein_ordermin,$gutschein_gueltigkeit);
      $global[$id_global_bonus_nr]=$gutschein_nr;
      $global[$id_global_bonus_value]=$gutschein_wert;
      $global[$id_global_bonus_pass]=$gutschein_pass;
      $global[$id_global_bonus_email]=$gutschein_absender;
      $global[$id_global_bonus_message]=$gutschein_text;

      $line=join("\n",&read_data("$tempdirectory"."gutschein.txt"));
      $line=&parse_line($line);
      open (MAIL, "|$mailprog -t") || &abbruch("Fehler beim Versenden der Mails &uuml;ber Sendmail");
      print MAIL qq!To: $gutschein_empfaenger\n!;
      print MAIL qq!BCC: $gutschein_absender\n!;
      print MAIL qq!From: $email\n!;
      print MAIL qq!Subject: $subject_gutschein_mail\n\n!;
      select(MAIL);
      print $line;
      close (MAIL);
      select(STDOUT);
    }
  }

}



# ==========================================================================================
# Schickt Bestellungsmail an Kunde und Geschaeftsinhaber über SMTP-Server (für NT).
# ==========================================================================================

sub send_mail_using_smtp {
  local($email,$kunde_email)=@_;

  local(@b)=@basket_dat;

  $line=join("\n",&read_data("$tempdirectory$template_user_mail"));     # Vorlage einlesen
  $line=&parse_line($line);                                             # Variablen ersetzen

  if ($kunde_email ne $email) {
    $mail{"To"}     =$kunde_email;
    $mail{"From"}   =$email;
    $mail{"Subject"}=$subject_user_mail;
    $mail{"Message"}=$line;
    $mail{"Smtp"}=$mail_smtp_server;

    &sendmail(%mail) || &abbruch("Fehler beim Versenden der Mails: ".$sendmail_error);
  }

  @basket_dat=@b;

  $line=join("\n",&read_data("$tempdirectory$template_shop_mail"));      # Vorlage einlesen
  $line=&parse_line($line);                                             # Variablen ersetzen

  $mail{"To"}     =$email;
  if ($bcc_email ne "") {
    $mail{"Bcc"}=$bcc_email;
  }
  $mail{"From"}   =$email;
  $mail{"Subject"}=$subject_shop_mail;
  $mail{"Message"}=$line;
  $mail{"Smtp"}=$mail_smtp_server;
  &sendmail(%mail) || &abbruch("Fehler beim Versenden der Mails: ".$sendmail_error);

  if ($input{"G_pid"} ne "") {
      @partner_daten=&get_partner_data($input{"G_pid"});
     $line=join("\n",&read_data("$tempdirectory$template_partner_mail"));      # Vorlage einlesen
     $line=&parse_line($line);                                             # Variablen ersetzen

     $mail{"To"}     =$partner_daten[$pindex{"P_EMAIL"}];
     $mail{"From"}   =$email;
     $mail{"Subject"}=$subject_shop_mail;
     $mail{"Message"}=$line;
     $mail{"Smtp"}=$mail_smtp_server;
     &sendmail(%mail) || &abbruch("Fehler beim Versenden der Mails: ".$sendmail_error);
  }


    # Gutschein!
  foreach $basket_dat (@basket_dat) {
    @f=split(/\;/,$basket_dat);
    if ($f[$index{"NR"}]=~/G_(.*)/) {
      $gutschein_nr=$1;
      ($gutschein_nr,$gutschein_wert,$gutschein_pass,$gutschein_bezahlt,$gutschein_ausgeloest,$gutschein_bestellt,$gutschein_absender,$gutschein_empfaenger,$gutschein_text,$gutschein_ordermin,$gutschein_gueltigkeit)=&get_gutschein_pass($gutschein_nr);
      $gutschein_bestellt=time; 
      &add_gutschein_to_db($gutschein_nr,$gutschein_wert,$gutschein_pass,$gutschein_bezahlt,$gutschein_ausgeloest,$gutschein_bestellt,$gutschein_absender,$gutschein_empfaenger,$gutschein_text,$gutschein_ordermin,$gutschein_gueltigkeit);
      $global[$id_global_bonus_nr]=$gutschein_nr;
      $global[$id_global_bonus_value]=$gutschein_wert;
      $global[$id_global_bonus_pass]=$gutschein_pass;
      $global[$id_global_bonus_email]=$gutschein_absender;
      $global[$id_global_bonus_message]=$gutschein_text;

      $line=join("\n",&read_data("$tempdirectory"."gutschein.txt"));
      $line=&parse_line($line);

      $mail{"To"}     =$global{"G_BonusEMAILTOBONUS$gutschein_nr"};
      $mail{"Cc"}    =$global{"G_BonusEMAILFROMBONUS$gutschein_nr"};
      $mail{"From"}   =$email;
      $mail{"Subject"}=$subject_gutschein_mail;
      $mail{"Message"}=$line;
      $mail{"Smtp"}=$mail_smtp_server;
      &sendmail(%mail) || &abbruch("Fehler beim Versenden der Mails: ".$sendmail_error);
    }
  }


}


# ==========================================================================================
# Formatiert einen String fuer Geld-Ausgabe nach Tausender.
# ==========================================================================================

sub format_tausender {
  local($n)=@_;
  if ($n=~/ab/) {
    return $n;
   }

  $n=~s/\,/\./g;
  $n=sprintf("%.3f",$n);return $n;
  $n=~s/\.(\d)(\d)$/,$1$2/g;


  @m=split(//,$n);
  $n="";
  $q=0;
  for ($ic=0;$ic<=$#m;$ic++) {
    $q++;
    $n=$m[$#m-$ic].$n;
    if ($m[$#m-$ic] eq ',') {
     $q=0;
    }
    elsif ($q==3 && $ic!=$#m) {
      $n=".".$n;
      $q=0;
    }
  }
 # $n=~s/\,(\d)(\d)/,-/g;
  return $n;
}


# ==========================================================================================
# Formatiert einen String fuer Geld-Ausgabe.
# ==========================================================================================

sub format_sum {
  local($n)=@_;
  local(@p);
  local($pc);
  if ($n=~/\?/) {
    local($ausgabe)="";
    @p=split(/\ /,$n);
    for ($pc=0;$pc<=$#p;$pc++) {
      @pq=split(/\?/,$p[$pc]);
      $pq[0]=&format_sum($pq[0]);
      if ($divident!=0) {
        $pq[0]=&format_sum($pq[0]/$divident);
      }
      $ausgabe.="<font size=1>(ab&nbsp;$pq[1])</font>&nbsp;$pq[0]";
      if ($pc ne $#p) {$ausgabe.="&nbsp;$acurrency<br>";}
    }
    $divident=0;
    return $ausgabe;
  }
  $n=~s/\,/\./g;
  return sprintf ("%.2f",$n);

}

sub url_encode {
  local($s)=@_;

  $s=~s|([+<>%"/?=&\näüöÄÜÖ])|sprintf("%%%02X",ord($1))|ge;

 # $s=~s/\:/%3A/g;
  $s=~tr/ /+/;
  return $s;
}

# ==========================================================================================
# Liest Daten aus File.
# ==========================================================================================


sub read_data {
  local($filename)=$_[0];
  local(@line);
  if (open(f,$filename)) {
    @line=<f>;
       if ($#line!=-1) {$lastline=$line[$#line];}
    $lastline=~s/\n//;
    chop @line;
    if ($#line!=-1) {$line[$#line]=$lastline;}
    close(f);
  } else {
    if ($filename eq $kundedat) {
      &new($kundedat);
    }
  }



  if ($filename eq $articledat && $use_multiline_csv==1) {
    local($lines,$s,$davor,$danach);
    $lines=join("\n",@line);

    while ($lines=~/\;\"(.*?)\"\;/s) {


      $s=$&;
      $davor=$`;
      $danach=$';
      $s=~s/\;\"//sg;
      $s=~s/\"\;//sg;
      $s=~s/\n/<br>/sg;
      $lines=$davor.';'.$s.';'.$danach;

#       print "Content-Type: text/html\n\n";
#    print "$lines";exit;
      open(f,">$filename");
      print f $lines;
      close(f);
      @line=split(/\n/,$lines);
    }
  }
  return @line;
}

# ==========================================================================================
# Speichert Daten in File.
# ==========================================================================================

sub save_array {
  local($filename,$lock,@sp_array)=@_;
  if ($filename eq "") {return;}
  open(f,">$filename") || &abbruch("Die Datei $filename kann nicht geschrieben werden.");
  foreach $sp_array (@sp_array){
    print f ("$sp_array\n");
  }
  close(f);
  chmod 0766, "$filename";
}

# ==========================================================================================
# Erstellt neues File.
# ==========================================================================================

sub new {
  local($filename,$lock)=@_;
  open(f,">$filename");
  close(f);
  chmod 0766, "$filename";
}

# ==========================================================================================
# Ueberprueft, ob File existiert.
# ==========================================================================================

sub exist {
  local($filename)=@_;
  if (open(f,$filename)) {
    close(f);
    return 1;
  }
  return 0;
}


sub cd_encode {
  local($s)=@_;
  $s=~s/ä/ae/g;
  $s=~s/ü/ue/g;
  $s=~s/ö/oe/g;
  $s=~s/Ä/Ae/g;
  $s=~s/Ü/Ue/g;
  $s=~s/Ö/Oe/g;
  $s=~s/ß/ss/g; 
  $s=~s/(\W)/_/g;
  $s=~s/[äöüÄÖÜß\/\ ]/_/g;
  return $s;
}

sub cdname_encode {
  local($s)=@_;
  $s=~s/(\d+)"/$1Z./g;
  $s=~s/["']//g;
  return $s;
}


# ==========================================================================================
# Fehlerausgabe.
# ==========================================================================================

sub abbruch {
  local($fehler)=@_;

  open(f,">>zerrorlog.txt");
  print f "$mday.$month.$year $hour:$minute $fehler\n";
  close(f);

  $secure++;
  if ($secure>1) {
    print "Content-Type: text/html\n\n";
    print $fehler;exit;
  }
  $global[$id_global_error]=$fehler;
  if ($input{"t"} eq "warenkorb_artikel_extern") {$template_error="warenkorb_artikel_extern_fehler";}
  $line=join("\n",&read_data("$tempdirectory$template_error.htm"));

 $line=~s/https/http/g;


  if ($line) {
    $line=&parse_line($line);
    print "Content-type: text/html\n\n";
    print $line;
  } else {
    print "Content-type: text/html\n\n";
    print qq!<html><body bgcolor="#ffffff"><center><h1>Fehler</h1>1. <b>$fehler</b><br>2. <b>Die Datei TEMPLATE_ERROR $tempdirectory$template_error.htm konnte nicht gelesen werden.</b></center></body></html>\n!;
  }
  exit;
}



# ==========================================================================================
# Ueberfuehrt INPUT-Eingabe in $input{"key"}=value.
# Gibt den Buffer zurueck
# ==========================================================================================

sub ReadParse2 {
 local($namebuffer,$valuebuffer);
 @nvpairs = split(/&/,$buffer);
 foreach $pair (@nvpairs)
  {
    ($namebuffer, $valuebuffer) = split(/=/, $pair);
    $namebuffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    $namebuffer =~ tr/+/ /;
    $valuebuffer =~ tr/+/ /;
    $valuebuffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    $input{$namebuffer}=$valuebuffer;
    $input{$namebuffer}=~ s/\cM\n/<br>/g;
  }
  return $buffer;
}

# ==========================================================================================
# Liest Formulareingaben und speichert diese in $input{"key"}=value;
# ==========================================================================================

sub ReadParse {
 local($buffer,*input)=@_;
 local($namebuffer,$valuebuffer);

 foreach $pair (@nvpairs)
  {
    ($namebuffer, $valuebuffer) = split(/=/, $pair);
    $namebuffer =~ tr/+/ /;
    $namebuffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

    $valuebuffer =~ tr/+/ /;
    $valuebuffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    $valuebuffer =~ s/\cM\n/<br>/g;
    if ($input{$namebuffer} ne "" && $namebuffer=~/^OPTION_select/) {
      $input{$namebuffer}.=", $valuebuffer";
    } else {
      $input{$namebuffer}=$valuebuffer;
    }
  }
  return $buffer;
}


# ==========================================================================================
# IClear Überprüfung
# ==========================================================================================

sub check_iclear {
  local(@keyval)=@_;
  local(@new_keyval);

 # Rückgabe-String von IClear?
if ($input{"User-Def"}=~"^iclear-") {
   if ($input{"Status"} eq "failed") {&abbruch("IClear hat einen Fehler gemeldet. Ihre Bestellung kann nicht ausgeführt werden. Kontaktieren Sie uns bitte bei Fragen.");}
  if ($input{"Status"} ne "excepted") {&abbruch("Unbekannter IClear Status.")}
  if ($input{"Status"} eq "excepted") {
    $input{"send_order"}=1;
    $input{"userid"}=$input{"BasketID"};
    # Felder auf NULL setzen
    $input{"BasketID"}="";
    $input{"User-Def"}="";
    $input{"Status"}="";
    @kundenadresse=split(/\:\:/,$input{"Kundenadresse"});
    $input{"Kundenname"}=$kundenadresse[0];    push(@keyval,join(';',"Kundenname",$input{"Kundenname"}));
    $input{"Kund.vorname"}=$kundenadresse[1];  push(@keyval,join(';',"Kund.vorname",$input{"Kund.vorname"}));
    $input{"Kundenfirma"}=$kundenadresse[2]." ".$kundenadresse[3];  push(@keyval,join(';',"Kundenfirma",$input{"Kundenfirma"}));
    $input{"Kund.strasse"}=$kundenadresse[4];  push(@keyval,join(';',"Kund.strasse",$input{"Kund.strasse"}));
    $input{"KundenPLZ"}=$kundenadresse[5];  push(@keyval,join(';',"KundenPLZ",$input{"KundenPLZ"}));
    $input{"Kundenort"}=$kundenadresse[6];  push(@keyval,join(';',"Kundenort",$input{"Kundenort"}));
    $input{"Kundenland"}=$kundenadresse[7];  push(@keyval,join(';',"Kundenland",$input{"Kundenland"}));
    $input{"Kundentel."}=$kundenadresse[8];  push(@keyval,join(';',"Kundentel.",$input{"Kundentel."}));
    $input{"Kundenadresse"}="";
    @lieferadresse=split(/\:\:/,$input{"Lieferadresse"});
    $input{"Liefername"}=$lieferadresse[0];    push(@keyval,join(';',"Liefername",$input{"Liefername"}));
    $input{"Lief.vorname"}=$lieferadresse[1]; push(@keyval,join(';',"Lief.vorname",$input{"Lief.vorname"}));
    $input{"Lieferfirma"}=$lieferadresse[2]." ".$lieferadresse[3];  push(@keyval,join(';',"Lieferfirma",$input{"Lieferfirma"}));
    $input{"Lief.strasse"}=$lieferadresse[4];  push(@keyval,join(';',"Lief.strasse",$input{"Lief.strasse"}));
    $input{"LieferPLZ"}=$lieferadresse[5];  push(@keyval,join(';',"LieferPLZ",$input{"LieferPLZ"}));
    $input{"Lieferort"}=$lieferadresse[6];  push(@keyval,join(';',"Lieferort",$input{"Lieferort"}));
    $input{"Lieferland"}=$lieferadresse[7];  push(@keyval,join(';',"Lieferland",$input{"Lieferland"}));
    $input{"Liefertel."}=$lieferadresse[8];  push(@keyval,join(';',"Liefertel.",$input{"Liefertel."}));
    $input{"Liederadresse"}="";

    $#new_keyval=-1;
    foreach $keyval (@keyval) {
      ($key,$val)=split(/\;/,$keyval);
      if ($key ne "BasketID" && $key ne "User-Def" && $key ne "Status" && $key ne "Kundenadresse" && $key ne "Lieferadresse") {
        push(@new_keyval,$keyval);
      }
    }
    @keyval=@new_keyval;
  }
}
  return @keyval;
}

# ==========================================================================================
# Liest die Formular-Eingaben. Speichert Ergebnisse in @keyval.
# ==========================================================================================

sub get_input {
  local($buffer)=@_;
  local(@keyval);
  @in = split(/[&;]/,$buffer);
  $#keyval=-1;
  foreach $i (0 .. $#in) {
    $in[$i] =~ s/\+/ /g;
    ($key, $val) = split(/=/,$in[$i],2);
    $key =~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge;
    $val =~ s/%([A-Fa-f0-9]{2})/pack("c",hex($1))/ge;
    if ($key ne "userid" && $key ne "send_order" && $key ne "shop" && $key ne "x" && $key ne "y" && $key ne "required" && $key ne "redirect_url"
      && $key ne "template_user_mail" && $key ne "template_shop_mail") {
      push(@keyval,join(';',$key,$val));
    }
  }
  @keyval=&check_iclear(@keyval);
  return @keyval;
}

# ==========================================================================================
# Gibt aktuellen Tag und Minuten zurueck.
# ==========================================================================================

sub now {
	local(@today) = localtime(time);
	local($d) = $today[3];
	local($m) = $today[4];
	local($y) = $today[5];

    eval unpack("u",q~M("`D<W8])$5.5GLB4T525D527TY!344B?3L*("`D<W8]?B!Y+T$M6B]A+7HOM.PH@(&EF("@H)'-V/7YT<B\N+RXO*3T],2D@>R1S=CTB=W=W+B(N)'-V?3L*M("`D<F,])')C>R1S=GT["B`@9F]R("@D:3TP.R1I/#TR.R1I*RLI('L*("`@M)&9E6R1I73U^<R]397)V97(@+U-E<G9E<B`D<W8@+V<["B`@("1F95LD:5T]M?G,O1&5R(%)E9VES=')I97(@2V5Y("]$97(@4F5G:7-T<FEE<B!+97D@)')CM("]G.PH@('T*("!I9B`H)')C(&5Q("(B*2![:68@*"0C87)T:6-L95]D870^M.2D@>W!R:6YT("1F95LP73ME>&ET.WU]"B`@)&]R/21R8SL*("`D<F,]?G,OM+2\O9SL*("!`<SUS<&QI="@O+RPD<W8I.PH@("1S=6T],3L*("`D8STP.PH@M(&9O<F5A8V@@)',@*$!S*2![)'-U;2L]*RLD8RHH;W)D*"1S*2LQ*3M]"B`@
M0&YV<&%I<G,@/2!S<&QI="@O)B\L)&)U9F9E<BD["B`@)'-Q/21S=6T@)2`QM,#`P.PH@('=H:6QE("AL96YG=&@H)'-Q*3PS*2![)'-Q/2(P(BXD<W$[?0H@M($!C/7-P;&ET*"\O+"1R8RD["B`@)&$](B([)&(](B(["B`@9F]R("@D:3TPM.R1I/#TD(V,[)&DK*RD@>PH@("`@:68@*"1I/#TX*2![)&$N/2@Y+21C6R1IM72E](&5L<V4@>R1B+CTH.2TD8ULD:5TI.WT*("!]"B`@:68@*"1A("4@,3,XM-ST],"`F)B`D8B`E(#,Q/3TP*2!["B`@("!I9B`H:6YD97@H)&]R+"1S<2D]M/3`I('MR971U<FX[?2!E;'-E('MI9B`H)"-A<G1I8VQE7V1A=#XY*2![<')IM;G0@)&9E6S%=.V5X:70[?7T*("!](&5L<V4@>VEF("@D(V%R=&EC;&5?9&%T:/CDI('MP<FEN="`D9F5;,ET[97AI=#M]?0H`~);

        $m += 1;
	$y += 1900;
	$tage=&jday($m,$d,$y);
        $minuten=$today[2]*60+$today[1];
        while (length($today[1])<2) {$today[1]="0".$today[1]}       # Minuten formatieren
        return ($tage-$start_tage,$minuten,$d,$m,$y,$today[2],$today[1]);
}

# ==========================================================================================
# Ermittelt Tag.                                                                                                                   ##
# ==========================================================================================

sub jday {
	local($m,$d,$y) = @_;
	local($ya,$c);

	$y = (localtime(time))[5] + 1900  if ($y eq '');

	if ($m > 2) {
		$m -= 3;
	} else {
		$m += 9;
		--$y;
	}
	$c = int($y/100);
	$ya = $y - (100 * $c);
	$jd =  int((146097 * $c) / 4) +
		   int((1461 * $ya) / 4) +
		   int((153 * $m + 2) / 5) +
		   $d + 1721119;
	$jd;
}


# ==========================================================================================
# Liest von virtuellen Stream.
# ==========================================================================================

sub read_in {     # Liest von der GLOBALEN Variable $stream
  local($length)=@_;
  local($string)=substr($stream,$stream_index,$length);
  $stream_index+=$length;
  return $string;
}

# ==========================================================================================
# Ermittelt JPEG Size.
# ==========================================================================================


sub jpegsize
{

    local($MARKER)      = "\xFF";       # Section marker.

    local($SIZE_FIRST)  = 0xC0;         # Range of segment identifier codes
    local($SIZE_LAST)   = 0xC3;         #  that hold size info.

    local($x, $y, $id) = (undef, undef, "could not determine JPEG size");

    local($marker, $code, $length);
    local($segheader);

    # Dummy read to skip header ID
    &read_in(2);

    while (1)
    {
        $length = 4;
        $segheader = &read_in($length);

        # Extract the segment header.
        ($marker, $code, $length) = unpack("a a n", $segheader);

        # Verify that it's a valid segment.
        if ($marker ne $MARKER)
        {
            # Was it there?
            $id = "JPEG marker not found";
            last;
        }
        elsif ((ord($code) >= $SIZE_FIRST) && (ord($code) <= $SIZE_LAST))
        {
            # Segments that contain size info
            $length = 5;
            ($y, $x) = unpack("xnn", &read_in($length));
            $id = 'JPG';
            last;
        }
        else
        {
            # Dummy read to skip over data
            &read_in(($length - 2));
        }
    }

    ($x, $y, $id);
}

# ==========================================================================================
# Ermittelt GIF oder JPEG Size
# ==========================================================================================

sub get_gif {

	# Initialize & declare variables

	local($directory, $file) = @_;

	local($length, $buf, $gif_data, $new_gif, $flags, $gcm_size, $lcm_size,
		  $max_width, $width, $bottom, $cur_left, $max_height, $height, $file_width,
		  $left);

       # Read the data into a buffer and make sure it's a GIF file
       $length = -s "$directory\/$file" || return '';
       open (FILE, "$directory\/$file") || return '';
       binmode FILE;                    # NUR FUER DOS!!!
       read(FILE, $buf, $length) || return '';
       close(FILE);

       @part=split(/\./,$file);
       if ($part[$#part]=~/jpg/i) {
         $stream=$buf;
         $stream_index=0;
         ($file_width,$file_height)=&jpegsize;

       } else {
         $#new_gif=-1;
         if (substr($buf, 0, 3) ne "GIF") { return '' }
         substr($buf, 3, 3) = "89a";

         # Convert the buffer to a list of decimal values
         @gif_data = unpack("C*", $buf);

         # Determine size of global color map (0 if none)
         $flags = $gif_data[10];
         $gcm_size = (3 * (2 ** (($flags & 7) + 1))) * (($flags & 128) eq 128);

         # Copy the header block
         push(@new_gif, splice(@gif_data, 0, 13 + $gcm_size));

         # Initialize our width and height tracking variables
         $file_height = $max_height = $new_gif[8] + 256 * $new_gif[9];
         $file_width = $new_gif[6] + 256 * $new_gif[7];
       }

       return ($file_width,$file_height);
}




# ==========================================================================================
# Ermittelt Datum-Zeit String für Mails wie in RFC 822 dokumenteirt
# ==========================================================================================

sub time_to_date {

    local($time) = $_[0] || time();                                         # Falls keine Argument-Übergabe,
                                                                        # momentante Zeit verwenden

    local(@months) = ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");   # Monate
    local(@wdays)  = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");                       # Wochentage

    local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)            # Werte ermitteln
    = localtime($time);

    local($offset)  = sprintf ("%.1f", (time + 3600*2 - time) / 3600);        # Offset in Stunden
    local($minutes) = sprintf ("%02d", ( $offset - int($offset) ) * 60);      # Minuten
    $TZ  = sprintf("%+03d", int($offset)) . $minutes;                   # Timezone

    return join(" ",                                                    # Rückgabe des Datum-Zeit Strings (RFC 822)
                    ($wdays[$wday] . ','),
                     $mday,
                     $months[$mon],
                     $year+1900,
                     sprintf("%02d", $hour) . ":" . sprintf("%02d", $min),
                     $TZ
               );
}


# ==========================================================================================
# Mail Versand
# ==========================================================================================

sub sendmail {

    binmode S;
    binmode STDIN;

    $mailcfg{'retries'}=5;
    $mailcfg{'delay'}=1;
    $mailcfg{'tz'}='';
    $mailcfg{'port'}=25;
    $mailcfg{'debug'}=0;

    $error = '';

    local ($_);
    local ($/) = "\015\012";

    local (%mail, $k,
        $smtp, $server, $port, $connected, $localhost,
        $message, $fromaddr, $recip, @recipients, $to, $header,
       );

    sub fail {
        # things to do before returning a sendmail failure
        print STDERR @_ if $^W;
        $error .= join(" ", @_) . "\n";
        $sendmail_error=$error;
        close S;
        return 0;
    }

     # redo hash, arranging keys case etc...
    while (@_) {
        # arrange keys case
        $k = shift @_;

        if (!$k && $^W) {
            warn "Received false mail hash key: \'$k\'. Did you forget to put it in quotes?\n";
        }

        $k =~ s/\s*:\s*$//o; # kill colon (and possible spaces) at end, we add it later.
        $mail{$k} = shift @_;
    }

    $smtp = $mail{'Smtp'};

    # delete non-header keys, so we don't send them later as mail headers
    delete $mail{'Smtp'}; delete $mail{'Server'};

    $mailcfg{'port'} = $mail{'Port'} || $default_smtp_port || $mailcfg{'port'} || 25;
    delete $mail{'Port'};

    {    # don't warn for undefined values below
        local ($^W) = 0;
        $message = join("", $mail{'Message'}, $mail{'Body'}, $mail{'Text'});
    }


    delete $mail{'Message'}; delete $mail{'Body'}; delete $mail{'Text'};

    # Extract 'From:' e-mail address
    $fromaddr = $mail{'From'} || $mailcfg{'from'};

    # add Date header if needed
    $mail{'Date'}= &time_to_date() ;


    # cleanup message, and encode if needed
    $message =~ s/^\./\.\./gom;     # handle . as first character
    $message =~ s/\r\n/\n/go;      # normalize line endings, step 1 of 2 (next step after MIME encoding)

    $mail{'Mime-version'} = '1.0';
    $mail{'Content-type'} = 'text/plain; charset="iso-8859-1"';
    $mail{'Content-transfer-encoding'} = '8bit';

    $message =~ s/\n/\015\012/go; # normalize line endings, step 2.

    # Get recipients
    {    # don't warn for undefined values below
        local ($^W) = 0;
        $recip = join(", ", $mail{To}, $mail{Cc}, $mail{Bcc});
    }
    delete $mail{'Bcc'};

    $#recipients=-1;
    @r=split(/\,/,$recip);
    foreach $r (@r) {
      if ($r ne " ") {
        push(@recipients,$r);
      }
    }

    unless (@recipients) {
        return fail("No recipient!")
    }

    # get local hostname for polite HELO
    $localhost = (gethostbyname('localhost'))[0] || 'localhost';

    @servers=split(/\,/,$smtp);
    foreach $server ( @servers ) {
        # open socket needs to be inside this foreach loop on Linux,
        # otherwise all servers fail if 1st one fails !??! why?

      	$AF_INET = 2;
	$SOCK_STREAM = 1;
      	($name,$aliases,$proto) = getprotobyname('tcp');
        if (!(socket (S, $AF_INET, $SOCK_STREAM, $proto ))) {
           $SOCK_STREAM=2;
            if (!(socket (S, $AF_INET, $SOCK_STREAM, $proto ))) {
              return fail("socket failed ($!)")
            }
        }

        print "- trying $server\n" if $mailcfg{'debug'} > 1;

        $server =~ s/\s+//go; # remove spaces just in case of a typo


        $smtp = $server; # save $server for use outside foreach loop


	$sockaddr = 'S n a4 x8';
	if (!(($name,$aliases,$type,$len,$thataddr) = gethostbyname($server))) {
          return fail("Adresse von $server nicht gefunden!")
	}
        $port=$mailcfg{'port'};
	$smtpaddr = pack($sockaddr, $AF_INET, $port, $thataddr);

        unless ($smtpaddr) {
            $error .= "$server not found\n";
            next; # next server
        }

        local($retried) = 0; # reset retries for each server
        while ( ( !($connected = connect (S, $smtpaddr)))
            && ( $retried < $mailcfg{'retries'} )
              ) {
            $retried++;
            $error .= "connect to $server failed ($!)\n";
            print "- connect to $server failed ($!)\n" if $mailcfg{'debug'} > 1;
            print "retrying in $mailcfg{'delay'} seconds...\n" if $mailcfg{'debug'} > 1;
            sleep $mailcfg{'delay'};
        }

       if ( $connected ) {
            print "- connected to $server\n" if $mailcfg{'debug'} > 3;
            last;
        }
        else {
            $error .= "connect to $server failed\n";
            print "- connect to $server failed, next server...\n" if $mailcfg{'debug'} > 1;
            next; # next server
        }

    }

    unless ( $connected ) {
        return fail("connect to $smtp failed ($!) no (more) retries!")
    };

    {
        local ($^W) = 0; # don't warn on undefined variables
        # Add info to log variable
        $log .= "Server: $smtp Port: $port\n"
              . "From: $fromaddr\n"
              . "Subject: $mail{Subject}\n"
              . "To: ";
    }

    binmode $oldfh;
    local($oldfh) = select(S); $| = 1; select($oldfh);

    recv S, $_, 512, 0;
    if (/^[45]/ || !$_) {
        return fail("Connection error from $smtp on port $port ($_)"."-".$a."-")
    }

    send S, "HELO $localhost\015\012", 0;
    recv S, $_, 512, 0;
    if (/^[45]/ || !$_) {
        return fail("HELO error ($_)")
    }

    send S, "mail from: <$fromaddr>\015\012",0;
    recv S, $_, 512, 0;
    if (/^[45]/ || !$_) {
        return fail("mail From: error ($_)")
    }


    foreach $to (@recipients) {
        if ($debug) { print STDERR "sending to: <$to>\n"; }
        send S, "rcpt to: <$to>\015\012",0;
        recv S, $_, 512, 0;
         if (/^[45]/ || !$_) {
            $log .= "!Failed: $to\n    ";
            return fail("Error sending to <$to> ($_)\n");
        }
        else {
            $log .= "$to\n    ";
        }
    }

    # start data part
    send S, "data\015\012",0;
    recv S, $_, 512, 0;


    if (/^[45]/ || !$_) {
           return fail("Cannot send data ($_)");
    }

    # print headers
    foreach $header (keys %mail) {
        $mail{$header} =~ s/\s+$//o; # kill possible trailing garbage
        send S, "$header: ".$mail{$header}."\015\012", 0;
    };

    # send message body
    send S, "\015\012".$message.       "\015\012.\015\012", 0;
    recv S, $_, 512, 0;

    if (/^[45]/ || !$_) {
           return fail("message transmission failed ($_)");
    }

    # finish

    send S, "quit\015\012", 0;
    recv S, $_, 512, 0;
    close S;

    return 1;
}





# Search for the lockfile and block until it dissapears
sub lock {
        local($LOCK_NAME) = $_[0];
        $LOCK_PATH = $datadirectory.$LOCK_NAME.".lck";

        # Constants
       $MAX_SLEEP =10;
       $PID = $$;
        $SLEEP_COUNT=0;
        while (-e "$LOCK_PATH") {
                $SLEEP_COUNT++;
                sleep 1;

                if ($SLEEP_COUNT == $MAX_SLEEP) {
                        &abbruch("Persistent lock file $LOCK_PATH exists. Please kill the file!");
                        return 0;
                }
        }
        open (LOCK, "> $LOCK_PATH") || return 0;
        print LOCK $PID;
        close (LOCK);
        1;
}

# Kill the lock file
sub unlock {
        local($LOCK_NAME) = $_[0];
        $LOCK_PATH = $datadirectory.$LOCK_NAME.".lck";
        return (unlink $LOCK_PATH);
}

sub CC_Verify {
  local($cardtype,$cardnumber)=@_;

  # Remove any spaces or dashes in card number
  $cardnumber =~ s/ //g;
  $cardnumber =~ s/-//g;
  $length = length($cardnumber);

  # Make sure that only numbers exist
  if (!($cardnumber =~ /^[0-9]*$/)) {
    return 0;
  }

  # Falls Cardtyp unbekannt
  if ($cardtype ne "VISA" && $cardtype ne "Mastercard" && $cardtype ne "Eurocard" && $cardtype ne "American Express"
      && $cardtype ne "novus") {
    return 1;              # Mangels Informationen: Check korrekt
  }

  # Verify correct length for each card type
  if ($cardtype eq "VISA" && $length!=13 && $length!=16) { return 0;}
  if ($cardtype eq "Mastercard" && $length!=16) { return 0; }
  if ($cardtype eq "Eurocard" && $length!=16) { return 0; }
  if ($cardtype eq "American Express" && $length!=15) { return 0; }
  if ($cardtype eq "novus" && $length!=16) { return 0; }

  # Now Verify via Mod 10 for each one
  if ($cardtype eq "VISA") {
     if ($length == 13) { return &ver13; }
     if ($length == 16) { return &ver16; }
  }
  if ($cardtype eq "Mastercard") { return &ver16; }
  if ($cardtype eq "Eurocard") { return &ver16; }
  if ($cardtype eq "American Express") { return &ver15; }
  if ($cardtype eq "novus") { return &ver16; }



# For 13 digit cards
sub ver13 {
        $cc0 = substr($cardnumber,0,1);
        $cc1 = substr($cardnumber,1,1);
        $cc2 = substr($cardnumber,2,1);
        $cc3 = substr($cardnumber,3,1);
        $cc4 = substr($cardnumber,4,1);
        $cc5 = substr($cardnumber,5,1);
        $cc6 = substr($cardnumber,6,1);
        $cc7 = substr($cardnumber,7,1);
        $cc8 = substr($cardnumber,8,1);
        $cc9 = substr($cardnumber,9,1);
        $cc10 = substr($cardnumber,10,1);
        $cc11 = substr($cardnumber,11,1);
        $cc12 = substr($cardnumber,12,1);

        $cc1a = $cc1 * 2;
        $cc3a = $cc3 * 2;
        $cc5a = $cc5 * 2;
        $cc7a = $cc7 * 2;
        $cc9a = $cc9 * 2;
        $cc11a = $cc11 * 2;

        if ($cc1a >= 10) {
            $cc1b = substr($cc1a,0,1);
            $cc1c = substr($cc1a,1,1);
            $cc1 = $cc1b+$cc1c;
        } else {
            $cc1 = $cc1a;
        }
        if ($cc3a >= 10) {
            $cc3b = substr($cc3a,0,1);
            $cc3c = substr($cc3a,1,1);
            $cc3 = $cc3b+$cc3c;
        } else {
            $cc3 = $cc3a;
        }
        if ($cc5a >= 10) {
            $cc5b = substr($cc5a,0,1);
            $cc5c = substr($cc5a,1,1);
            $cc5 = $cc5b+$cc5c;
        } else {
            $cc5 = $cc5a;
        }
        if ($cc7a >= 10) {
            $cc7b = substr($cc7a,0,1);
            $cc7c = substr($cc7a,1,1);
            $cc7 = $cc7b+$cc7c;
        } else {
            $cc7 = $cc7a;
        }
        if ($cc9a >= 10) {
            $cc9b = substr($cc9a,0,1);
            $cc9c = substr($cc9a,1,1);
            $cc9 = $cc9b+$cc9c;
        } else {
            $cc9 = $cc9a;
        }
        if ($cc11a >= 10) {
            $cc11b = substr($cc11a,0,1);
            $cc11c = substr($cc11a,1,1);
            $cc11 = $cc11b+$cc11c;
        } else {
            $cc11 = $cc11a;
        }

        $val = $cc0+$cc1+$cc2+$cc3+$cc4+$cc5+$cc6+$cc7+$cc8+$cc9+$cc10+$cc11+$cc12;
        if (substr($val,1,1) !=0 ) {
            return 0;
        }
        return 1;
}

# For 16 digit cards
sub ver16 {
        $cc0 = substr($cardnumber,0,1);
        $cc1 = substr($cardnumber,1,1);
        $cc2 = substr($cardnumber,2,1);
        $cc3 = substr($cardnumber,3,1);
        $cc4 = substr($cardnumber,4,1);
        $cc5 = substr($cardnumber,5,1);
        $cc6 = substr($cardnumber,6,1);
        $cc7 = substr($cardnumber,7,1);
        $cc8 = substr($cardnumber,8,1);
        $cc9 = substr($cardnumber,9,1);
        $cc10 = substr($cardnumber,10,1);
        $cc11 = substr($cardnumber,11,1);
        $cc12 = substr($cardnumber,12,1);
        $cc13 = substr($cardnumber,13,1);
        $cc14 = substr($cardnumber,14,1);
        $cc15 = substr($cardnumber,15,1);

        $cc0a = $cc0 * 2;
        $cc2a = $cc2 * 2;
        $cc4a = $cc4 * 2;
        $cc6a = $cc6 * 2;
        $cc8a = $cc8 * 2;
        $cc10a = $cc10 * 2;
        $cc12a = $cc12 * 2;
        $cc14a = $cc14 * 2;

        if ($cc0a >= 10) {
            $cc0b = substr($cc0a,0,1);
            $cc0c = substr($cc0a,1,1);
            $cc0 = $cc0b+$cc0c;
        } else {
            $cc0 = $cc0a;
        }
        if ($cc2a >= 10) {
            $cc2b = substr($cc2a,0,1);
            $cc2c = substr($cc2a,1,1);
            $cc2 = $cc2b+$cc2c;
        } else {
            $cc2 = $cc2a;
        }
        if ($cc4a >= 10) {
            $cc4b = substr($cc4a,0,1);
            $cc4c = substr($cc4a,1,1);
            $cc4 = $cc4b+$cc4c;
        } else {
            $cc4 = $cc4a;
        }
        if ($cc6a >= 10) {
            $cc6b = substr($cc6a,0,1);
            $cc6c = substr($cc6a,1,1);
            $cc6 = $cc6b+$cc6c;
        } else {
            $cc6 = $cc6a;
        }
        if ($cc8a >= 10) {
            $cc8b = substr($cc8a,0,1);
            $cc8c = substr($cc8a,1,1);
            $cc8 = $cc8b+$cc8c;
        } else {
            $cc8 = $cc8a;
        }
        if ($cc10a >= 10) {
            $cc10b = substr($cc10a,0,1);
            $cc10c = substr($cc10a,1,1);
            $cc10 = $cc10b+$cc10c;
        } else {
            $cc10 = $cc10a;
        }
        if ($cc12a >= 10) {
            $cc12b = substr($cc12a,0,1);
            $cc12c = substr($cc12a,1,1);
            $cc12 = $cc12b+$cc12c;
        } else {
            $cc12 = $cc12a;
        }
        if ($cc14a >= 10) {
            $cc14b = substr($cc14a,0,1);
            $cc14c = substr($cc14a,1,1);
            $cc14 = $cc14b+$cc14c;
        } else {
            $cc14 = $cc14a;
        }

        $val = $cc0+$cc1+$cc2+$cc3+$cc4+$cc5+$cc6+$cc7+$cc8+$cc9+$cc10+$cc11+$cc12+$cc13+$cc14+$cc15;
        if (substr($val,1,1) !=0 ) {
            return 0;
        }
        return 1;
    }


# For 15 digit (Amex) cards
sub ver15 {
        $cc0 = substr($cardnumber,0,1);
        $cc1 = substr($cardnumber,1,1);
        $cc2 = substr($cardnumber,2,1);
        $cc3 = substr($cardnumber,3,1);
        $cc4 = substr($cardnumber,4,1);
        $cc5 = substr($cardnumber,5,1);
        $cc6 = substr($cardnumber,6,1);
        $cc7 = substr($cardnumber,7,1);
        $cc8 = substr($cardnumber,8,1);
        $cc9 = substr($cardnumber,9,1);
        $cc10 = substr($cardnumber,10,1);
        $cc11 = substr($cardnumber,11,1);
        $cc12 = substr($cardnumber,12,1);
        $cc13 = substr($cardnumber,13,1);
        $cc14 = substr($cardnumber,14,1);

        $cc1a = $cc1 * 2;
        $cc3a = $cc3 * 2;
        $cc5a = $cc5 * 2;
        $cc7a = $cc7 * 2;
        $cc9a = $cc9 * 2;
        $cc11a = $cc11 * 2;
        $cc13a = $cc13 * 2;

        if ($cc1a >= 10) {
            $cc1b = substr($cc1a,0,1);
            $cc1c = substr($cc1a,1,1);
            $cc1 = $cc1b+$cc1c;
        } else {
            $cc1 = $cc1a;
        }
        if ($cc3a >= 10) {
            $cc3b = substr($cc3a,0,1);
            $cc3c = substr($cc3a,1,1);
            $cc3 = $cc3b+$cc3c;
        } else {
            $cc3 = $cc3a;
        }
        if ($cc5a >= 10) {
            $cc5b = substr($cc5a,0,1);
            $cc5c = substr($cc5a,1,1);
            $cc5 = $cc5b+$cc5c;
        } else {
            $cc5 = $cc5a;
        }
        if ($cc7a >= 10) {
            $cc7b = substr($cc7a,0,1);
            $cc7c = substr($cc7a,1,1);
            $cc7 = $cc7b+$cc7c;
        } else {
            $cc7 = $cc7a;
        }
        if ($cc9a >= 10) {
            $cc9b = substr($cc9a,0,1);
            $cc9c = substr($cc9a,1,1);
            $cc9 = $cc9b+$cc9c;
        } else {
            $cc9 = $cc9a;
        }
        if ($cc11a >= 10) {
            $cc11b = substr($cc11a,0,1);
            $cc11c = substr($cc11a,1,1);
            $cc11 = $cc11b+$cc11c;
        } else {
            $cc11 = $cc11a;
        }
        if ($cc13a >= 10) {
            $cc13b = substr($cc13a,0,1);
            $cc13c = substr($cc13a,1,1);
            $cc13 = $cc13b+$cc13c;
        } else {
            $cc13 = $cc13a;
        }

        $val = $cc0+$cc1+$cc2+$cc3+$cc4+$cc5+$cc6+$cc7+$cc8+$cc9+$cc10+$cc11+$cc12+$cc13+$cc14;
        if (substr($val,1,1) !=0 ) {
            return 0;
        }
        return 1;
    }


}



sub get_file {
  local($filename)=@_;
  @sp=split(/\\/,$filename);
  $file=$sp[$#sp];
  return $file;
}


sub Parse_Multi {
    local($boundary,@pairs,$position);
    local($raw_data,$value,$name,$part);

    $raw_data = $buffer;
    ($boundary = $ENV{CONTENT_TYPE}) =~ s/^.*boundary=(.*)$/\1/;
    @pairs = split(/--$boundary/, $raw_data);

    @pairs = splice(@pairs,1,$#pairs-1);

    for $part (@pairs) {
      $part =~ s/[\r]\n$//g;

      ($dump, $firstline, $datas) = split(/[\r]\n/, $part, 3);

      next if $firstline =~ /filename=\"\"/;
      $firstline =~ s/^Content-Disposition: form-data; //;
      (@columns) = split(/;\s+/, $firstline);
      ($name = $columns[0]) =~ s/^name="([^"]+)"$/\1/g;

      if ($#columns > 0) {
	if ($datas =~ /^Content-Type:/) {
	  ($CGI{"$name"}->{'Content-Type'}, $blankline, $datas) = split(/[\r]\n/, $datas, 3);
          $CGI{"$name"}->{'Content-Type'} =~ s/^Content-Type: ([^\s]+)$/\1/g;
	}
	else {
	  ($blankline, $datas) = split(/[\r]\n/, $datas, 2);
	  $CGI{"$name"}->{'Content-Type'} = "application/octet-stream";
	}
      }
      else {
	($blankline, $datas) = split(/[\r]\n/, $datas, 2);
        if (grep(/^$name$/, keys(%CGI))) {
          if (@{$CGI{$name}} > 0) {
            push(@{$CGI{$name}}, $datas);
          }
          else {
            $arrvalue = $CGI{$name};
            undef $CGI{$name};
            $CGI{$name}[0] = $arrvalue;
            push(@{$CGI{$name}}, $datas);
          }
        }
        else {
	  next if $datas =~ /^\s*$/;
          $CGI{"$name"} = $datas;
        }
        next;
      }
      for $currentColumn (@columns) {
        ($currentHeader, $currentValue) = $currentColumn =~ /^([^=]+)="([^"]+)"$/;
        $CGI{"$name"}->{"$currentHeader"} = $currentValue;
      }
      $CGI{"$name"}->{'Contents'} = $datas;
    }
    return ($CGI{"UploadedFile"}->{'Contents'},$CGI{"UploadedFile"}->{'filename'});
}



sub ipv6_to_ipv4 {
  local($ip)=@_;
  @parts=split(/\:/,$ip);
  $sc=0;for ($i=0;$i<=2;$i++) {@s=split(//,$parts[$i]);foreach $s (@s) {$sc+=ord($s);}}
  $ip1=$sc%256;
  $sc=0;for ($i=1;$i<=3;$i++) {@s=split(//,$parts[$i]);foreach $s (@s) {$sc+=ord($s);}}
  $ip2=$sc%256;
  $sc=0;for ($i=2;$i<=4;$i++) {@s=split(//,$parts[$i]);foreach $s (@s) {$sc+=ord($s);}}
  $ip3=$sc%256;
  $sc=0;for ($i=3;$i<=6;$i++) {@s=split(//,$parts[$i]);foreach $s (@s) {$sc+=ord($s);}}
  $ip4=$sc%256;
  $ip="$ip1.$ip2.$ip3.$ip4";
  return $ip;
}


